博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中Messenger的使用
阅读量:7063 次
发布时间:2019-06-28

本文共 2960 字,大约阅读时间需要 9 分钟。

hot3.png

我们使用Handler都是在一个进程中使用的,如何跨进程使用Handler?

其实这个问题不难解决,自己动手对binder进行一些封装就可以简单实现。但是当你看系统源码,就会发现,其实这些android都已经为我们做好了。

使用android系统的android.os.Messenger可以很方便的跨进程使用Handler。下面是示例程序。

首先是服务端。

public class MessengerTestService extends Service {     protected static final String TAG = "MessengerTestService";         private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {            case 1:                Log.d(TAG, "收到消息");                 //获取客户端message中的Messenger,用于回调                final Messenger callback = msg.replyTo;                try {                    // 回调                    callback.send(Message.obtain(null, 0));                } catch (RemoteException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                break;            }        }    };         @Override    public IBinder onBind(Intent intent) {        return new Messenger(mHandler).getBinder();    } }

然后是客户端

public class MainActivity extends Activity {     protected static final String TAG = "MainActivity";    Messenger messenger;    Messenger reply;         @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        reply = new Messenger(handler);        Intent intent = new Intent();        intent.setClassName("test.messenger", "test.messenger.MessengerTestService");                 // 绑定服务        bindService(intent, new ServiceConnection() {                         @Override            public void onServiceDisconnected(ComponentName name) {                             }                         @Override            public void onServiceConnected(ComponentName name, IBinder service) {                Toast.makeText(MainActivity.this, "bind success", 0).show();                messenger = new Messenger(service);            }        }, Context.BIND_AUTO_CREATE);             }     public void sendMessage(View v) {        Message msg = Message.obtain(null, 1);        // 设置回调用的Messenger        msg.replyTo = reply;        try {            messenger.send(msg);        } catch (RemoteException e) {            e.printStackTrace();        }    }         private Handler handler = new Handler() {         @Override        public void handleMessage(Message msg) {            Log.d(TAG, "回调成功");        }             };}


客户端绑定服务端,获取远程Messenger的binder对象。调用Messenger的send函数,就可以吧Message发送至服务端的Handler。

同时,如果需要服务端回调客户端(往客户端的Handler发消息),则可以在send的Message中设置replyTo,服务端就可以往客户端发送消息了。

下面我们看下Messenger的源码,还是很简单的。

构造函数

    public Messenger(Handler target) {        mTarget = target.getIMessenger();      }

Handler.getIMessenger()返回的是一个IMessenger的binder对象,它的send方法将会调用Handler的sendMessage方法。

    public void send(Message message) throws RemoteException {        mTarget.send(message);    }

064506_pQWN_262208.png

转载于:https://my.oschina.net/u/262208/blog/378249

你可能感兴趣的文章
企业级监控 Zabbix 的安装与使用
查看>>
nginx 和apache 性能测试对比
查看>>
oc 内存管理初级
查看>>
五、万无一失:网站的高可用架构
查看>>
二叉搜索树的第K个结点
查看>>
SVN使用教程之-分支/标记 合并 subeclipse
查看>>
oracle常用操作语句
查看>>
VRRP和HSRP
查看>>
Nginx 400错误研究
查看>>
css笔记04
查看>>
swagger-bootstrap-ui使用
查看>>
c语言:在屏幕上打印杨辉三角。
查看>>
Redis 安装及配置
查看>>
OpenSSL学习(二十一):基础-指令s_server
查看>>
PKI的逻辑思想
查看>>
OpenCV for Mac 编译 CMake Error at cmake/OpenCVUtils.cmake:42 (if):
查看>>
简易定制 Debian 软件仓库
查看>>
如何安装 gearmand 及对应的 php 扩展
查看>>
cocos2d-x引擎库binary版本制作(Windows环境)
查看>>
MongoDB副本集搭建
查看>>