Android service通信

Android中的service通信可以通过context.bildService()方法,获取service实例来对其进行访问,具体做法如下;

首先在Activity内部实现ServiceConnection

private ServiceConnection conn=new ServiceConnection(){

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			mservice = ((MyService.MyBinder)service).getService();
			//得到了服务类对象就可以使用服务对象提供的方法了。但不可以在onCreate()方法里使用此对象,因为还没有初始化。
			
			mservice.dealData();
			Log.e("SERVICE", "connection success");
			Toast.makeText(ServiceDeamoActivity.this, "connection success", Toast.LENGTH_LONG).show();
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			mservice=null;
			Log.e("SERVICE", "discon");
			Toast.makeText(ServiceDeamoActivity.this, "connection failure", Toast.LENGTH_LONG).show();
		}
    };

 onCreate()

bindService(new Intent(TaskService.ACTION_SERVICE),mConnection, Context.BIND_AUTO_CREATE);

MyService类;

public class MyService extends Service {

	private Binder mbinder = new MyBinder();
	
	@Override
	public IBinder onBind(Intent intent) {	
		Toast.makeText(MyService.this, "onBind......", Toast.LENGTH_LONG).show();
		return mbinder;
	}
	
	class MyBinder extends Binder{
        public MyService getService(){
            return MyService.this;
        }
	}
	
	void dealData(){
		Log.e("msg", "service deal");
	}
		
}

2,使用实现接口的service

public class MyService extends Service {

	private IBinder buider=new MyBinder();
	
	@Override
	public IBinder onBind(Intent intent) {
		return buider;
	}

	public String query(){
		return "hello connection";
	}
	
	private class MyBinder extends Binder implements IStudent{

		@Override
		public String queryStudent() {
			return query();
		}
	}
}

接口IStudent类

public interface IStudent {
	String queryStudent();
}


3,通过Messenger发送消息实现

public class ServiceMessage extends Service{
	public  final static int  MSG_HELLO=1;
	// Handler实现消息的处理
	 class MyHandler extends Handler{
		public void handleMessage(Message msg) {
			switch(msg.what)
			{
			case  MSG_HELLO:
				Toast.makeText(getApplicationContext(), "get the messag", 1000).show();
				break;
			default:
				Toast.makeText(getApplicationContext(), "default  messag", 1000).show();
				break;
			}
		}
	 }
	 //创建Messenger类,与Handler绑定
	 private final Messenger  myMessager = new Messenger (new MyHandler());
	//绑定
	public IBinder onBind(Intent arg0) {
		Toast.makeText(getApplicationContext(), "onBind", Toast.LENGTH_SHORT).show();
		return myMessager.getBinder();
	}
	
}

ServiceConnection建立连接

 private ServiceConnection connection=new ServiceConnection(){
    
		public void onServiceConnected(ComponentName name, IBinder service) {
			
			Toast.makeText(mContext, "onServiceConnected ", 1000).show();
			messenger=new Messenger(service);
		}
		public void onServiceDisconnected(ComponentName name) {
			
			messenger=null;
		}
    };

 发送消息,这是一种通过发送不同的消息来对事件进行相应的处理。

Message msg=Message.obtain(null, ServiceMessage.MSG_HELLO, 0, 0);
			try {
				messenger.send(msg);
			} catch (RemoteException e) {
				e.printStackTrace();
			}

4,利用service生命周期,通过调用startService(intent),在onStartCommand()内接收intent不同参数执行不同命令

在此方法内可以通过获取不同的action来执行不同的方法,

@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
		if(intent!=null){
			if("action1".equals(intent.getAction())){}
			else if("action2".equals(intent.getAction())){}
			else{}
		}
        return super.onStartCommand(intent, flags, startId);
    }

方法四;使用内部广播机制。

原文地址:https://www.cnblogs.com/happyxiaoyu02/p/6818983.html