在Android开发的过程中,进程之间的通讯是很常见的,例如获取其他应用的数据库数据,获取导航相关信息,系统服务调用,获取后台数据,文件数据传输等等。在这些进程通讯里面,service与app之间通讯用的比较平凡,现在很多的第三方服务商,像百度,高德,科大等等都是通过sdk的方式(其实就是service和app之间的通讯)提供给客户使用,客户通过调用sdk里面相关api去绑定相应服务商的服务,然后进行通信。下面就简单讲解下service与app是如何进行通信以及通讯传输的数据类型:
app中调用service方式:(通过Intent传递),具体是
1:通过startService调用:
Intent intent=new Intent("xxx"); //xxx表示隐式调用服务的Action
或者Intent intent=new Intent(this,xxx); //xxx表示显式调用服务的类
startService(intent);
2:通过bindService调用:
Intent intent = new Intent(this, xxx); //xxx表示显式调用服务的类
bindService(intent, conn, Service.BIND_AUTO_CREATE);
其中conn表示绑定服务监听
private class Conn implements ServiceConnection{
//绑定服务成功的监听 service:是服务绑定成功后的返回值:onbind方法的返回值
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
}
//因为异常,绑定服务失败的监听
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
}
}
下面是两种服务的生命周期:
注意:调用startService结束是使用stopService,而调用bindService结束是调用unbindService,如果先bindService再startService然后需要结束服务的话需要先unbindservice再stopservice
bindService获取服务对象的方式:
在onServiceConnected方法中通过IBinder对象获取,方式如下:
- MyBinder binder = (MyBinder)service;
- BindService bindService = binder.getService();
- 通过bindService(此对象就是服务)去调用相应方法即可
也可以通过
mService = IxxxManager.Stub.asInterface(service);得到binder对象的实例进行调用
服务中需要实现onBind方法return我们app需要的IBinder对象
這样就实现了app调用服务方法,至于服务去调用app相关方法可以通过回调去实现,這里不做详细讲解
接下来讲下aidl通讯过程中可传输的数据类型:
- AIDL定义接口的源代码后缀必须以.aidl结尾。
- AIDL一样要指定AIDL接口的包信息package *。
- AIDL接口无需指定public、private、protected等作用域,可以理解为就是public。
- AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。
- 如果需要传递其他类型的对象,需要import对象的包名,并需要对对象进行特殊处理(后续介绍)。
关于如何不让service被杀死问题处理:
1. onStartCommand方式中,返回START_STICKY
2.提高Service的优先级
在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。
3.提升Service进程的优先级
当系统进程空间紧张时,会依照优先级自动进行进程的回收。
Android将进程分为6个等级,按照优先级由高到低依次为:
- 前台进程foreground_app
- 可视进程visible_app
- 次要服务进程secondary_server
- 后台进程hiddena_app
- 内容供应节点content_provider
- 空进程empty_app
可以使用startForeground将service放到前台状态,这样低内存时,被杀死的概率会低一些。
4.在onDestroy方法里重启Service
当service走到onDestroy()时,发送一个自定义广播,当收到广播时,重新启动service。
5.系统广播监听Service状态
6.将APK安装到/system/app,变身为系统级应用
本文章大致讲了下app调用服务的方式,传输的类型,以及服务如何能够保证不被杀死的方式,比较简洁,读者有什么好的建议可以提出,本人将虚心接受,谢谢!