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().
<一> startService(intent)
调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。
1、使用context.startService()启动该服务
服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调onStart()方法。
2、采用Context.stopService()方法或者是Service.stopSelf()结束服务,服务结束时会调用onDestroy()方法
<二> bindservice(intent,serviceconnection,flags);
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
- Android应用程序四大组件之Service(一)
- android 四大组件之--------------Service <一>
- Android 四大组件之 Service (一)
- Android四大组件之Service(一)
- Android基础之四大组件---Service(一)
- Android四大组件之Service(一)
- Android四大组件之Service(一)
- android四大组件之Service(一)
- 四大组件之Service(一)
- Android四大组件之 Service
- Android四大组件之 Service
- Android四大组件之 Service
- android四大组件之Service
- android四大组件之Service
- android四大组件之Service
- Android四大组件之Service
- Android四大组件之service
- Android四大组件之Service
- 关于shared pool的深入探讨(六)-高Latch竞争案例 (摘自eygle的博客)
- zdclient在华硕n14u上出现的怪异问题
- 我大学目标
- Tree命令显示文本目录树
- Nutch1.7学习笔记1:基本环境搭建及使用
- android 四大组件之--------------Service <一>
- 基于Kinect的跨平台人机交互系统的文章大纲
- C#连接oracle数据库
- Tutorial 18 - Diffuse Lighting
- poj2187 Beauty Contest 凸包+旋转卡壳
- __read_mostly变量含义
- LDD3-最简字符设备驱动freg (register_chrdev)
- Makefile 的问题及解答~
- SGU536 Berland Chess