- 服务分为本地服务与远程服务,本地与远程的区分标准就是是不是本进程
- 远程服务一般不知道具体的CLASS,只能通过隐式调用
- AIDL(android interface definition language)用于进程间通信,用来访问远程服务中的方法
远程服务定义,这个是另一个application里面的
<service android:name="packageName.ClassName">
<intent-filter>
<action android:name="anyname.is.possible"/>
</intent-filter>
</service>
远程服务启动方法
public void click(View v){
Intent intent = new Intent();
intent.setAction("anyname.is.possible");
startService(intent);
}
访问远程服务方法
- 远程服务中接口文件扩展名改成AIDL(比如Xxx.aidl)
- IDE会自动帮着生成一个Stub的类,文件名为(Xxx.java,和AIDL同名)
- 原来在本地服务中定义的继承Binder的类继承Stub就可以了(生成的Stub会自动继承Binder),然后重写接口中要求实现的类
- 将上面的AIDL文件拷贝到访问的application里面,注意包名必须一样
- 系统会将两个AIDL文件生成的java类看成同一个东西
访问者的强转接口的方法写法
public void onServiceConnected(ComponentName name, IBinder service){
Xxx xx = Stub.asInterface(service);
}
进程优先级
- 可见进程:1. 不在前台(就是没有焦点,onPause调用)但仍可见的进程;2. bindService绑定远程服务,本地这个activity如果是可见进程,那么对应的服务进程也是可见进程
- 前台进程:1. 有焦点可交互的进程;2. 和上面的2类似,绑定远程服务,本地的Activity是前台进程,那么服务所在进程也是前台进程; 3. 服务调用startForeground; 4. 服务生命周期方法onCreate、onStartCommand、onDestroy调用瞬间; 5. 广播接收者在执行onReceive方法时候调用。