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() {				@Override		public void onServiceDisconnected(ComponentName name) {			// TODO Auto-generated method stub			//当服务异常终止时会调用,注意:解除绑定服务时不会调用			System.out.println("onServiceDisconnected");			flag=false;		}				@Override		public 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);		}	};	@Override	protected 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;	@Override	public IBinder onBind(Intent intent) {		// TODO Auto-generated method stub		return new PersonImpl();	}	//创建服务时调用	@Override	public void onCreate() {		// TODO Auto-generated method stub		super.onCreate();		Log.i("HelloService", "HelloServiceOnCreate");	}	//销毁服务时调用	@Override	public void onDestroy() {		// TODO Auto-generated method stub		super.onDestroy();		Log.i("HelloService", "HelloServiceONDestory");	}	//服务执行时的操作	@Override	public int onStartCommand(Intent intent, int flags, int startId) {		// TODO Auto-generated method stub		Log.i("HelloService", "HelloServiceONStartCommand");		System.out.println("HelloServiceONStartCommand");		new Thread(new Runnable() {						@Override			public void run() {				// TODO Auto-generated method stub				int i=0;				for(;i<10;i++){					System.out.println(Thread.currentThread().getName()+":"+i);					try {						Thread.sleep(1000);					} catch (InterruptedException e) {						// TODO Auto-generated catch block						e.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;	@Override	public void setName(String name) throws RemoteException {		// TODO Auto-generated method stub		this.name=name;	}	@Override	public void setSex(String sex) throws RemoteException {		// TODO Auto-generated method stub		this.sex=sex;	}	@Override	public void setAge(int age) throws RemoteException {		// TODO Auto-generated method stub		this.age=age;	}	@Override	public String getPerson() throws RemoteException {		// TODO Auto-generated method stub		return "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会自动停止	@Override	protected void onHandleIntent(Intent intent) {		// TODO Auto-generated method stub		for(int i=0;i<10;i++){			System.out.println(Thread.currentThread().getName()+":"+i);			try {				Thread.sleep(1000);			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}	}	@Override	public void onDestroy() {		// TODO Auto-generated method stub		super.onDestroy();		System.out.println("OnDestory");	}}

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

 <service android:name="com.service.service.HelloService"></service>

 <service android:name="com.service.service.HelloIntentService"></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;	@Override	public void onCreate() {		// TODO Auto-generated method stub		super.onCreate();		System.out.println("MyServiceOnCreate()");	}	@Override	public IBinder onBind(Intent intent) {		// TODO Auto-generated method stub		System.out.println("MyServiceOnBind()");		personImpl=new PersonImpl();		return personImpl;			}	@Override	public boolean onUnbind(Intent intent) {		// TODO Auto-generated method stub		System.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;	}	@Override	public int describeContents() {		// TODO Auto-generated method stub		return 0;	}	@Override	public void writeToParcel(Parcel dest, int flags) {		// TODO Auto-generated method stub		dest.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();	}	@Override	public void setStudnet(String name, String sex) throws RemoteException {		// TODO Auto-generated method stub		this.student.setName(name);;		this.student.setSex(sex);	}	@Override	public Student getStudent() throws RemoteException {		// TODO Auto-generated method stub		return 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;	@Override	public IBinder onBind(Intent intent) {		// TODO Auto-generated method stub		studentImpl=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);	@Override	public IBinder onBind(Intent intent) {		// TODO Auto-generated method stub		return 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() {				@Override		public void onServiceDisconnected(ComponentName name) {			// TODO Auto-generated method stub			if(mBound){				mBound=false;			}		}				@Override		public void onServiceConnected(ComponentName name, IBinder service) {			// TODO Auto-generated method stub			messenger=new Messenger(service);			mBound=true;		}	};	@Override	protected void onCreate(Bundle savedInstanceState) {		// TODO Auto-generated method stub		super.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 block			e.printStackTrace();		}	}	@Override	protected void onStart() {		// TODO Auto-generated method stub		super.onStart();		Intent intent=new Intent(this,MessageService.class);		bindService(intent, conn, Context.BIND_AUTO_CREATE);	}	@Override	protected void onStop() {		// TODO Auto-generated method stub		super.onStop();		if(mBound){			unbindService(conn);			mBound=false;		}	}}

清单文件