用Messenger实现Activity与Service的信息交互
来源:互联网 发布:智尚网络 培训 编辑:程序博客网 时间:2024/05/18 03:38
基于Android的框架,Activity是实现前端用户交互的基础框架,Services是实现后台无用户干预逻辑处理的基础框架,如何实现Activity与Services之间的数据交换,是作为Android程序员在开发中经常碰到的需求。
通常情况下,有三种实现技术:
1、广播交互,利用Android系统BroadCast——广播功能,实现这样在不同的Activity、Service以及应用程序之间的数据交换。
2、Messenger交互,基于Android已经实现Messenger功能,实现Activity与Services之间的数据交换。
3、AIDL交互,即本质属于自定义接口交互,其实就是基于 AIDL(Android Interface Definition Language), 即Android接口定义语言,实现Activity与Services之间的数据交换。
关于上述三种技术实现的优劣本文不做比较,我们主要讲解利于 Messenger技术,实现Activity与Service之间的数据交换。
基于Messenger技术的数据交换基本原理如下:
对此,在我们的程序中构造两个Class:MainActivity和MessageService,MainActivity获取到MessageService的消息之后,显示Activity的TextView界面上。两个对象的时序图如下
MainActivity的程序代码如下:
public class MainActivity extends Activity { //用于日志输出的名称 private static String TAG = "MessageActivity"; private TextView tv; private Messenger sMessenger; private boolean isConn; private MainActivity ma; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.tv=(TextView)this.findViewById(R.id.Service_Monitor); this.ma=this; Log.i(TAG, "----->MainActivity onCreate finished"); //启动Service Intent intent = new Intent(MainActivity.this,MessageService.class); bindService(intent,conn,Context.BIND_AUTO_CREATE); Log.i(TAG, "bindService invoked !"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } //获取服务端传递过来的消息,并显示在TextView上 private Messenger cMessenger = new Messenger(new Handler() { // 获取Service发送过来的消息进行处理 @Override public void handleMessage(Message msg) { Log.i(TAG, "----->Client processes message."); switch (msg.what) { case 0: // 此为示例,仅仅显示获取到的消息 tv.setText(tv.getText() + "\n" + msg.arg1); break; } } }); //定义Connection,作为启动Services的参数 private ServiceConnection conn=new ServiceConnection(){ @Override public void onServiceConnected(ComponentName name, IBinder service) { sMessenger = new Messenger(service); ma.isConn = true; ma.setTitle("Service is connected."); Log.i(TAG, "----->ServiceConnection isConn is true"); // 初始化发送给Service的消息,并将cMessenger传递给Service Message msg = Message.obtain(); msg.replyTo = cMessenger; msg.what = 0; try { sMessenger.send(msg); Log.i(TAG, "----->Client sent Message to Service"); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { sMessenger=null; ma.isConn=false; ma.setTitle("Service is disconnected."); Log.i(TAG, "----->ServiceConnection isConn is flase"); } };}
MessageService的程序代码如下:
public class MessageService extends Service { //用于日志输出的名称 private static String TAG = "MessageService"; //客户端Messenger private Messenger cMessenger; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub Log.i(TAG, "------>onBind"); return sMessenger.getBinder(); } // 定义Handler,重载Handler的消息处理方法 private Handler mHandler = new Handler() { // 处理消息内容的具体方法定义 @Override public void handleMessage(Message msg) { // 定义反馈给客户端的消息内容 switch (msg.what) { case 0: Message msgFromService=Message.obtain(); msgFromService.what=0; msgFromService.obj=new String("This is a DEMO of messenger."); cMessenger = msg.replyTo; try { cMessenger.send(msgFromService); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.i(TAG, "---> 获取客户端Messenger成功"); } super.handleMessage(msg); break; } }; //初始化Messenger,用于消息发送和接收 private Messenger sMessenger= new Messenger(mHandler);}
AndroidMainfest.xml 文件内容如下
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.messageExchange" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.ue.messageclient.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="com.ue.messageserver.MessageService"></service> </application></manifest>
最后执行显示结果如下:
1 0
- 用Messenger实现Activity与Service的信息交互
- 用Messenger实现与被绑定的Service交互
- android开发之使用Messenger实现service与activity交互
- Messenger实现Activity与Service的双向通信
- Activity与Service通过Messenger交互
- 通过messenger实现activity与service的相互通信
- android开发--activity与service交互之messenger
- Activity与Service间的通信:Messenger
- Activity与Service用Messenger通信
- 关于Android中Service与Activity的信息交互
- 关于Android中Service与Activity的信息交互
- 关于Android中Service与Activity的信息交互
- Messenger 实现Activity与Service通讯、进程通讯
- Android 使用messenger实现service与activity通信
- 通过bindService方法实现Activity与Service的交互
- 通过bind实现activity与service的交互
- Activity与service间的Messenger通信方式
- 使用Messenger进行Activity与Service之间的双向通信
- php页面分页类通用
- EL表达式及${对象}
- QT学习之QScript
- POJ 1995 Raising Modulo Numbers(快速幂)
- 编译PC版vlc
- 用Messenger实现Activity与Service的信息交互
- MySQL详解--锁
- 西蒙iphone-OpenGL ES 教程-07 : 对物体进行独立的转换
- opencv contours 遇到边界
- 在Windows环境下学习Linux命令行的几种方法
- StringUtil
- JavaScript应该被放在什么位置
- 无法解析的外部符号 _main解决办法
- [libevent]event_add()