1为什么要进行进程间通信?
1)兄弟应用之间需要共享数据(如微信想要使用某些qq数据)
2)有些模块需要运行在单独的进程中(比如说呢?推送往往放到单独的进程中)
3)为了加大一个应用的可使用内存,可用多进程。
2好用的IPC方式有哪些?
1)AIDL可实现高并发,实时性IPC,好用
2)可以使用ContentProvider,A应用访问B应用的数据
3怎么样开启新进程?
Android的四大组件默认都会在同一个进程中,进程名为包名,通过设置process属性可使其处于不同的进程
省略包名的写法:
<activity android:name=".MainActivity"
android:**process**=":local">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
全包名
“`
3 AIDL的使用步骤(AS)
介绍最常见的aidl的使用:Service的跨进程通信
1)首先设置progress属性使得Activity和service处于不同的进程中
2)在main包下自定义aidl的包名,AS快捷生成IMyAidlInterface.adil文件,接口的方法add
interface IMyAidlInterface {
int add(int a, int b);
}
3)sync project生成IMyAidlInterface.java文件,产生了Stub代理类
Tool--->android-->sync project with gradle files
4)在service中调用stub代理类
public class MyService extends Service {
public MyService() {
}
private IBinder mIBinder = new IMyAidlInterface.Stub() {
@Override
public int add(final int a, final int b) throws RemoteException {
System.out.println("progress"+android.os.Process.myPid());
Log.e("progress",android.os.Process.myPid()+"");
return a+b;
}
};
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return mIBinder;
}
}
5)Activity中使用bindService的方式绑定并启动服务
private void startAndBindService() {
Intent service = new Intent(MainActivity.this, MyService.class);
//startService(service);
bindService(service, mServiceConnection, Context.BIND_AUTO_CREATE);
}
public class MainActivity extends AppCompatActivity {
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(final ComponentName name, final IBinder service) {
IMyAidlInterface mIMyAidlInterface= IMyAidlInterface.Stub.asInterface(service);
try {
int a= mIMyAidlInterface.add(2,3);
Log.e(“a”,”“+a);
} catch (RemoteException mE) {
mE.printStackTrace();
}
}
@Override
public void onServiceDisconnected(final ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("Aprogress", android.os.Process.myPid() + "");
startAndBindService();
}
private void startAndBindService() {
Intent service = new Intent(MainActivity.this, MyService.class);
//startService(service);
bindService(service, mServiceConnection, Context.BIND_AUTO_CREATE);
}
}
“`
6
打印结果
E/a: 5
service和Activity虽是不同的进程,但是Activity中使用到了service中的add方法,实现了跨进程通信
https://www.cnblogs.com/pear-lemon/p/6547734.html
误区提示:
Android四大组件间的通信就属于IPC,通常使用Bundle(此话有误,如果组件在同一个进程中那就不叫IPC,通过设置manifest文件中的progress属性使得组件在不同进程中才叫IPC).
如果要实现两个app间的通信需注意:
客户端com.ryg.sayhi.aidl包是和服务端工程必须完全一样!!!
https://blog.csdn.net/singwhatiwanna/article/details/17041691