下拉状态栏生命周期
下拉通知栏对Activity的生命周期没有影响。
onPause()是否调用的关键就是,是否有另一个Activity参与进来了。
而网上流传甚广的onPause()和onStop()调用中提到的“遮挡”,应该修正为“被Activity遮挡”
PS: 根据AlertDialog和Toast的源码,可以发现它们显示的原理,都是通过WindowManager.addView()来显示的。也就是说,AlertDialog和Toast可以看做是当前Activity的一部分View,当然也不会对Activity的生命周期构成影响。
多窗口生命周期
我们都知道,使用多窗口的时候应用界面就会缩小很多,我们需要考录不同屏幕尺寸的适配模式,所以尽量不要出现屏幕尺寸变化过大界面无法正常显示的情况~
那么,
既然多窗口这么烦啊哈哈,
我们如何禁用呢?
禁用多窗口
resizeableActivity
在targetSdkVersion
为24以上才起作用,否则该属性无效。
// Application中
// false表示禁用,默认为true
android:resizeableActivity="false"
当targetSdkVersion
低于24时,活动不允许横竖屏切换,应用也将不支持多窗口模式。
// 在activity中,portrait表示只支持竖屏,landscape只支持横屏
android:screenOrientation="portrait"
多窗口下的生命周期
// FirstApp
public class MainActivity extends AppCompatActivity {
private static final String TAG = "FIRST_APP";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
}
// SecondApp同上
启动FirstApp
FirstApp:onCreate() -> onStart() -> onResume()
当FirstApp处于onResume()状态时,进入多窗口模式,MainActivity经历了重新创建的过程。
FirstApp:onPause() -> onStop() -> onDestory() -> onCreate() -> onStart() -> onResume() ->onPause()
启动SecondApp
SecondApp:onCreate() -> onStart() -> onResume()
操作FirstApp
SecondApp:onPause()
FirstApp:onResume()
PS
- 最好不要在活动的
onPause()
方法中处理视频播放器的暂停,应该在onStop()
总进行处理,在onStart()
中回复视频播放。 - 在
AndroidManifest.xml
这对活动进行配置,活动不会被重建。将屏幕变化通知到Activity中的onConfigurationChanged()
方法中。
// activity中
android:configChanges="orientation|keyboardHidden|screenSize|screenLayout"