- 进程的概念
a) 四大组件都运行在主线程中
b) 服务是没有界面的,可理解为没有界面的Activity
c) 进程的优先级
i. Foreground process前台进程:优先级最高,相当于activity执行了onResume()方法,用户正在交互;
ii. Visible process 可视进程:一直影响用户看得见,相当于Activity执行了onPause()方法
iii. Service process 服务进程:通过startService()方法开启了一个服务
iv. Background process 后台进程:相当于Activity执行了onStop()方法,界面不可见,Activity并没有销毁
v. Empty process 空进程:不会维持任何组件运行
- start开启服务的服务和特点
a) 定义四大组件的方式是一样的
b) 定义一个类继承Service
c) 特点:
i. 第一次点击按钮开启服务,服务执行onCreate
ii. 第二次点击按钮再次开启服务,服务执行onStart方法
iii. 服务一旦被开启,服务就会在后台长期运行,指导用户手动停止
d) 实时去服务器取数据
- 电话qietingqi案例
a) TelephoneManger
- 使用服务注册特殊的广播接听者
a) 定义广播接收者
b) 写服务用来注册广播接收者
c) 在mMainActivity中开启服务
- bindService开启服务特点
a) 第一次点击按钮会执行服务的onCreate()和onBind()
b) 当onBind返回nullshi onServiceStartConnected()不执行
c) 第二次点击按钮,服务不相应
d) 调用者(Activity)和服务之间不求同生,但求同死
e) 服务不可以多次解绑
f) Bind方式开启的服务在设置页面找不到
- 为什么要引入bindService
a) 为了调用服务的方法
- 通过bindService方式调用服务方法的过程
a) 在服务内部定义一个方法,让activity去调用
b) 在服务的类里定义一个中间人类继承IBinder
c) 把定义的中间人对象在onBind方法里面返回
d) 在MainActivity的onCreate方法里面调用服务类的对象的目的是为了获取定义的中间人对象
e) 获取中间人对象
f) 达到中间人对象可以间接调用服务里面的方法
g) 当Activity销毁时解绑服务
- 通过接口方式调用服务里面的方法
a) 定义一个接口,把想暴露的方法定义在接口里面
b) 定义中间人对象实现我们自己定义的接口
c) 获取中间人对象,间接调用服务里面的方法
- 混合方式开启服务
a) 需求:想让服务在后台长期运行,又想调用服务里面的方法
b) 步骤:
i. 先调用startService方法开启服务,保证在后台长期运行
ii. 调用bindService方法,获取中间人对象
iii. 调用unbindService方法,解绑服务
iv. 调用stopService方法
- Aidl介绍
a) 本地服务:运行自己应用里面的服务
b) 远程服务:运行在其他应用里面的服务
c) 实现进程间通信:IPC
d) Aidl:专门用来解决进程之间的通信
e) 使用步骤:
i. 把IService.java改为.aidl文件
ii. Aidl这个语言不认识public,把public去掉
iii. 自动生成IService.java文件,自动生成Stub类继承了Binde实现了Iservicer.aidl
iv. 定义IBinder对象直接继承Stub即可
v. 保证两个应用的aidl文件一样,另外一个应用的aidl所在的报名即可
vi. 获取IBinder方式和在一个应用中调用不一样