进程之间的远程绑定服务,在Android中创建两个进程,app进程写了一个服务,aidl用作远程调用服务的进程。
在app中,服务的代码和注册如下:
public class MyService extends Service {
private static final String TAG = "MyService";
public MyService() {
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
Log.d(TAG, "onStart: ");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand: ");
return super.onStartCommand(intent, flags, startId);
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind: ");
return new Binder();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
}
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.aidldemo.MyService"/>
</intent-filter>
</service>
在aidl中的代码如下:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity111";
Button start, bind, unbind, stop;
ServiceConnection serviceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.d(TAG, "onServiceConnected: ");
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.d(TAG, "onServiceDisconnected:");
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
start = findViewById(R.id.start);
bind = findViewById(R.id.bind);
unbind = findViewById(R.id.unbind);
stop = findViewById(R.id.stop);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent("com.aidldemo.MyService");
intent.setAction("com.aidldemo.MyService");
intent.setPackage("com.example.aidldemo");
startService(intent);
}
});
bind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent("com.aidldemo.MyService");
intent.setAction("com.aidldemo.MyService");
intent.setPackage("com.example.aidldemo");
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
}
});
unbind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
unbindService(serviceConnection);
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent("com.aidldemo.MyService");
intent.setAction("com.aidldemo.MyService");
intent.setPackage("com.example.aidldemo");
stopService(intent);
}
});
}
}
可以看到这里使用隐式意图将service的名字添加到intent中,另外还setAction和setPackage了。
然后点击远程启动服务,奈何却出现一个错误
2024-04-01 21:59:33.527 556-894/? W/ActivityManager: Unable to start service Intent { act=com.aidldemo.MyService pkg=com.example.aidldemo } U=0: not found
很显然是找不到该服务,排查步骤:1 确认服务名包名是否正确 2 看manifest文件是否声明服务 3 检查action和package的名字 4 在远程aidl的manifest中添加如下配置
<queries>
<package android:name="com.example.aidldemo"/>
<intent>
<action android:name="com.aidldemo.MyService"/>
</intent>
</queries>
并给遍历所有包的权限,然后再运行aidl,即可调用起来app的服务了。