01-Activity生命周期及启动模式
Posted toly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01-Activity生命周期及启动模式相关的知识,希望对你有一定的参考价值。
既然总结安卓,第一个上场的人物自然是Activity。首先从生命周期来看,具体分析的是A01_ActivityLifeCycle类。A01_ActivityLifeCycle 两个按钮,分别打开A01_TaskActivity和A01_DialogActivity。用日志查看方法调用情况。
Activity生命周期:为了区别三个Activity,分别为期添加了label,并为A01_DialogActivit添加了Dialog样式。布局就几个按钮,就不贴代码
androidManifest.xml
1 <activity android:name="top.toly.www.unit_common.activity.A01_ActivityLifeCycle" 2 android:label="A01_ActivityLifeCycle"> 3 </activity> 4 <activity 5 android:name=".activity.A01_TaskActivity" 6 android:label="A01_TaskActivity"> 7 </activity> 8 <activity 9 android:name=".activity.A01_DialogActivity" 10 android:label="A01_DialogActivity" 11 android:theme="@style/AlertDialog.AppCompat.Light"> 12 </activity>
- 打开A01_ActivityLifeCycle:onCreate: ==>onStart: ==>onResume:
-
A01_ActivityLifeCycle点击按钮打开A01_TaskActivity:onPause: ==>onStop:
- 返回键到A01_ActivityLifeCycle:onRestart: ==>onStart: ==>onResume:
- 打开A01_ActivityLifeCycle点击按钮打开A01_DialogActivity:onPause:
- 返回键到A01_ActivityLifeCycle:onResume:
- 旋转屏幕:onPause: ==>onStop:==>onDestroy==>onCreate: ==>onStart: ==>onResume: 相当于销毁在重建
A01_ActivityLifeCycle
1 package top.toly.www.unit_common.activity; 2 3 import android.content.Intent; 4 import android.os.Bundle; 5 import android.support.v7.app.AppCompatActivity; 6 import android.util.Log; 7 import android.view.View; 8 import android.widget.Button; 9 10 import butterknife.Bind; 11 import butterknife.ButterKnife; 12 import butterknife.OnClick; 13 import top.toly.www.unit_common.R; 14 15 public class A01_ActivityLifeCycle extends AppCompatActivity { 16 private static final String TAG = "A01_ActivityLifeCycle"; 17 @Bind(R.id.btn_task_activity) 18 Button mBtnTaskActivity; 19 @Bind(R.id.btn_dialog_activity) 20 Button mBtnDialogActivity; 21 22 @Override//Activity第一次创建时调用 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.a01_lifecycle); 26 ButterKnife.bind(this); 27 Log.e(TAG, "onCreate: "); 28 29 Log.e("TASK_ID", "Task id is " + getTaskId()); 30 } 31 32 @Override//Activity可见的时候调用 33 protected void onStart() { 34 super.onStart(); 35 Log.e(TAG, "onStart: "); 36 37 } 38 39 @Override//Activity位于栈顶,获取焦点时调用 40 protected void onResume() { 41 super.onResume(); 42 Log.e(TAG, "onResume: "); 43 } 44 45 46 @Override//Activity移除栈顶,失去焦点时调用 47 protected void onPause() { 48 super.onPause(); 49 Log.e(TAG, "onPause: "); 50 } 51 52 @Override//由停止状态变为运行状态之前调用 53 protected void onRestart() { 54 super.onRestart(); 55 Log.e(TAG, "onRestart: "); 56 } 57 58 @Override//Activity不可见的时候调用 59 protected void onStop() { 60 super.onStop(); 61 Log.e(TAG, "onStop: "); 62 } 63 64 @Override//Activity销毁的时候调用 65 protected void onDestroy() { 66 super.onDestroy(); 67 Log.e(TAG, "onDestroy: "); 68 } 69 70 @OnClick({R.id.btn_task_activity, R.id.btn_dialog_activity}) 71 public void onViewClicked(View view) { 72 switch (view.getId()) { 73 case R.id.btn_task_activity: 74 startActivity(new Intent(this, A01_TaskActivity.class)); 75 break; 76 case R.id.btn_dialog_activity: 77 startActivity(new Intent(this, A01_DialogActivity.class)); 78 break; 79 } 80 } 81 }
Activity启动方式: standard、singleTop、singleTask 、singleInstance
通过A01_TaskActivity启动自己,和返回,观察A01_TaskActivity内存地址进行比较
standard:android:launchMode="standard":默认的启动模式 先进后出 依次叠加
打开四个A01_TaskActivity:分析内存地址都不一样,可见standard,每打开Activity新建一个实例,返回四次才能退出。
singleTop:android:launchMode="singleTop"其为顶部,则用之。不管点多少次打开自己,都只会是一个实例。
当打开别的Activity后返回,也是该实例(因为该实例还没有onDestroy)。但当打开别的Activity,别的Activity再打开A01_TaskActivity时就会创建型的实例。
singleTask:android:launchMode="singleTask"压着我的人注意了,我打开时会把你们统统抹杀。
打开A01_ActivityLifeCycle:
之后打开A01_TaskActivity:
再打开A01_ActivityLifeCycle
重点来了:打开A01_TaskActivity:被压在下面的A01_TaskActivity吧A01_ActivityLifeCycle抹杀了
singleInstance:android:launchMode="singleInstance"呵呵,我有自己的办公室,不跟你们挤来挤去
设成singleInstance之前,其他模式下的,打开不同的Activitytaskid都是一样的
设成singleInstance之后,独占一个任务栈
注意:此时用A01_TaskActivity和A01_ActivityLifeCycle互相循环打开多次,按返回键时你会发现出现的都是A01_ActivityLifeCycle,一直返回到头最后一个Activity才是A01_TaskActivity。
A01_TaskActivity :
1 package top.toly.www.unit_common.activity; 2 import android.content.Intent; 3 import android.os.Bundle; 4 import android.support.v7.app.AppCompatActivity; 5 import android.util.Log; 6 import android.view.View; 7 import android.widget.Button; 8 import butterknife.Bind; 9 import butterknife.ButterKnife; 10 import butterknife.OnClick; 11 import top.toly.www.unit_common.R; 12 13 public class A01_TaskActivity extends AppCompatActivity { 14 private static final String TAG = "A01_TaskActivity"; 15 @Bind(R.id.btn_start_self) 16 Button mBtnStartSelf; 17 @Bind(R.id.button_start_others) 18 Button mButtonStartOthers; 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 super.onCreate(savedInstanceState); 23 setContentView(R.layout.a01_task); 24 ButterKnife.bind(this); 25 Log.e(TAG, this.toString()); 26 Log.e("TASK_ID", "Task id is " + getTaskId()); 27 } 28 @Override 29 protected void onDestroy() { 30 super.onDestroy(); 31 } 32 @OnClick({R.id.btn_start_self, R.id.button_start_others}) 33 public void onViewClicked(View view) { 34 switch (view.getId()) { 35 case R.id.btn_start_self: 36 startActivity(new Intent(this, A01_TaskActivity.class)); 37 break; 38 case R.id.button_start_others: 39 startActivity(new Intent(this, A01_ActivityLifeCycle.class)); 40 break; 41 } 42 } 43 44 }
A01_DialogActivity :
1 package top.toly.www.unit_common.activity; 2 import android.os.Bundle; 3 import android.support.v7.app.AppCompatActivity; 4 import android.util.Log; 5 import top.toly.www.unit_common.R; 6 public class A01_DialogActivity extends AppCompatActivity { 7 @Override 8 protected void onCreate(Bundle savedInstanceState) { 9 super.onCreate(savedInstanceState); 10 setContentView(R.layout.a01_dialog); 11 Log.e("TASK_ID", "Task id is " + getTaskId()); 12 } 13 14 }
以上是关于01-Activity生命周期及启动模式的主要内容,如果未能解决你的问题,请参考以下文章
在不存在的片段上调用片段生命周期和 onCreate 的问题