Service练习——通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

通过Messenger(信使)来实现IPC通讯(Messenger底层使用AIDL实现)

步骤:

服务端
1、在Service中创建一个Handler对象,用于处理消息
2、在Service中创建一个Messenger对象,并绑定Handler
3、在onBind方法中通过Messenger.getBinder方法返回绑定的对象
客户端
4、通过bindService来绑定一个服务,在提供的ServiceConnection对象的onServiceConnected方法中,
通过IBinder参数来创建Messenger对象,这样客户端与服务端就使用同一个IBinder
5、客户端向服务端发送消息,通过Messenger的send方法发送一个Message对象
6、以上可实现客户端到服务端的单向通讯,如需要实现双向通讯:
(1)在客户端再创建一个Messenger对象,并绑定一个Handler来处理消息
(2)在向服务端发送消息对象(Message)时,使用replyTo属性指定服务端可向客户端回复消息的Messenger对象,
这样,服务端就可以利用replyTo向客户端发送消息。

新建一个服务端(Service)

 1 package com.example.service_messenges;
 2 
 3 import android.annotation.SuppressLint;
 4 import android.app.Service;
 5 import android.content.Intent;
 6 import android.os.Handler;
 7 import android.os.IBinder;
 8 import android.os.Message;
 9 import android.os.Messenger;
10 import android.os.RemoteException;
11 import android.widget.Toast;
12 
13 public class MessengesService extends Service {
14 
15     public static final int SAY_MSG = 0x1;
16     // 创建一个信使对象,并绑定信使处理器,由信使处理器来处理
17     private Messenger m = new Messenger(new InComingHandler());
18 
19     // 用来操作msg的handler
20     @SuppressLint("HandlerLeak")
21     class InComingHandler extends Handler {
22 
23         @Override
24         public void handleMessage(Message msg) {
25             super.handleMessage(msg);
26             switch (msg.what) {
27             case SAY_MSG:
28                 String name = msg.obj.toString();
29                 Toast.makeText(MessengesService.this, "我是" + name + ",我为自己带盐",
30                         Toast.LENGTH_SHORT).show();
31                 // 当我需要返回一个值的时候就再写一个信件给信使
32 
33                 Message m = Message.obtain();
34                 m.what = SAY_MSG;
35                 m.obj = "我是" + name + ",我为自己带盐";
36                 try {
37                     msg.replyTo.send(m);
38                 } catch (RemoteException e) {
39                     // TODO Auto-generated catch block
40                     e.printStackTrace();
41                 }
42                 break;
43 
44             default:
45                 break;
46             }
47 
48         }
49 
50     }
51 
52     // 绑定m
53     @Override
54     public IBinder onBind(Intent arg0) {
55         return m.getBinder();
56     }
57 
58 }

 

然后在清单文件中进行注册

1  <service android:name="com.example.service_messenges.MessengesService"></service>

 

接着在客户端中

 1 package com.example.service_messenges;
 2 
 3 import android.os.Bundle;
 4 import android.os.Handler;
 5 import android.os.IBinder;
 6 import android.os.Message;
 7 import android.os.Messenger;
 8 import android.os.RemoteException;
 9 import android.app.Activity;
10 import android.content.ComponentName;
11 import android.content.Context;
12 import android.content.Intent;
13 import android.content.ServiceConnection;
14 import android.view.View;
15 import android.widget.EditText;
16 import android.widget.Toast;
17 
18 public class MainActivity extends Activity {
19 
20     private Messenger m;
21     private boolean mBound = false;
22     private EditText et;
23 
24     @Override
25     protected void onCreate(Bundle savedInstanceState) {
26         super.onCreate(savedInstanceState);
27         setContentView(R.layout.activity_main);
28         et = (EditText) findViewById(R.id.editText1);
29     }
30     private Handler handler=new Handler(){
31         public void handleMessage(Message msg){
32             switch (msg.what) {
33             case MessengesService.SAY_MSG:
34                 String info="这是传递来的→"+msg.obj.toString();
35                 Toast.makeText(MainActivity.this, info,Toast.LENGTH_SHORT).show();
36                 break;
37             default:
38                 break;
39             }
40         };
41     };
42     private Messenger mReplyTo = new Messenger(handler);
43 
44     public void msgClick(View v) {
45         // 这样的效率高
46         Message msg = Message.obtain();
47         msg.what = MessengesService.SAY_MSG;
48         String name = et.getText().toString();
49         msg.obj = name;
50         msg.replyTo=mReplyTo;
51         try {
52             m.send(msg);
53         } catch (RemoteException e) {
54             e.printStackTrace();
55         }
56 
57     }
58 
59     private ServiceConnection conn = new ServiceConnection() {
60 
61         @Override
62         public void onServiceDisconnected(ComponentName arg0) {
63             // 这里是失败了
64             mBound = false;
65             m = null;
66         }
67 
68         @Override
69         public void onServiceConnected(ComponentName arg0, IBinder arg1) {
70             // 这里是成功了
71 
72             m = new Messenger(arg1);
73         }
74     };
75 
76     @Override
77     protected void onStart() {
78         super.onStart();
79 
80         Intent intent = new Intent(this, MessengesService.class);
81         bindService(intent, conn, Context.BIND_AUTO_CREATE);
82         mBound = true;
83     }
84 
85     @Override
86     protected void onStop() {
87         super.onStop();
88 
89         if (mBound) {
90             mBound = false;
91             unbindService(conn);
92         }
93     }
94 
95 }

总结:Service是一个应用程序组件,可以长时间在后台运行,不提供用户界面

   通过绑定(bind)一个服务来实现进程间的通讯(IPC通讯)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值