Android中service开发总结
1、为什么要使用service?
在我们开发的应用中,有的时候需要做一些长期运行的任务,比如下载文件、音乐播放器、闹钟或者邮件程序等。由于Android系统会根据系统资源使用情况自动清理闲置的后台程序,所以普通的Activity程序在运行一段时间后就有可能被系统清理掉,不能达到长期运行的效果。而包含service的进程属于优先权比较高的(关于进程的生命周期相关知识请点击这里查看)不容易被系统清理掉,所以对那些应用来说,选择service是必要的。
2、创建一个Service
在工程节点或者包节点上右键,选择”New->Class”,输入包名,类名称,SuperClass输入或者选择android.app.Service,点击ok,创建一个服务类成功,创建完成后初始化代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import android.app.Service; import android.content.Intent; import android.os.IBinder; public class TestService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } } |
创建完成后还无法使用此服务,需要在AndroidManifestXml中声明该服务类,示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="TestService" android:label="@string/app_name" android:icon="@drawable/ic_launcher"></service> </application> |
3、服务类的一些重要方法
getApplication()
Return the application that owns this service.
|
onBind(Intent intent)
Return the communication channel to the service.
|
onConfigurationChanged(Configuration newConfig)
Called by the system when the device configuration changes while your component is running.
|
onCreate()
Called by the system when the service is first created.
|
onDestroy()
Called by the system to notify a Service that it is no longer used and is being removed.
|
onLowMemory()
This is called when the overall system is running low on memory, and actively running processes should trim their memory usage.
|
onRebind(Intent intent)
Called when new clients have connected to the service, after it had previously been notified that all had disconnected in its
onUnbind(Intent) . |
onStart(Intent intent, int startId)
This method was deprecated in API level 5. Implement
onStartCommand(Intent, int, int) instead. |
onStartCommand(Intent intent, int flags, int startId)
Called by the system every time a client explicitly starts the service by calling
startService(Intent) , providing the arguments it supplied and a unique integer token representing the start request. |
onTaskRemoved(Intent rootIntent)
This is called if the service is currently running and the user has removed a task that comes from the service’s application.
|
onTrimMemory(int level)
Called when the operating system has determined that it is a good time for a process to trim unneeded memory from its process.
|
onUnbind(Intent intent)
Called when all clients have disconnected from a particular interface published by the service.
|
startForeground(int id, Notification notification)
Make this service run in the foreground, supplying the ongoing notification to be shown to the user while in this state.
|
stopForeground(boolean removeNotification)
Remove this service from foreground state, allowing it to be killed if more memory is needed.
|
stopSelf()
Stop the service, if it was previously started.
|
stopSelf(int startId)
Old version of
stopSelfResult(int) that doesn’t return a result. |
stopSelfResult(int startId)
Stop the service if the most recent time it was started was startId.
|
4、Service的调用方法
Service可能通过两种方法启动,一种是通过startService另外一种是通过bindService
1) startServie的声明如下:public abstract ComponentName startService (Intent service)
参数说明:service是你要启动的服务对象,通过Intent构造,你可以在Intent对象中加入其他需要的参数,以在服务中使用。执行此函数后,如果服务未启动则系统会创建此服务并执行,如果执行此函数时服务已经在运行,则服务会继续执行。
1 2 3 |
Intent servicentent = new Intent(this, CloudNoteService.class); //servicentent.putExtra("MusicFile", "") this.startService(servicentent); |
每次调用startService时都会触发服务内的android.app.Service.onStartCommand方法,此机制提供一个方便的方法通过Intent参数传入一些需要的参数,以避免必须再使用BindService才能实现的功能。
终止由startService启动的服务方法:一种是可以在服务内部调用stopSelf()来停止服务,另一种是在调用startService的context中通过调用stopService来终止
2) bindService声明如下:public abstract boolean bindService (Intent service, ServiceConnection conn, int flags)
参数说明:
service: 是要绑定的服务的实例标识,
conn: 用于接收成功绑定或者结束绑定时的通知,在连接时可以接收service返回的对象,
flags: 为绑定选项,可能为0, BIND_AUTO_CREATE, BIND_DEBUG_UNBIND, BIND_NOT_FOREGROUND, BIND_ABOVE_CLIENT, BIND_ALLOW_OOM_MANAGEMENT, BIND_WAIVE_PRIORITY.
对于由startService启动的服务,也可以使用此函数进行绑定。如果服务没有启动,可以设置flags为BIND_AUTO_CREATE,这样执行此函数时服务会被自动创建。
只有当调用该服务存在的时候系统才认为该服务有必须继续执行代码,比如当调用该服务的Activity停止或者销毁后它绑定的服务也会停止工作。所以在执行长期操作的时候不要在bindService中执行,即不要在Service的onbind函数中启动相应的定时器,否则当activity结束后,该定时器也会不再执行工作,而应该先用startService启动服务,并在服务的onStartCommand中执行定时器操作。
注意:
1、在使用一个service前必须在AndroidManifest.xml中定义该服务类名称,如:<service android:name=”Em8CheckerService”></service>