通过 Messenger实现service,可以实现两个进程直接通信。
一.创建 Service
public class MyService_message extends Service{
public static final int MSGID=1;
/** * 用于接收从客户端传递过来的数据 */ private class ServiceMessage extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSGID: Log.e("MyService_message","服务器接收客户端的消息"); Messenger messenger=msg.replyTo; try { messenger.send(Message.obtain(null,10,"服务器回传的数据10")); } catch (RemoteException e) { } break; default: super.handleMessage(msg); } } }final Messenger msg=new Messenger(new ServiceMessage()); @Override public IBinder onBind(Intent intent) { // TODO: Return the communication channel to the service. // throw new UnsupportedOperationException("Not yet implemented"); Log.e("MyService_message","onBind"); return msg.getBinder(); }}二.配置service<service android:name=".Service.MyService_message" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.example.administrator.servicetest.Service.MyService_message.action"></action> </intent-filter> </service>三.创建客户端
1.开始service
connection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { Log.e(TAG,"onServiceConnected"); msg=new Messenger(service);//获取服务器的 Messenger 对象 } @Override public void onServiceDisconnected(ComponentName name) { Log.e(TAG,"onServiceDisconnected"); msg=null; } };
//--------------------隐式调用------------------------------
Intent intent=new Intent(); intent.setAction("com.example.administrator.servicetest.Service.MyService_message.action");//android 5.0之后不支持直接隐式调用需要加下面这一行,或者把隐式转换成显示intent.setPackage(context.getPackageName());//--------------------------------------------------//-----------------------把隐式转显示-----------------------------------Intent intent=new Intent(); intent.setAction("com.example.administrator.servicetest.Service.MyService_message.action");intent=getExplicitIntent(context,intent);
//-----------------------------------------------------------context.bindService(intent,connection ,Service.BIND_AUTO_CREATE);2.停止servicecontext.unbindService(connection);
3.给服务器发送消息进行通信
Message mess=new Message(); mess.what=MyService_message.MSGID; mess.replyTo=messenger; msg.send(mess);private Messenger messenger=new Messenger(new receive()); private class receive extends Handler{ @Override public void handleMessage(Message msg) { // super.handleMessage(msg); switch (msg.what){ case 10: Log.e(TAG,"客户端接收服务器的数据:"+msg.obj); break; } } }
public static Intent getExplicitIntent(Context context, Intent implicitIntent) { // Retrieve all services that can match the given intent PackageManager pm = context.getPackageManager(); List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0); // Make sure only one match was found if (resolveInfo == null || resolveInfo.size() != 1) { return null; } // Get component info and create ComponentName ResolveInfo serviceInfo = resolveInfo.get(0); String packageName = serviceInfo.serviceInfo.packageName; String className = serviceInfo.serviceInfo.name; ComponentName component = new ComponentName(packageName, className); // Create a new intent. Use the old one for extras and such reuse Intent explicitIntent = new Intent(implicitIntent); // Set the component to be explicit explicitIntent.setComponent(component); return explicitIntent; }
}
本文介绍如何利用Messenger实现Android应用中的跨进程通信。主要内容包括:创建服务端Service并配置,客户端连接服务端及双向消息传递的具体实现。
2467

被折叠的 条评论
为什么被折叠?



