Service没有用户界面,运行在后台。和Activity一样,都是运行在主线程中。如果要做CPU耗时操作和阻塞操作,那就应该创建一个新的线程,防止导致系统提示“APP无响应”(ANR) 。
Service两种使用方式:
1.通过startService()启动
执行一些操作,但不需要返回执行结果。比如通过网络上传或下载文件。完成操作后,需要stopSelf()或者stopService()显式停止Service。这种启动方式使得Service和启动它的组件无关,即使启动它的组件停止运行了,该Service还能继续运行。需要继承Service,并重写onStartCommand()。
2.通过bindService()绑定
提供类似client-server接口,从而允许组件和Service交互,比如发送请求,获取执行结果。需要继承Service,并重写onBind()。
IntentService是Service的子类,使用一个工作线程处理所有请求,所有请求排队处理。如果需要同时处理多个请求,则需要在实现Service的子类,每收到一个请求时,创建一个线程去执行一个请求。
使用IntentService只需要实现一个构造函数和重写onHandleIntent()
public class HelloIntentService extends IntentService {
/**
- A constructor is required, and must call the super IntentService(String)
- constructor with a name for the worker thread.
*/
public HelloIntentService() {
super("HelloIntentService");
}
/**
- The IntentService calls this method from the default worker thread with
- the intent that started the service. When this method returns, IntentService
- stops the service, as appropriate.
/
@Override
protected void onHandleIntent(Intent intent) {
// Normally we would do some work here, like download a file.
// For our sample, we just sleep for 5 seconds.
long endTime = System.currentTimeMillis() + 51000;
while (System.currentTimeMillis() < endTime) {
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
}
}
}
onStartCommand()返回值:
START_NOT_STICKY 系统停掉Service后不重启它
START_STICKY 系统停掉Service后等有资源时会重启它,但不会传递最后一个请求
START_REDELIVER_INTENT 系统停掉Service后等有资源时会重启它,会传递最后一个请求。适合类似下载文件等需要立即恢复的操作
如果想让Service一直运行,可使用前台Service
Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);
网友评论