#组件
* Activity
* broadcast Receiver
* Service : 服务
> windows: 长期后台运行没有界面的进程就叫服务.
>
> android: 长期后台运行,没有界面的组件, 服务是运行在当前应用程序进程里面
##服务的应用场景
> 长期后台运行,没有界面的组件.
>
> 1. 监视一个硬件是否被插入
> 2. 连接服务器刷新最新的数据.
> 3. 定时的轮询
注意: 服务是运行在主线程里面(main), 不可以直接在服务里面编写耗时的逻辑.
##进程的优先级
* Foreground process
> 前台进程: 用户正在操作的应用程序所在的进程就是前台进程
* Visible process
> 可视进程: 用户已经不能操作这个应用程序了,但是界面用户仍然可以看到
* Service process
> 服务进程: 应用程序有一个服务代码正在运行
* Background process
> 后台进程: 应用程序有界面,但是界面被用户最小化(home)
* Empty process
> 空进程: 应用程序没有任何运行的Activity,service.
前台进程>可视进程>服务进程>后台进程>空进程
##服务的生命周期
* start的方式开启服务,服务只会被创建一次,在创建的时候执行oncreate方法,一旦服务创建完毕,再去开启service就不会重复执行oncreate方法了.只会执行onstart和onstartcommand
* 服务停止 stopService() ondestroy() 服务只会别停止一次
* startService()
> 缺陷: 我们不可以调用服务的方法, 不可以与服务进行通信.
* bindService() 绑定服务
> 可以间接的调用到服务里面的方法, 可以与服务进行通信.
##绑定服务调用服务方法的步骤
1. 编写服务代码
public IBinder onBind(Intent intent) {}
2. 在服务内部定义一个代理人对象 MyBinder
代理人对象有一个方法可以间接的调用服务内部的方法
3. 在onbind方法里面返回代理人对象
4. 在Activity代码采用绑定的方式连接到服务
bindService(intent, new MyConn(), BIND_AUTO_CREATE);
5. 在serviceConnection的实现类里面有一个方法,获取到服务返回的代理人对象
public void onServiceConnected(ComponentName name, IBinder service)
6. 强制类型转换IBinder转化成 MyBinder类型
myBinder = (MyBinder) service;
7. 调用代理人对象的方法--间接调用了服务里面的方法.
##绑定方式开启服务的生命周期
* 绑定的方式开启服务,如果服务不存在, oncreate--->onbind
* 服务的onstart和onstartcommand方法不会被执行.
* 解除绑定服务 onunbind()--->ondetroy()
* 多次绑定服务,服务只会被创建一次,oncreate方法只会被执行一次
* 多次绑定服务,onbind方法不会被重复调用.
* 在实际开发的时候,如果需要调用服务的方法,就绑定服务,只能绑定一次
* 服务只可以被解绑一次,如果用同一个conn对象多次解绑,服务会抛出一次.
##两种开启服务方式的比较
* start的方式开启服务
> 服务一旦开启,长期后台运行,服务和开启者(Activity)没有任何的关系,开启者退出了,服务还是继续在后台长期运行, 开启者(Activity)不可以调用服务里面的方法. 在系统设置界面里面可以观察到
* bind的方式开启服务
> 不求同时生,但求同时死. 如果开启者(Activity)退出了, 服务也会跟着挂掉.
> 开启者(Activity)可以间接的利用中间人调用服务里面的方法.在系统设置界面看不到的.
服务如果被开启同时被绑定,服务就停不掉了.必须解除绑定服务才可以停止服务.
##混合的方式开启服务.
* 为了保证服务又能长期后台运行,又能调用到服务里面的方法.
* 采用混合的方式开启服务.
> 请严格按照步骤编写代码:
1. start的方式开启服务 (保证服务长期后台运行)
2. bind的方式绑定服务 (调用服务的方法)
3. unbind的方式解除绑定服务
4. stop的方式停止服务
##本地服务和远程服务
* 本地服务 local service
> 服务的代码在当前应用程序的内部
* 远程服务 remote service
> 服务的代码在另外一个应用程序里面
##重要概念
* 进程
> 操作系统分配的独立的内存空间.
* IPC
> inter process communication 进程间通讯
* aidl
> android interface definition language 安卓接口定义语言
##绑定远程服务调用服务方法的流程
1. 跟本地服务的代码编写是一样.
2. 远程服务的接口定义文件.java--->.aidl
3. 把接口定义文件的访问修饰符全部删除 public private
4. 原来代理人MyBinder extend Binder implemet IService--> extends IService.Stub
5. 先把远程服务.aidl文件拷贝到本地应用程序的工程目录里面,包名一致
6. iService = IService.Stub.asInterface(service);得到远程服务的代理对象
7. 通过代理对象调用远程服务的方法.