Android Service与Activity之间通信使用Messenger方式
来源:互联网 发布:阿里云解析教程 编辑:程序博客网 时间:2024/04/20 13:26
转载请标明出处:
http://blog.csdn.net/weifule_blog/article/details/51251398;
一、概述
在开发中经常遇到Activity和Service通信的场景。Activity主要用来展示界面,Service负责长期执行的任务。在Service中执行任务时候需要更新Activity的UI界面,在网上看了很多篇相关文章,主要有以下几种方式:
1.通过Binder对象,也就是使用绑定Service的方式
2.通过广播方式(本地广播和全局广播)
3.通过接口回调的方式
4.通过EventBus方式
由于开发中某个场景下不想使用绑定Service方式来实现Activity与Service进行通信,所以才有了使用Messenger方式来实现。
Messenger实现了IPC通信,允许实现基于消息的进程间通信的方式,内部原理也是采用了AIDL进行通信,与直接使用AIDL不同的是Messenger利用了Handler处理通信,它是线程安全的(不支持并发处理),而AIDL是非线程安全的(支持并发处理)。
二、通信实例
1.Activity部分的代码如下:
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.os.Messenger;import android.util.Log;public class MainActivity extends Activity { private static final String TAG = "MainActivity"; public static final int MSG_SERVICE = 0; private TestService mTestService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent startServiceIntent = new Intent(this, TestService.class); startServiceIntent.putExtra("messenger", new Messenger(mHandler)); startService(startServiceIntent); } Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SERVICE: Log.d(TAG, TAG + " handleMessage MSG_SERVICE "); mTestService = (TestService) msg.obj; mTestService.setUiCallback(MainActivity.this); } } };}
2.Service部分的代码如下:
import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.util.Log;public class TestService extends Service { private static final String TAG = "TestService"; private MainActivity mActivity; @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Messenger callback = intent.getParcelableExtra("messenger"); Message m = Message.obtain(); m.what = MainActivity.MSG_SERVICE; m.obj = this; try { callback.send(m); } catch (RemoteException e) { Log.e(TAG, " onStartCommand RemoteException " + e.getMessage()); } return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); } @Override public IBinder onBind(Intent intent) { return null; } public void setUiCallback(MainActivity activity) { Log.d(TAG, TAG + " setUiCallback"); mActivity = activity; }}
0 0
- Android Service与Activity之间通信使用Messenger方式
- Android Service与Activity之间通信方式
- Android 使用messenger实现service与activity通信
- Activity与Service跨进程通信(Messenger方式)
- Activity与service间的Messenger通信方式
- Service与Activity通信方式之Messenger(信使)
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- Android Service与Activity之间通信的几种方式
- 线程安全知识
- 什么牌子的视频会议系统好?
- multer中间件上传文件
- PHP/Java Bridge:PHP extend继承Java的interface,Java的interface直接在PHP实现
- 基于angularjs的瀑布流插件angular-waterfull.js
- Android Service与Activity之间通信使用Messenger方式
- Unity3d 和 3dmax轴向问题以及快速解决方案
- 虚函数调用
- Linux中的15个‘echo’ 命令实例
- Java transient关键字使用小记
- UVALive - 3902 Network 无根树转为有跟树+搜索+贪心
- xapp1052之dma_test.v
- redis集群搭建手册
- 对于三星手机的手工root方法