android札记-处理started service的多次启动请求

android笔记--处理started service的多次启动请求[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评

android笔记--处理started service的多次启动请求

[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]

?

如果没有调用stopService()方法或者stopSelf()方法, 就算onStartCommand()方法执行完成, 该service仍然处于active状态, 但onStartCommand()方法返回后, 系统可能处于内存不足的缘故摧毁这个service, 如果发生这种情形, 那么系统将尽快重建这个service, 而onStartCommand()方法的返回值用来定义系统该如何重建service, 返回值的可以是以下3个int值中的一个:

START_NOT_STICKY, 表明不要重建service. 这可以避免在非必要的情况下浪费系统的资源.START_STICKY, 表明需要重建service, 并在重建service之后调用onStartCommand()方法, 传递给该方法的intent为null.START_REDELIVER_INTENT, 表明需要重建service, 并在重建service之后调用onStartCommand()方法, 传递给该方法的intent为service被摧毁之前接收到的最后一个intent.? ? ?

public class SingleService extends Service { private static final int NEW_INTENT_COMMING = 0; private Handler handler; private final class WorkThreadHanlder extends Handler { // 使用指定Looper创建Handler public WorkThreadHanlder(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { if (msg.what == NEW_INTENT_COMMING) { Log.d("SingleService", Thread.currentThread().getName()); try { Thread.sleep(5 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } // arg1中存储的是onStartCommand()方法的startId参数 stopSelf(msg.arg1); } } } @Override public int onStartCommand(Intent intent, int flags, int startId) { Message msg = handler.obtainMessage(); msg.arg1 = startId; msg.what = NEW_INTENT_COMMING; msg.sendToTarget(); return START_STICKY; } @Override public void onCreate() { super.onCreate(); HandlerThread thread = new HandlerThread("work thread", Process.THREAD_PRIORITY_BACKGROUND); // thread启动之后才能调用getLooper()方法获取thread中的Looper对象 thread.start(); // 使用子线程的Looper创建handler, 该handler绑定在子线程的消息队列上 handler = new WorkThreadHanlder(thread.getLooper()); } @Override public IBinder onBind(Intent intent) { return null; }}继承IntentService--以单线程的方式处理多个启动请求

因此继承IntentService可以方便的构建单线程处理启动请求的service, 开发者不需要考虑创建线程, 创建Handler, service的退出等复杂的问题, 仅需要提供一个构造函数和实现onHandleIntent方法.

public class SingleIntentService extends IntentService { public SingleIntentService() { // 设置子线程名称 super("work thread"); } @Override protected void onHandleIntent(Intent intent) { Log.d("SingleService", Thread.currentThread().getName()); try { Thread.sleep(5 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } }}继承Service--并发处理多个请求

public class MultipleService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, final int startId) { new Thread() { public void run() { Log.d("SingleService", Thread.currentThread().getName()); try { Thread.sleep(5 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } stopSelf(startId); }; }.start(); return super.onStartCommand(intent, flags, startId); }}?

?

?