在之前的一篇文章我们深入loopers和handler进行分析,看它们是如何同Android主线程相关联的。
今天,我们将继续深入Android主线程同Android组件生命周期的交互。
Activity同orientation changes之间的关系
首先来看看Activity的生命周期和它处理configuration changes 的神奇之处。
这篇文章主要来自于一段类似下面的代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { public void run() { doSomething(); } }); } void doSomething() { // Uses the activity instance } } |
通过上面的代码我们知道, doSomething()
方法会在Activity因为一个configuration change导致 onDestroy()
方法会被调用之后执行。之后,你也不能再使用Activity这个实例了。
基于orientation changes的refresher
设备的 orientation 回来任意时刻发生改变。我们会在一个Activity被创建的时候通过Activity#setRequestedOrientation(int)方法来模拟一个orientation change。
你能预测当这个Activity处于portrait模式时log输出吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class MyActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("Square", "onCreate()"); if (savedInstanceState == null) { Log.d("Square", "Requesting orientation change"); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } } protected void onResume() { super.onResume(); Log.d("Square", "onResume()"); } protected void onPause() { super.onPause(); Log.d("Square", "onPause()"); } protected void onDestroy() { super.onDestroy(); Log.d("Square", "onDestroy()"); } } |
如果你了解 Android 生命周期, 你的预测结果可能是下面的答案:
1 2 3 4 5 6 7 |
onCreate() Requesting orientation change onResume() onPause() onDestroy() onCreate() onResume() |
Android的生命周期正常运转,Activity被created,resumed,然后这个时候orientation change 发生了,Activity被 paused, destroyed,接着一个新的Activity被created 和 resumed。
Orientation changes 和Android主线程
此处有一个重要的细节:一个orientation change 导致Activity 被重新创建是通过向Android主线程的消息队列发送了一个简单的消息。
请看下面通过反射来读取主线程消息队列里面内容的spy代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 oid主线程相关联的。
今天,我们将继续深入Android主线程同Android组件生命周期的交互。 Activity同orientation changes之间的关系首先来看看Activity的生命周期和它处理configuration changes 的神奇之处。 这篇文章主要来自于一段类似下面的代码:
通过上面的代码我们知道, 基于orientation changes的refresher设备的 orientation 回来任意时刻发生改变。我们会在一个Activity被创建的时候通过Activity#setRequestedOrientation(int)方法来模拟一个orientation change。 你能预测当这个Activity处于portrait模式时log输出吗?
如果你了解 Android 生命周期, 你的预测结果可能是下面的答案:
Android的生命周期正常运转,Activity被created,resumed,然后这个时候orientation change 发生了,Activity被 paused, destroyed,接着一个新的Activity被created 和 resumed。 Orientation changes 和Android主线程此处有一个重要的细节:一个orientation change 导致Activity 被重新创建是通过向Android主线程的消息队列发送了一个简单的消息。 请看下面通过反射来读取主线程消息队列里面内容的spy代码:
|