应用之间的通讯

    在上一篇博文《关于Looper的使用》中提到如何在任意2个线程中进行通讯,今天我就讲解下如何在2个应用之间进行通讯。
    首先,你需要创建一个应用aProcess来发送信息,我这里向bProcess应用请求获取随机数。
public class aProcessActivity extends Activity {
    Button btnBind,btnUnbind;
    private Messenger aMessenger;     //应用a的信使
    private Messenger bMessenger;     //应用b的信使
    private final int GetRandom = 1;        //请求随机数的消息标识
    private final int ResponseToRandom = 2;  //响应随机数的消息标识
    private boolean isBound = false;        //是否已绑定进程B的服务的标识
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnBind=(Button) findViewById(R.id.btnBind);
        btnBind.setOnClickListener(new OnClickListener(){
               public void onClick(View v) {    
                    Intent intent = new Intent("com.sunyard.bprocess.bMessengerService");//应用bprocess的包名+类名
                /*intent必须与进程B中service的action完全对应,否则无法绑定进程B的服务
                <service android:name=".bMessengerService">
                    <intent-filter> 
                        <action android:name="com.sunyard.bprocess.bMessengerService" /> 
                    </intent-filter>            
                </service>
                */
                    isBound = true;
                    bindService(intent, connection, BIND_AUTO_CREATE);   //绑定进程B的服务
               }});
        btnUnbind=(Button) findViewById(R.id.btnUnbind);
        btnUnbind.setOnClickListener(new OnClickListener(){
               public void onClick(View v) {    
                    if(isBound)
                        unbindService(connection);//如果已经绑定(isBound=true),解除绑定。                    
                    isBound = false;
               }});
        aMessenger = new Messenger(aHandler);    //创建自己的信使Messenger对象
    }
    private Handler aHandler = new Handler() {  
        public void handleMessage(Message msg) {
            switch (msg.what) {  
            case ResponseToRandom:  
                 Log.e("aProcess","从进程B中取回随机数:" + msg.arg1);
                 Toast.makeText(aProcessActivity.this, "从进程B中取回随机数:" + msg.arg1, Toast.LENGTH_SHORT).show();
                 break;
            }     
        }  
    };  
    //android系统成功绑定服务后,自动调用该回调函数
    private ServiceConnection connection = new ServiceConnection() {  
        public void onServiceConnected(ComponentName name, IBinder service) {     
             bMessenger = new Messenger(service);   //获得进程B的信使Messenger            
            sendMessage();  
        }  
        public void onServiceDisconnected(ComponentName name) {    
             bMessenger = null;  
        }  
    };
    private void sendMessage() {   
        Message message = Message.obtain(null,GetRandom);  
        message.replyTo = aMessenger;// 设置返回的信使是aMessenger
        try {  
             bMessenger.send(message);  
        } catch (RemoteException e) {    
            e.printStackTrace();  
        }  
    }
    public void onDestroy()
    {
         if(isBound)
              unbindService(connection);
         super.onDestroy();
    }
}



通过绑定的服务,向aProcess应用发送信息。

创建aProcess应用接收并且处理信息
public class bMessengerService extends Service
{
     private Handler bHandler;
     private Messenger   bMessenger;       //进程B自己的信使
     private Messenger   aMessenger;       //进程A的信使
     private Random random = new Random(); //实例化随机数对象
    private final int GetRandom = 1;          //请求随机数的消息标识
    private final int ResponseToRandom = 2;    //响应随机数的消息标识
    public void onCreate()
    {
         bHandler = new Handler()              //首先创建handler对象,用于处理收到的来自其他进程的消息
         {                
            @Override 
            public void handleMessage(Message msg)
            {  
                switch (msg.what) { 
                case GetRandom:   //当收到其他进程请求随机数的消息时,生成一个随机数,返回至发起请求的进程
                    try
                    {
                         Log.e("bProcess", "进程B收到进程A的请求");
                        Message message = Message.obtain(null,ResponseToRandom);   //响应随机数的消息标识Response2Random
                        message.arg1 = random.nextInt(100);  
                        aMessenger = msg.replyTo; //得到进程A的信使对象    
                        aMessenger.send(message); //利用进程A的信使对象向进程A发送消息
                    } catch (RemoteException e)
                    {  
                        e.printStackTrace();  
                    }  
                    break;    
                }  
            }  
        };
        bMessenger = new Messenger(bHandler);     //创建自己的信使Messenger对象
    }
    @Override 
    public IBinder onBind(Intent intent) {    
        Log.i("bProcess", "onBind");  
        //返回自己信使的binder,以供其他进程通过这个binder得到本进程的信使对象 
        return bMessenger.getBinder();  
    }      
    @Override 
    public void onDestroy() {    
        Log.i("bProcess", "onDestroy");  
        aMessenger = null;  
        super.onDestroy();  
    }  
    public boolean onUnbind(Intent intent) {   
        Log.i("bProcess", "onUnbind");  
        return super.onUnbind(intent);  
    }  
} 

通过创建handler对象,处理收到的来自其他进程的消息,然后向其他进程返回结果。

显示结果如下:

点击bindService按钮


    有积分链接:http://download.csdn.net/detail/jhg19900321/4564072

    无积分链接:https://code.google.com/p/my-csdn-resource/

    注:我觉得分享应该是免费的,之所以有有积分的链接,就是为了如果有朋友积分很多,那就选择有积分链接,给我些积分,让我可以下载别人的源码,如果朋友没有积分,那就可以选择无积分的链接,谢谢!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值