Android之service详解

来源:互联网 发布:linux日志查询命令 编辑:程序博客网 时间:2024/05/16 10:02

一.服务的生命周期:

1.采用start的方式开启服务

生命周期如下: onCreate()-->oonStartCommand(){onStart()过时了}---> onDestory()

注:如果服务已经开启,不会重复的执行onCreate(), 而是会调用onStart()和 onStartCommand();服务停止的时候 onDestory().
服务只会被停止一次。

2.服务还有一种开启方式,绑定的方式开启服务。

onCreate() --->onBind();--->onunbind()-->onDestory();
绑定服务不会调用onstart或者onstartcommand方法;

简单解释 一个:这种绑定服务可以调用服务中的方法,首先服务要有一个方法,然后暴露一个中间人,activity通过绑定服务bindService();建立连接。服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象。通过中间人来调用service里的方法。

2.1:AIDL进程间的通信{AIDL:android interface definition language  安卓接口定义语言}

远程服务:调用者和服务在不同的工程代码里面。
本地服务:调用者和服务在同一个工程代码里面。
每一个应用程序都是运行在自己独立的进程里面的。进程操作系统分配内存空间的一个单位。进程的数据都是独立的。独立的内存空间。
aidl文件都是公有的,没有访问权限修饰符 . IPC: inter process communication 进程间通讯

绑定本地服务调用方法的步骤:
1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
private class MiddlePerson extends Binder implements IMiddlePerson{}
2.实现服务的onbind方法,返回的就是中间人 MiddlePerson
3.在activity 绑定服务。bindService();
4.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
5.强制类型转化 调用接口里面的方法。


绑定远程服务调用方法的步骤:
1.在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
2.把暴露的接口文件的扩展名改为aidl文件 去掉访问修饰符 public
private class MiddlePerson extends IMiddlePerson.Stub{}  IPC的子类
3.实现服务的onbind方法,返回的就是中间人 IMiddlePerson
4.在activity 绑定服务。bindService();
5.在服务成功绑定的时候 会执行一个方法 onServiceConnected 传递过来一个 IBinder对象
6.IMiddlePerson.Stub.asInterface(binder) 调用接口里面的方法。



两种开启服务方法的区别。

start方式开启服务: 一旦服务开启跟调用者(开启者)就没有任何关系了。开启者退出了,开启者挂了,服务还在后台长期的运行。开启者没有办法去调用服务里面的方法。(美国的司法独立)
bind的方式开启服务:绑定服务,调用者挂了,服务也会跟着挂掉。不求同时生,但求同时死。
开启者可以调用服务里面的方法。


还有一种是:混合调用的服务

其生命周期:
服务长期后台运行,又想调用服务的方法:
1.start方式开启服务(保证服务长期后台运行)
2.bind方式绑定服务(保证调用服务的方法)
3.unbind解除绑定服务



注意:
1.默认情况下 没有制定service所运行的进程,Service与Acticity是运行在当前app所在进程的ui主线程中的。
2.sevice里面不能执行耗时操作。
特殊情况:
可以在清单文件配置 service 执行所在的进程 ,让service在另外的进程中执行 
3IntentService. http://blog.csdn.net/lmj623565791/article/details/47143563
使用了IntentService最起码有两个好处,一方面不需要自己去new Thread了;另一方面不需要考虑在什么时候关闭该Service了
4.service里可以弹toast.因为sevice是Context的子类。


0 0
原创粉丝点击