Android Service与Activity之间通信使用Messenger方式
2016-04-26 16:14
507 查看
转载请标明出处:
http://blog.csdn.net/weifule_blog/article/details/51251398;
1.通过Binder对象,也就是使用绑定Service的方式
2.通过广播方式(本地广播和全局广播)
3.通过接口回调的方式
4.通过EventBus方式
由于开发中某个场景下不想使用绑定Service方式来实现Activity与Service进行通信,所以才有了使用Messenger方式来实现。
Messenger实现了IPC通信,允许实现基于消息的进程间通信的方式,内部原理也是采用了AIDL进行通信,与直接使用AIDL不同的是Messenger利用了Handler处理通信,它是线程安全的(不支持并发处理),而AIDL是非线程安全的(支持并发处理)。
2.Service部分的代码如下:
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; } }
相关文章推荐
- Android 4.4 Kitkat Phone工作流程浅析(三)__MO(去电)流程分析
- Phonegap插件编写注册与使用
- Android总结 - Fragment
- 如何在Android模拟器上访问电脑本地的Web应用
- Android studio中获取SHA1码及MD5码、及无法使用Keytool命令
- Android带渐变效果的圆角矩形Demo
- windows系统上安装与使用Android NDK r5(转)
- 3. Android框架和工具之 xUtils(DbUtils )
- Android 加载图片时根据哪个类获得的值,大致判断什么时候Out Of Memory
- 霓虹灯效果(用TextView实现)
- Android 停止调试程序
- Android studio 克隆分支
- Android应用中实现手势控制图片缩放的完全攻略
- android BitmapFactroy
- Android实现发送短信的功能
- Android学习(45) -- 自定义控件(9) 下拉刷新 (添加footer)
- Android TextView指定关键字高亮显示
- Android MVP 模式的使用
- Android 调用系统联系人界面的添加联系人,添加已有联系人,编辑和修改。
- android cts理清testpackage和文件名的对应关系