步步高面试真题:
- 假设有一个A界面,通过A在同一个栈里面启动了B界面,在B界面点击返回键,返回到A,此时从点击返回键开始,A和B分别经历了哪一些生命周期,按顺序说出来?(下面写代码后打印的答案)
08-29 19:15:21.329 22815-22815/com.example.androidinterviewjxd D/BActivity: onPause 08-29 19:15:21.335 22815-22815/com.example.androidinterviewjxd D/AActivity: onRestart 08-29 19:15:21.336 22815-22815/com.example.androidinterviewjxd D/AActivity: onStart 08-29 19:15:21.338 22815-22815/com.example.androidinterviewjxd D/AActivity: onResume 08-29 19:15:21.391 22815-22815/com.example.androidinterviewjxd D/BActivity: onStop 08-29 19:15:21.392 22815-22815/com.example.androidinterviewjxd D/BActivity: onDestroy
- 讲一下handler,looper,messageQueue他们三者之间的消息?
从handler中获取一个消息对象,把数据封装到消息对象中,通过handler的send…方法把消息push到MessageQueue队列中。 Looper对象会轮询MessageQueue队列,把消息对象取出。 通过dispatchMessage分发给Handler,再回调用Handler实现的handleMessage方法处理消息。
- 消息机制里面通过message.obtain去获取message的实例,为什么这么设计?
/* 关于这个,我特地写代码验证了一下,但是发现new Message更快,网上查资料以及源码里面的注释都推荐使用obtain message,说是可以从global pool里面返回一个新的message实例,可以避免在很多情况下去重新申请对象。 */ package com.example.androidinterviewjxd.handler; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.util.Log; import androidx.appcompat.app.AppCompatActivity; import com.example.androidinterviewjxd.R; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestHandlerActivity extends AppCompatActivity { private static final String TAG = "TestHandlerActivity_jxd"; private static final int NEW_MESSAGE = 111; private static final int HANDLER_OBTAIN_MESSAGE = 222; private static final int HANDLER_OBTAIN_MESSAGE_2 = 333; private static final int HANDLER_OBTAIN_MESSAGE_3 = 444; private static final int MESSAGE_OBTAIN_1 = 555; private volatile long sendNewMessageTime = 0; private volatile long sendHandlerObtainTime = 0; private volatile long sendHandlerObtainTime2 = 0; private volatile long sendHandlerObtainTime3 = 0; private volatile long sendMessageObtain1 = 0; private Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message message) { switch (message.what){ case NEW_MESSAGE: Log.d(TAG,"NEW_MESSAGE: "+(SystemClock.elapsedRealtimeNanos() -sendNewMessageTime)); break; case HANDLER_OBTAIN_MESSAGE: Log.d(TAG,"HANDLER_OBTAIN_MESSAGE: "+(SystemClock.elapsedRealtimeNanos() -sendHa