onCreate 在活动第一次被创建的时候调用
退出程序
onPause 暂定, 在系统准备去启动or恢复另一个活动的时候调用
onDestroy 活动被销毁之前调用,之后活动变销毁状态
再次进入程序主界面
onStart 活动由不可见变为可见的时候调用
onResume 在准备好和用户进行交互的时候调用
进入dialog界面
onPause 这里是暂定主页面的活动
退出dialog
onRestart 在活动由停止状态变运行状态前调用,这里应该是调用主界面
onStart start主界面
onResume
进入normal界面
onPause 暂停情况下的活动是有可能被回收的
退出normal界面
onRestart
onStart
onResume
退出程序
onDestroy
用户进入A,通过A进入B,A暂停时候被回收掉了,B从A返回A
A会onCreate(而不是 onRestart),为了将A的临时数据保存,
需要使用回调方法 onSaveInstanceState()
public class NormalActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.normal_layout);}
}
public class MainActivity extends AppCompatActivity {
public static final String TAG ="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button startNormalActivity =(Button)findViewById(R.id.start_normal_activity);
Button startDialogActivity =(Button)findViewById(R.id.start_dialog_activity);
startNormalActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, NormalActivity.class);
startActivity(intent);
}
});
startDialogActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DialogActivity.class);
startActivity(intent);
}
});
Log.d(TAG,"onCreate Main");
}
@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 onDestroy(){
super.onDestroy();
Log.d(TAG,"onDestroy");
}
@Override
protected void onRestart(){
super.onRestart();
Log.d(TAG,"onRestart");
}
}
public class DialogActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_layout);}
}
standard启动模式
com.sqh.courselife.FirstActivity@eea6364
add activity client record, r= ActivityRecord{ccc7ca9 token=android.os.BinderProxy@10c3b8 {com.sqh.courselife/com.sqh.courselife.FirstActivity}} token= android.os.BinderProxy@10c3b8
启动FirstActivity 出现上述 ,再点击按钮,事件为从FirstActivity转到FirstActivity
2021-08-12 20:11:12.529 8305-8305/com.sqh.courselife D/FirstActivity: com.sqh.courselife.FirstActivity@e604e90
2021-08-12 20:11:12.546 8305-8305/com.sqh.courselife D/ActivityThread: add activity client record, r= ActivityRecord{39d4cee token=android.os.BinderProxy@117bb8d {com.sqh.courselife/com.sqh.courselife.FirstActivity}} token= android.os.BinderProxy@117bb8d
即重新再建一个实例入栈,如果要回到主界面,需要按返回键2次
Single Top启动模式(解决重复栈顶创建问题)
如果发现返回栈顶的活动(即将要执行的活动、呈现的页面)为当前页面,那么就不会再创建
新的实例,直接使用当前的。
具体做法为在活动注册文件, 对象的活动 中写上
android:launchMode=“singleTop”.
但是如果A是暂停状态,我们由B转到A活动时(未转的时候栈顶为B), A实例还是会再次新建
SingleTask
使程序上下文只存在一个唯一的实例
android:launchMode=“singleTask”.
singleInstance
会返回一个新的返回栈来管理这个重复的活动,
应用场景:X程序里的a活动需要被A,B,C等很多程序调用
那么把a活动设定为 singleInstance,A调用a的时候,程序A单独开个栈来接受他
B也单独开个栈来管理a,C同理。
如果一个程序里其他b,c,d活动调用a,也会分别创建栈,但浪费资源,因为
多创建了无用的栈和重复的活动a,这种情况最好用SingleTask,全文只有一个实例,
占用资源少,但功能一样,
举例:运行程序进入
FirstActivity,再进入SecondActivity,再进入ThirdActivity
通过getTaskId 在Log打印内容如下
171
172
171
看出活动1,3在同一个栈,活动2在栈172,不是同一个。
然后在活动3点back,会直接回到活动1(原因也很明显,活动3从栈171移开
当前171的栈顶自然为活动1)