Service

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() + 5
    1000;
    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);

你可能感兴趣的:(Service)