Messenger,信使,可使用它进行进程间的通信,而Messenger对Service的请求采用队列的方式,因此它不支持多线程通信。
看看官方文档对于Messenger的解释:
Reference to a Handler, which others can use to send messages to it. This allows for the implementation of
message-based communication across processes, by creating a Messenger pointing to a Handler in one process,
and handing that Messenger to another process.
一. 在Activity之间使用(同一个进程):
activity 1
public class MainActivity extends AppCompatActivity {
Button next_btn;
public static final int FLAG = 1001;
private Messenger messenger1;
private Handler UiHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case FLAG:
Toast.makeText(MainActivity.this,"feafesaf",Toast.LENGTH_LONG).show();
break;
default:
super.handleMessage(msg);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
messenger1 = new Messenger(UiHandler);
next_btn = (Button)findViewById(R.id.next_btn);
next_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,Main2Activity.class);
Bundle bundle = new Bundle();
bundle.putBinder("IBinder",messenger1.getBinder());
i.putExtras(bundle);
startActivity(i);
}
});
}
}
activity 2
package com.example.almoliu.handlerbetweenacti;
import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
public class Main2Activity extends AppCompatActivity {
MyHandler mHandler1 = null;
Button send_btn;
private Messenger messenger2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
Intent i = getIntent();
Bundle bundle = i.getExtras();
messenger2 = new Messenger(bundle.getBinder("IBinder"));
send_btn = (Button)findViewById(R.id.button);
send_btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message msg = Message.obtain(null,MainActivity.FLAG);
try {
messenger2.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
}
}
二 activity与service,该service可以是别的进程的,当时别的进程的service时,需要设置相应的permission:
三,activity与别的进程的activity之间,需使用broadcast receiver来传递Messenger:
应用程序1:
package com.example.almoliu.messenger1;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
public static final int MY_FLAG = 1;
private Messenger messenger1;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MY_FLAG:
Log.d("feaefeasfes", "*********************");
break;
default:
super.handleMessage(msg);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
messenger1 = new Messenger(mHandler);
}
public void onNextBtnClicked(View view) {
Intent i = new Intent();
i.setAction(Intent.ACTION_CAMERA_BUTTON);
Bundle bundle = new Bundle();
bundle.putBinder("binder",messenger1.getBinder());
i.putExtras(bundle);
sendBroadcast(i);
}
}
应用程序2:
Manifest file:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.almoliu.messenger2">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.CAMERA_BUTTON"></action>
<category android:name="android.intent.category.DEFAULT"></category>
</intent-filter>
</receiver>
</application>
</manifest>
mainactivity:
package com.example.almoliu.messenger2;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
broadcast receiver:
package com.example.almoliu.messenger2;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
String action = intent.getAction();
if(Intent.ACTION_CAMERA_BUTTON.equals(action)) {
Log.d("aaaaaaaaa","bbbbbbbbbb");
Bundle bundle = intent.getExtras();
Messenger messenger = new Messenger(bundle.getBinder("binder"));
Message msg = Message.obtain(null,1);
try {
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
return;
}
}