创建:
在manifest中的<code><application>、<Activity></code>等,加上<code>android:process="进程名称"</code>,运行时就会在这进程执行。
进程等级:
- 前台进程
- 可见进程
- 服务进程
- 后台进程
- 空进程
如何通信
操作建议:
**多进程多线程 **, 建议使用 **AIDI **
**多进程单线程 **, 建议使用 **Messenger(不需考虑线程安全) **
**单进程多线程 **, 建议使用 **Handler **
Messenger的代码例子:
-
首先写一个不同进程的Service的类:
public class MessengerService extends Service {
//适用于多进程、单线程; 不需考虑线程安全
Messenger mMessenger = new Messenger(new InComingHandler());class InComingHandler extends Handler{ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //处理消息 switch (msg.what){ case 0: //················· break; } } } @Nullable @Override public IBinder onBind(Intent intent) { //调用Messenger的getBinder方法 //IBinder可以理解为通信通道 return mMessenger.getBinder(); } }
在manifest中注册Service
<service
android:name=".Messenger.MessengerService"
android:enabled="true"
android:exported="true"
//进程名
android:process="com.test.messenger.service">
</service>-
在主进程中的Activity发送消息,与"com.test.messenger.service"的进程 进行通信:
public class MessengerActivity extends AppCompatActivity implements ServiceConnection {
private Messenger mMessenger;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_messenger);bindService(new Intent(this, MessengerService.class), this, BIND_AUTO_CREATE); //发送消息 if(mMessenger != null){ Message message = Message.obtain(null, 0, "hello"); try { //发送后会到MessengerService的InComingHandler处理消息 mMessenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } } } @Override public void onServiceConnected(ComponentName name, IBinder service) { //获取对应的Messenger mMessenger = new Messenger(service); } @Override public void onServiceDisconnected(ComponentName name) { } }
注意:
上面的例子中<code>Message.obtain(null, 0, "hello")</code>写法是有问题的;
当用Messenger在两个进程之间传递Message时,Message的obj不能设置为设置为non-Parcelable的对象,在跨进程的情形下,Message的obj设置为了一个String对象,那么在Messenger执行send(Message)方法时就会报如下错误:
解决该问题最简单的办法是,在跨进程的时候不使用Message的obj,用Bundle传递数据,即:
Bundle bundle = new Bundle();
bundle.putString("content", "hello");
mMessage = Message.obtain(null, REQUEST_PLAY, 0,0, bundle);
AIDL的代码例子:
-
新建: new -> AIDL -> AIDL Filel;
系统会自动创建一个aidl的文件夹,如图:
-
创建一个不同进程的service服务“AIDLService”:
- 下面就是主进程的Activity的调用
public class AIDLActivity extends Activity implements ServiceConnection {
private IMyAidlInterface mIMyAidlInterface;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_aidl);
findViewById(R.id.button_aidl).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mIMyAidlInterface != null){
try {
//调用不同进程的方法,并获取数据
String name = mIMyAidlInterface.getName("nick_know_maco");
Toast.makeText(AIDLActivity.this, name + "", Toast.LENGTH_LONG).show();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
});
bindService(new Intent(this, AIDLService.class), this, Context.BIND_AUTO_CREATE);
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//获取通信通道
mIMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
}