android 四大组件之--------------Service <一>

来源:互联网 发布:首届人工智能计算大会 编辑:程序博客网 时间:2024/06/06 02:39

浅谈service ,欢迎补充。    微笑                                                                    Service《一》

一、简单介绍

 

Android 的第三大组件----------服务。

不给用户提供界面。与activity一样在main线程中执行。把一些耗时操作放在service中的其他线程执(意在处理耗时操作时,在service开辟其他线程来完成操作)。

<继承关系:

java.lang.Object

   ↳

android.content.Context

 

   ↳

android.content.ContextWrapper

 

 

   ↳

 

android.app.Service

 

 

 

 

 

<两种service启动的生命周期图:

 

注:上图中onStartCommand()方法 即可理解为onstart()方法。

解释:

1、onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()bindService()方法,服务也只被创建一次。onDestroy()该方法在服务被终止时调用。 

2. Context.startService()启动Service的生命周期

方法onStart() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStart() 方法会被多次调用。
3. Context.bindService()启动Service生命周期

方法onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。

 

二、具体实现:

第一步:自定义一个类继承自service

第二步:重写需要重写的方法

第三步:根据不同的启动方式,定义不同的参数。

第四步:调用服务

两种启动方式Context.startService() and Context.bindService().

<> startServiceintent

调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。

1使用context.startService()启动该服务

服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调onStart()方法。

2采用Context.stopService()方法或者是Service.stopSelf()结束服务,服务结束时会调用onDestroy()方法

 

 

<> bindserviceintentserviceconnectionflags

Serviceconnection关于这个参数,作如下解释:

顾名思义----服务连接。是在服务与绑定者之间连接作用。是一个接口,内有两个抽象方法

Summary

Public Methods

abstract void

onServiceConnected(ComponentName name, IBinder service)

Called when a connection to the Service has been established, with 

the IBinder of the communication channel to the Service.

abstract void

onServiceDisconnected(ComponentName name)

Called when a connection to the Service has been lost.

 

 

注:链接可以反复建立,并且永远是最新的一个连接。就是说可以new好多,但最新的一个起作用。

 

调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。

1、使用context.bindService()启动服务

在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()onBind()方法并不会被多次调用)多个客户端可以绑定至同一个服务

2、使用unbindService()停止服务或直接退出停止服务。

调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

注:当activity finish时 ,那么与他绑定的service会自动onunbind()、  ondestroy()

 

 

三、启动方式的选择;

没有严格的界限,需要在开发过程中寻找。

 

附注:需要说明的几点:

官方文档告诉我们,一个service可以同时start并且bind,在这样的情况,系统会一直保持service的运行状态如果service已经start了或者BIND_AUTO_CREATE标志被设置。如果没有一个条件满足,那么系统将会调用onDestory方法来终止service.所有的清理工作(终止线程,反注册接收器)都在onDestory中完成。

拥有service的进程具有较高的优先级

    官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。

 

1. 如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于

当前service的进程则变为前台进程以避免被killed。
2. 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,

但是比那些不可见的进程更重要,这就意味着service一般不会被killed.
3. 如果客户端已经连接到service (bindService),那么拥有Service的进程则拥有最高的优先级,

可以认为service是可见的。
4. 如果service可以使用startForeground(int, Notification)方法来将service设置为前台状态,

那么系统就认为是对用户可见的,并不会在内存不足时killed。

在 AndroidManifest.xml 里 Service 元素的常见选项

android:name  -------------  服务类名

android:label  --------------  服务的名字,如果此项不设置,那么默认显示的服务名则为类名

android:icon  --------------  服务的图标

android:permission  -------  申明此服务的权限,这意味着只有提供了该权限的应用才能控制或连接此服务

android:process  ----------  表示该服务是否运行在另外一个进程,如果设置了此项,那么将会在包名后面加上这段字符串表示另一进程的名字

android:enabled  ----------  如果此项设置为 true,那么 Service 将会默认被系统启动,不设置默认此项为 false

android:exported  ---------  表示该服务是否能够被其他应用程序所控制或连接,不设置默认此项为 false