Android进程通讯之Service与app的通讯

      在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对象获取,方式如下:

  1. MyBinder binder = (MyBinder)service;

  2. BindService bindService = binder.getService();

  3. 通过bindService(此对象就是服务)去调用相应方法即可

也可以通过

mService = IxxxManager.Stub.asInterface(service);得到binder对象的实例进行调用

服务中需要实现onBind方法return我们app需要的IBinder对象

這样就实现了app调用服务方法,至于服务去调用app相关方法可以通过回调去实现,這里不做详细讲解

接下来讲下aidl通讯过程中可传输的数据类型:

  1. AIDL定义接口的源代码后缀必须以.aidl结尾。
  2. AIDL一样要指定AIDL接口的包信息package *。
  3. AIDL接口无需指定public、private、protected等作用域,可以理解为就是public。
  4. AIDL默认情况下只能传递基本类型、String、List、Map、CharSequence。
  5. 如果需要传递其他类型的对象,需要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调用服务的方式,传输的类型,以及服务如何能够保证不被杀死的方式,比较简洁,读者有什么好的建议可以提出,本人将虚心接受,谢谢!

Guess you like

Origin blog.csdn.net/daxiangzaici/article/details/105957961