IPC-进程间通信(一)Messager
来源:互联网 发布:itunes软件下载 编辑:程序博客网 时间:2024/05/16 09:50
直奔主题!
服务端 :这里用一个service模拟一个进程(用两个apk也行)
- 创建一个service(服务端)
public class WolfService extends Service {}
- 在service内部创建一个handler
private final static Handler handler = new Handler() {}
- 创建一个Messager,并把handler放入其中
private final static Messenger messenger = new Messenger(handler);
- 重写onbind方法,返回messager里的binder
@Nullable @Override public IBinder onBind(Intent intent) { //返回messager里的bindler return messenger.getBinder(); }
- 服务端完整代码:WolfService.java
public class WolfService extends Service { private static final int MSG_SUM = 0x110; private final static Handler handler = new Handler() { @Override public void handleMessage(Message msgfromClient) { Message msgToClient = Message.obtain(msgfromClient);//返回给客户端的消息 switch (msgfromClient.what) { //msg 客户端传来的消息 case MSG_SUM: msgToClient.what = MSG_SUM; try { //模拟耗时 Thread.sleep(2000); msgToClient.arg2 = msgfromClient.arg1 + msgfromClient.arg2; //replyTo是关键代码(把消息返还给客户端) msgfromClient.replyTo.send(msgToClient); } catch (Exception e) { e.printStackTrace(); } break; } super.handleMessage(msgfromClient); } }; /** * 把handler传入Messager中 */ private final static Messenger messenger = new Messenger(handler); @Nullable @Override public IBinder onBind(Intent intent) { //返回messager里的bindler return messenger.getBinder(); }}
- 清单文件中配置
<service android:name="wolf.ipc_messager.server.WolfService" android:process=":wolf6666"> <intent-filter> <action android:name="wolf.wolf"></action> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
-运行程序 确认程序是否是两个进程
//清单文件配置的这个属性,就是说明这个service作为一个进程存在android:process=":wolf6666"
客户端
- 第一步就是绑定服务
Intent intent= new Intent(MainActivity.this, WolfService.class); intent.setAction("wolf.wolf"); connection = new WolfServiceConnection(); bindService(intent, connection, Context.BIND_AUTO_CREATE);
注意:不要忘了在ondestroy解绑
unbindService(connection);
- 写一个内部类实现ServiceConnection
class WolfServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { //其实在这里已经可以想服务端发送消息了 } @Override public void onServiceDisconnected(ComponentName name) { }}
到这一步其实已经可以想服务端发送消息实现通信了,但这样只是单向通信,我们需要的是双向通信,所以在客户端也需要一个handler和messager
- 创建handler和messager,并把handler放入messager
private Messenger mMessenger = new Messenger(new Handler() { @Override public void handleMessage(Message msgFromServer) { super.handleMessage(msgFromServer); } });
- 客户端完整代码:Mainactivity.java
public class MainActivity extends AppCompatActivity { private Button btn1; private WolfServiceConnection connection; private TextView tv; private TextView tv2; private Messenger mService; class WolfServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = new Messenger(service); tv2.setText("连接成功"); } @Override public void onServiceDisconnected(ComponentName name) { mService = null; tv2.setText("disconnected!"); } } private int i; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绑定服务 Intent intent = new Intent(MainActivity.this, WolfService.class); intent.setAction("wolf.wolf"); connection = new WolfServiceConnection(); bindService(intent, connection, Context.BIND_AUTO_CREATE); btn1 = (Button) findViewById(R.id.button); tv = (TextView) findViewById(R.id.textView); tv2 = (TextView) findViewById(R.id.textView2); btn1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //这里再点击事件中发送消息 int a = i++; int b = (int) (Math.random() * 100); tv.setText(" messager: "+a + " + " + b + " ="); try { Message msgFromClient = Message.obtain(null, MSG_SUM,a,b); msgFromClient.replyTo = mMessenger; mService.send(msgFromClient); } catch (Exception e) { e.printStackTrace(); } } }); } private static final int MSG_SUM = 0x110; private Messenger mMessenger = new Messenger(new Handler() { @Override public void handleMessage(Message msgFromServer) { switch (msgFromServer.what) { case MSG_SUM: tv.setText(tv.getText() + "=>" + msgFromServer.arg2); break; } super.handleMessage(msgFromServer); } }); @Override protected void onDestroy() { super.onDestroy(); unbindService(connection); }}
- 效果图
demo:http://download.csdn.net/detail/qq_34501274/9813323
0 0
- IPC-进程间通信(一)Messager
- Android IPC进程通信 Messager方式
- Android IPC进程通信之Messager方式
- 进程间通信messager
- android 进程间通信(Messager)
- Android IPC进程通信——Messager方式
- Android IPC进程通信——Messager方式
- Android IPC进程通信——Messager方式
- Android IPC进程通信——Messager方式
- Android IPC进程通信——Messager方式
- Android IPC进程通信——Messager方式
- 进程间通信(IPC)
- 进程间通信(IPC)
- 进程间通信(IPC)
- 进程间通信(IPC)
- 进程间通信(IPC)
- 《进程间通信(IPC)》
- 进程间通信(IPC)
- HTTP Status 500
- @RequestMapping 用法详解之地址映射
- Marp--程序员的专属PPT
- 巧用border属性兼容ie8圆角问题
- Codeforces Round #408 (Div. 2) B.Find The Bone(模拟)
- IPC-进程间通信(一)Messager
- 使用XHProf查找PHP性能瓶颈
- SQL 执行计划的理解
- 我的笔记 接口
- js 值和类型
- jQuery记住密码
- 我的笔记 异常处理try{} catch(Exception e){} throws Exception
- ios 为APP设置App Store中的兼容性问题
- KWP2000协议:协议应用及实例分析