android跨进程通信IPC(AIDl使用步骤)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值