Android 面试:IntentService 源码分析
}
@Overridepublic void onStart(Intent intent, int startId) {System.out.println("onStart");super.onStart(intent, startId);}
@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {System.out.println("onStartCommand");return super.onStartCommand(intent, flags, startId);}
@Overridepublic void setIntentRedelivery(boolean enabled) {super.setIntentRedelivery(enabled);System.out.println("setIntentRedelivery");}
@Overrideprotected void onHandleIntent(Intent intent) {//Intent 是从 Activity 发过来的,携带识别参数,根据参数不同执行不同的任务 System.out.println("currentThread()=" + Thread.currentThread().getName());String action = intent.getExtras().getString("param");if (action.equals("oper1")) {System.out.println("Operation1");}else if (action.equals("oper2")) {System.out.println("Operation2");}
try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}
@Overridepublic void onDestroy() {System.out.println("onDestroy");super.onDestroy();}
}
我把生命周期方法全打印出来了,待会我们来看看它执行的过程是怎样的。接下来是 Activity,在 Activity 中来启动 IntentService:
public class TestActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);
//可以启动多次,每启动一次,就会新建一个 work thread,但 IntentService 的实例始终只有一个//Operation 1Intent startServiceIntent = new Intent("com.test.intentservice");Bundle bundle = new Bundle();bundle.putString("param", "oper1");startServiceIntent.putExtras(bundle);startService(startServiceIntent);
//Operation 2Intent startServiceIntent2 = new Intent("com.test.intentservice");Bundle bundle2 = new Bundle();bundle2.putString("param", "oper2");startServiceIntent2.putExtras(bundle2);startService(startServiceIntent2);}}
最后,别忘了配置 Service,因为它继承于 Service,所以,它还是一个 Service,一定要配置,否则是不起作用的
<service android:name=".IntentServiceDemo"><intent-filter ><action android:name="com.test.intentservice"/></intent-filter></service>
最后来看看执行结果:
从结果可以看到,onCreate 方法只执行了一次,而 onStartCommand 和 onStart 方法执行了两次,开启了两个 Work Thread,这就证实了之前所说的,启动多次,但 IntentService 的实例只有一个,这跟传统的 Service 是一样的。Operation1 也是先于 Operation2 打印,并且我让两个操作间停顿了 2s,最后是 onDestroy 销毁了 IntentService。
IntentService 源码分析
@Overridepublic void onCreate() {super.onCreate();HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");thread.start();mServiceLooper = thread.getLooper();mServiceHandler = new ServiceHandler(mServiceLooper);}
源码可知:
1)实际上是使用了一个 HandlerThread 来维护线程的,
2) HandleThread 中,内部已经维护一个 Looper,这里直接使用 HandlerThread 的 Looper 对象,便于在 IntentService 中去维护消息队列,
3)创建的 mServiceHandler 是属于 HandleThread 这个 WorkerThread 的。
private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) {super(looper);}
@Ove
rridepublic void handleMessage(Message msg) {onHandleIntent((Intent)msg.obj);stopSelf(msg.arg1);}}
源码可知:
1)直接把消息交给 onHandleIntent() 方法去执行具体的业务逻辑
2)执行完成之后,立即调用 stopSelf() 方法停止自己
接下来分析 start 源码
@Overridepublic void onStart(Intent intent, int startId) {Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;mServiceHandler.sendMessage(msg);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {onStart(intent, startId);return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;}
评论