package com.service.service;import com.example.service.R;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.view.View;import android.widget.Toast;/** * service组件 * 1.定义一个类继承Service类 * Service两种启动方式 * <1>.start * <2>.onBind * 服务对象同时只有一个 * 默认情况下,一个started的service与启动它的应用组件在同一线程中, * 所以如果我们使用service来完成一些好使的操作任务时,就会阻塞主线程 * 那我们就必须在线程中来处理耗时任务 * 停止一个服务的两种方法 * <1>.在外部使用stopService() * <2>.在服务类内部使用stopSelf() *  * IntentService * 该类型的service会在单独的线程中执行任务,任务完成后会自动结束service * 当我们有需要这样一次性完成的任务就可以使用IntentService来完成 *  *  *  * IPC(进程间的通讯) * AIDL(android接口定义语言) * 使用aidl定义业务接口,通过ADT工具来生成一个java类,此类实现了进程间远程通讯的代理 * 编写自己的业务类(继承生成的类中的stub存根)来实现业务接口 * 再通过绑定service的方式来暴露此业务对象给其他组件提供功能 *  * 调用者组件通过servuce方法绑定服务,从而可以获取绑定成功后的远程业务对象或本地对象 * 可以调用相关的功能 * 注意:一般在使用完绑定服务后,需要解除绑定 *  * 自定义AIDL对象 * 1.需要自自定义的类型上实现Parcelable接口 * 2.需要定义一个aidl文件来申明自定义类型(在student。aidl文件中申明 parcelable Student;) * 3.在使用该自定义类型时必须使用import语句导入该自定义类型,否则报错 *  *  *  * 使用started与bing服务之间的区别 * 使用started会一直运行在后台,需要服务本身或外部组件停止服务才会结束运行 * 通过bind的服务,它的生命周期依赖绑定的组件, * 1.started服务可以给启动的对象传递参数,但无法获取服务中的方法返回 * 2.可以给启动的服务对象传递参数,也可以通过绑定的业务对象获取返回结果 * 在实际应用中的使用技巧 * 1.第一次先使用started来启动一个服务, * 之后可以使用绑定的方式绑定服务,从而可以直接调用业务方法返回值 * */public class MainActivity extends Activity {private IPerson person;    //要使用的业务对象接口boolean flag=false;//服务连接对象private ServiceConnection serviceConnection=new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub//当服务异常终止时会调用,注意:解除绑定服务时不会调用System.out.println("onServiceDisconnected");flag=false;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stub//绑定成功后服务会回调该方法,自动传入IBinder对象System.out.println("onServiceConnected");person= IPerson.Stub.asInterface(service);System.out.println(person);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/** * 启动一个服务 * */public void start1(View view){System.out.println("start1");Intent intent=new Intent(this,HelloService.class);startService(intent);}public void stop(View view){System.out.println("stop");Intent intent=new Intent(this,HelloService.class);stopService(intent);}public void start2(View view){Intent intent=new Intent(this,HelloIntentService.class);startService(intent);}//绑定一个服务public void bindService(View view){System.out.println("bindService");Intent intent=new Intent(this,MyService.class);//参数(1.intent对象,2.服务连接对象,3.绑定服务的标记)flag=bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);}//解除绑定服务public void unBindService(View view){if(flag){unbindService(serviceConnection);flag=false;}}//调用远程业务对象方法(或是本地业务)public void callPerson(View view) throws RemoteException{person.setName("张三");person.setAge(21);person.setSex("男");String s=person.getPerson();Toast.makeText(MainActivity.this, s, Toast.LENGTH_SHORT).show();}

activity_main.xml

                                                     

HelloService

package com.service.service;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.util.Log;public class HelloService extends Service{private PersonImpl personImpl;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn new PersonImpl();}//创建服务时调用@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();Log.i("HelloService", "HelloServiceOnCreate");}//销毁服务时调用@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();Log.i("HelloService", "HelloServiceONDestory");}//服务执行时的操作@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubLog.i("HelloService", "HelloServiceONStartCommand");System.out.println("HelloServiceONStartCommand");new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubint i=0;for(;i<10;i++){System.out.println(Thread.currentThread().getName()+":"+i);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//HelloService.this.stopSelf(); //停止服务}}).start();return super.onStartCommand(intent, flags, startId);}}

IPerson.aidl文件

package com.service.service;interface IPerson {void setName(String name);void setSex(String sex);void setAge(int age);String getPerson();}

PersonImpl

package com.service.service;import android.os.RemoteException;public class PersonImpl extends IPerson.Stub {private String name;private String sex;private int age;@Overridepublic void setName(String name) throws RemoteException {// TODO Auto-generated method stubthis.name=name;}@Overridepublic void setSex(String sex) throws RemoteException {// TODO Auto-generated method stubthis.sex=sex;}@Overridepublic void setAge(int age) throws RemoteException {// TODO Auto-generated method stubthis.age=age;}@Overridepublic String getPerson() throws RemoteException {// TODO Auto-generated method stubreturn "name="+name+"sex="+sex+"age="+age;}}

第二种:继承IntentService

HelloIntentService

package com.service.service;import android.app.IntentService;import android.content.Intent;public class HelloIntentService extends IntentService{public HelloIntentService() {super("IntentSerice");// TODO Auto-generated constructor stub}//该方法会在一个单独的线程中执行,来完成工作任务//任务结束后,该service会自动停止@Overrideprotected void onHandleIntent(Intent intent) {// TODO Auto-generated method stubfor(int i=0;i<10;i++){System.out.println(Thread.currentThread().getName()+":"+i);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();System.out.println("OnDestory");}}

所有的service需要在清单文件中申明

 

 


使用onBind方式

package com.service.service;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;/** * 实现一个绑定服务 *  * */public class MyService extends Service{private PersonImpl personImpl;@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();System.out.println("MyServiceOnCreate()");}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubSystem.out.println("MyServiceOnBind()");personImpl=new PersonImpl();return personImpl;}@Overridepublic boolean onUnbind(Intent intent) {// TODO Auto-generated method stubSystem.out.println("MyServiceOnUnBind()");return super.onUnbind(intent);}}


自定义AIDL

IStudent.aidl

package com.service.service;import com.service.service.Student;interface IStudent {void setStudnet(String name,String sex);Student getStudent();}

Student.aidl

parcelable Student;

Student

package com.service.service;import android.os.Parcel;import android.os.Parcelable;public class Student implements Parcelable{private String name;private String sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic int describeContents() {// TODO Auto-generated method stubreturn 0;}@Overridepublic void writeToParcel(Parcel dest, int flags) {// TODO Auto-generated method stubdest.writeString("name");dest.writeString("sex");} public static final Parcelable.Creator CREATOR     = new Parcelable.Creator() { public Student createFromParcel(Parcel in) { Student student=new Student(); student.setName(in.readString()); student.setSex(in.readString());     return student; } public Student[] newArray(int size) {     return new Student[size]; }};}

StudentImpl

package com.service.service;import android.os.RemoteException;/** * 业务对象的实现 * */public class StudentImpl extends IStudent.Stub{private Student student;public StudentImpl(){student=new Student();}@Overridepublic void setStudnet(String name, String sex) throws RemoteException {// TODO Auto-generated method stubthis.student.setName(name);;this.student.setSex(sex);}@Overridepublic Student getStudent() throws RemoteException {// TODO Auto-generated method stubreturn student;}}

StudentService

package com.service.service;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class StudentService extends Service{private StudentImpl studentImpl;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubstudentImpl=new StudentImpl();return studentImpl;}}

使用Messenge

MessageService

package com.service.service;import android.app.Service;import android.content.Intent;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.widget.Toast;public class MessageService extends Service{    static final int MSG_HELLO=0x1;private Handler handler=new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case MSG_HELLO:Toast.makeText(MessageService.this, "hello", Toast.LENGTH_SHORT).show();break;default:break;}};};private Messenger messenger=new Messenger(handler);@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn messenger.getBinder();}}

MessageActivity

package com.service.service;import com.example.service.R;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.view.View;/** * 使用Messenger实现IPC, * 1.Messenger是线程安全的,在service中创建一个Messenger对象并绑定一个handle * 2.在onBind方法中返回messenger对象,通过messenger的getIBinder方法返回一个IBinder对象 * 3.在调用的组件中,ServiceConnection的onServiceConnection时间中,根据IBinder对象来创建一个Messenger对象 * 这样两个Messenger对象就同事绑定到一个IBinder对象上,从而可以底线通信, * 在调用组件中方法种使用Messenger的send方法来发送消息到service的Messenger对象中 * */public class MessageActivity extends Activity{private Messenger messenger;private boolean mBound=false;private ServiceConnection conn=new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubif(mBound){mBound=false;}}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubmessenger=new Messenger(service);mBound=true;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.message_main);}public void useMessenger(View view){Message message=Message.obtain();message.what=MessageService.MSG_HELLO;try {messenger.send(message);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overrideprotected void onStart() {// TODO Auto-generated method stubsuper.onStart();Intent intent=new Intent(this,MessageService.class);bindService(intent, conn, Context.BIND_AUTO_CREATE);}@Overrideprotected void onStop() {// TODO Auto-generated method stubsuper.onStop();if(mBound){unbindService(conn);mBound=false;}}}

清单文件

<?xml version="1.0" encoding="utf-8"?>                                                                                                                          


更多相关文章

  1. Android根据上下文对象Context找到对应的Activity
  2. Android解析json数组对象
  3. Android中的Parcel机制 实现Bundle传递对象
  4. android绑定服务方法使用
  5. Android官方架构组件DataBinding双向绑定篇: 观察者模式的殊途同
  6. Android 多线程之synchronized锁住的是代码还是对象(二)
  7. Android Handler机制5之Message简介与消息对象对象池
  8. Android 对象序列化之你不知道的 Serializable
  9. Android 对象序列化之 Parcelable 取代 Serializable ?

随机推荐

  1. IDEA Android(安卓)studio toString() 生
  2. android:largestWidthLimitDp
  3. SDK/ADT历史版本
  4. android 禁止横竖版切换
  5. android 通过资源文件名称获取资源文件id
  6. Android(安卓)改变AlertDialog的大小
  7. Android(安卓)Gradle 基础认识
  8. android ndk 入门实践
  9. LocationManager Android自动定位使用以
  10. 利用Android的Log 演示一个activity的生