Android Service -详解

一、Service进行分类
1.本地服务
本地服务按启动方式不同又可以分为两种。
2.远程服务
二、本地服务和远程服务的区别

Android Service -详解_第1张图片
三、本地服务的两种启动方式
第一种:startService(bindIntent);
onCreate只会执行一次,只要调用startService,onStartCommand一定会执行
Service运行在main线程中,做耗时操作需另开子线程。
通过Intent进行传参,在onStartCommand中接收参数。
无法获得Service对象,不能直接操作Service中的属性和方法。
调用stopService后,Service会执行onDestroy方法后停止。

第二种:bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE);//此时使用bindService开启服务
step1:新建类继承Service
step2:实现onBind方法
这里不同于startService中实现onBind方法那样简单。这里需要在此方法中返回一个Binder子类对象。
step3:重写onCreate方法
step4:重写onUnBind方法
在调用unbindService方法解除绑定后,触发此回调函数
step5:重写onDestroy方法
step6:在AndroidManifest中注册Service
step7:实现ServiceConnection接口
这里是难点,通过代码示范。
step8:通过bindService绑定Service
step9:通过unbindService解绑Service
四、远程服务的应用(远程服务其实就是一个进程)

考虑到项目的需要在Android UI主线程结束后还要做一些操作就把Service给拿了出来。Service 可以按本地服务和远程服务来划分。本地服务生存在UI主线程中,即UI主线程挂掉之后Service已经不存在了。远程服务不依赖于UI主线程,远程服务可以单独运行在一个进程中。

  1. 如何配置一个远程Service?

android:process 这个属性决定了它是远程服务,当然它的配置也是挺讲究的,如下:
进程名是以一个冒号开头的,则这个新的进程对于这个应用来说是私有的,当它被需要或者这个服务需要在新进程中运行的时候,这个新进程将会被创建。进程的名字是以字符开头,并且符合 android 包名规范(如 com.roger 等),则这个服务将运行在一个以这个名字命名的全局的进程中,当然前提是它有相应的权限。若以数字开头(如 1Remote.com ),或不符合 android 包名规范(如 Remote),则在编译时将会报错 ( INSTALL_PARSE_FAILED_MANIFEST_MALFORMED )。新建进程将允许在不同应用中的各种组件可以共享一个进程,从而减少资源的占用。
四、远程服务的通信(进程)
为了让远程Service与多个应用程序的组件(四大组件)进行跨进程通信(IPC),需要使用AIDL
IPC:Inter-Process Communication,即跨进程通信
AIDL:Android Interface Definition Language,即Android接口定义语言;用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。
五、进程保活
守护进程,5.0以上不好使,实现思路两个进程相互调起。
一像素大法;
加入白名单;
监听各种广播;
使用前台服务;
播放无声音乐;
使用各种推送;
使用 JobService;
长连接和心跳检测;
使用 AccountSync;

你可能感兴趣的:(android,中级,Server)