服务
进程优先级:
- Empty process
- Background process
- Service process
- Visable process
- Foreground process
开启服务
启动方式:
显式启动与关闭
startService(new Intent(this,Myservice.class))
stopService(intent)
隐式启动
Intent intent =new Intent();
intent.setAction("wo jiu shi zheyang qidongde");
startService(intent)
生命周期方法
- onCreate
- onStartCommand(onStart过时)
- onDestroy
电话录音机
电话状态分类
- 空闲状态
- 响铃状态
- 摘机状态
开启方式
- startService
- 开启的是服务进程,可以常驻内存,Activity生命周期与其没有关系。
- bindService
- 开启的服务不属于服务进程,Activity死亡,其相应的会调用unbind()与ondestroy()方法。
- 作用:通过绑定服务启动可以在Activity中调用service里面的方法。
- 服务的混合调用
- 必须先startService(intent);再bindService(intent);
- 如果反之,则ondestroy()方法必须再onbind()方法之后调用,这个在实际运行时,是可能引发错乱的。
使用代码配置广播接收者
- 可以使用清单文件注册
- 广播一旦发出,系统会去所有的清单文件中寻找那个广播接收者的action与广播的action是匹配的,如果找到了,就会将该广播接收者的进程启动起来。
- 可以使用代码注册
- 需要使用广播接收者时,执行注册的代码,不需要时,执行解除注册的代码。
特殊的广播接收者
- 安卓中有一些广播接收者,必须使用代码注册,清单文件注册是无效的
- 屏幕锁屏和解锁
- 电量改变
服务的分类
- 本地服务:指服务与启动服务的Activity所在进程是同一个。
- 远程服务:指服务与启动服务的Activity所在进程不是同一个。
AIDL
- Android Interface Definition Language
- 进程间通信
- 把远程服务的方法抽取成一个单独的接口java文件
- 把接口java文件的后缀名改成aidl
- 在自动生成的PublicBusiness.java文件中,有一个静态抽象类Stub,它已经继承了binder类,实现了publicBusiness接口,这个类就是新的中间人。
- 把aidl文件复制到新的项目中,注意包名必须和原来服务中的包名一致。
- 在新的项目中,若要调用服务中的方法,对象需要强转,使用Stub.asInterface();
进程优先级
- 前台进程
- 拥有一个与用户交互的Activity的进程
- 拥有一个与用户交互的Activity绑定的service的进程
- 拥有一个正在“运行于前台”的服务–服务的startForeground()方法调用
- 拥有一个正在执行以下三个生命周期方法中任意一个的服务(onCreate,onStart,onDestory)
- 拥有一个正在执行onReceive方法的广播接收者的进程
- 可见进程
- 拥有一个不在前台,但是用户依然可见的Activity(onPause方法调用)的进程
- 拥有一个与可见的Activity绑定的服务进程
- 服务进程
- 后台进程
- 空进程