写点什么

Android 面试:IntentService 源码分析

用户头像
Android架构
关注
发布于: 1 小时前

}


@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


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


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;}

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android面试:IntentService源码分析