一.什么是远程Service
远程Service是在新进程中启动Service,Activity通过AIDL方式来跨进程通信(IPC)
二.启动远程Service
<service
android:name="com.hezhong.service.MyService"
android:process=":newThread"
android:enabled="true"
android:exported="false"></service>
直接增加 android:process=":newThread"属性就可以,则远程Service在末尾带newThread字段的进程里
startServie和stopService可以启动Service和停止Service,但bindService和unBindService则会崩溃,解决办法是通过AIDL通信
三.Activity通过AIDL通信远程Service
1.建立AIDL文件
2.在AIDL接口中定义Activity要访问Service的方法,然后gradle重写运行下,gen自动生成AIDL的Service
interface MyAIDLService {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
void startDownload(String message);
}
3.在Service中实现MyAIDLService.Stub类
MyAIDLService.Stub iBinder= new MyAIDLService.Stub(){
@Override
public void startDownload(String message) throws RemoteException {
Log.d(TAG, "aidl startDownload");
}
};
4.onBind中返回iBinder
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return iBinder;
}
至此,就可以远程的绑定Service了!
四.第三方应用绑定远程Service
1.拷贝全路径AIDL文件到第三方应用中
2.显示调用Service
String packName = "com.hezhong.gradledemo"; //Service包名
String className = "com.hezhong.service.MyService"; //Service的类名
ComponentName componentName = new ComponentName("com.hezhong.gradledemo", "com.hezhong.service.MyService");
intent.setComponent(componentName);
bindService(intent, connection, BIND_AUTO_CREATE);//绑定Service
3.隐式调用Service
Intent intent = new Intent();
intent.setAction("com.hezhong.action.myservice"); // Service的Action
intent.setPackage("com.hezhong.gradledemo");// Service包名
bindService(intent, connection, BIND_AUTO_CREATE);//绑定Service
4.重写ServiceConnection
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "onServiceConnected");
MyAIDLService myAIDLService= MyAIDLService.Stub.asInterface(service);
try {
myAIDLService.startDownload("begin");
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "onServiceDisConnected");
}
};
用startServie调用远程Service很多问题,android5.0和android8.0需解决相应问题,建议用bindService