在上一篇博文《关于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.youkuaiyun.com/detail/jhg19900321/4564072
无积分链接:https://code.google.com/p/my-csdn-resource/
注:我觉得分享应该是免费的,之所以有有积分的链接,就是为了如果有朋友积分很多,那就选择有积分链接,给我些积分,让我可以下载别人的源码,如果朋友没有积分,那就可以选择无积分的链接,谢谢!