Android Activity
生命周期:
- onCreate() :它在活动第一次被创建的时候调用,所以在方法中完成活动的初始化操作,比如加载布局文件、初始化View、事件绑定等。只会被调用一次。
- onStart() : 在活动在屏幕上由不可见变为可见的时候该方法被调用,但是在这个时候界面是不可交互的。在调用onRestart()方法后会再次调用onStart()方法。
- onResume() : 在活动准备好可以和用户进行交互的时候该方法被调用。此时的活动是处于任务栈的栈顶,并且处于运行状态的。
- onPause() : 在活动处于可见但不可见交互时候该方法被调用。在这个时候我们可以通过在这个方法中将一些消耗CPU的资源释放掉,以及保存活动状态。
- onStop() : 在活动完全不可见的时候该方法被调用。也就是完全被另一个活动覆盖了。
- onDestroy() : 活动即将被销毁前调用,这里面会释放该Activity所占用的资源,这之后活动就变成销毁状态。
- onRestart() : 在活动即将重新启动的时候调用,也就是说该活动需要从停止状态变为运行状态时调用。
那么说完它的理论概念,下面上代码会让理解更加清晰👇👇
public class MainActivity3 extends AppCompatActivity {
private static final String TAG = "ActivityDemo";
private EditText mEditText;
//定义一个String 类型用来存取我们EditText输入的值
private String mString;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
mEditText = (EditText) findViewById(R.id.editText);
Log.e(TAG, "start onCreat输入e~~~");
}
@Override
protected void onStart() {
super.onStart();
Log.e(TAG, "start onStart~~~");
}
//当按HOME键时,然后再次启动应用时,我们要恢复先前状态
@Override
protected void onRestart() {
super.onRestart();
mEditText.setText(mString);
Log.e(TAG, "start onRestart~~~");
}
@Override
protected void onResume() {
super.onResume();
Log.e(TAG, "start onResume~~~");
}
//当我们按HOME键时,我在onPause方法里,将输入的值赋给mString
@Override
protected void onPause() {
super.onPause();
mString = mEditText.getText().toString();
Log.e(TAG, "start onPause~~~");
}
@Override
protected void onStop() {
super.onStop();
Log.e(TAG, "start onStop~~~");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.e(TAG, "start onDestroy~~~");
}
}
然后是布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Please input!!" />
<EditText
android:id="@+id/editText"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
当程序启动后日志结果如下:
E/ActivityDemo: start onCreate~~~
E/ActivityDemo: start onStart~~~
E/ActivityDemo: start onResume~~~
当点击中间的回到主屏幕按钮时,该活动会被挂起,日志如下:
E/ActivityDemo: start onPause~~~
E/ActivityDemo: start onStop~~~
当再次回到程序中时:
E/ActivityDemo: start onRestart~~~
E/ActivityDemo: start onStart~~~
E/ActivityDemo: start onResume~~~
当真正退出程序时:
E/ActivityDemo: start onPause~~~
E/ActivityDemo: start onStop~~~
E/ActivityDemo: start onDestroy~~~
那么到这儿呢,对Activity的生命周期也就有了一定的了解。
下面来解释一下这些代码是干嘛的:
protected void onPause() {
super.onPause();
//当活动处理可见但却不可交互的时候,将在输入匡中的内容获取并保存下来
mString = mEditText.getText().toString();
Log.e(TAG, "start onPause~~~");
}
protected void onRestart() {
super.onRestart();
//当再次启动时候,将之前输入框中的内容再次写入输入框,避免活动从停止到运行状态和时之前输入的内容需要再次输入
mEditText.setText(mString);
Log.e(TAG, "start onRestart~~~");
}
Activity启动方式
Android启动提供了四种启动方式:
- 标准模式(
Standard
) - 栈顶复用模式(
SingleTop
) - 栈内复用模式(
SingleTask
) - 单例模式(
SingleInstance
)
存储方式:
-
Activity
的管理方式 = 任务栈 -
任务栈 采用的结构 = “后进先出” 的栈结构
-
每按一次Back键,就有一个
Activity
出栈
四种启动模式的区别:
启动模式的设置:
AndroidMainifest
中配置
<activity
android:launchMode="启动模式"
//属性
//standard:标准模式
//singleTop:栈顶复用模式
//singleTask:栈内复用模式
//singleInstance:单例模式
//如不设置,Activity的启动模式默认为**标准模式(standard)**
</activity>
- 通过
Intent
设置标志位
Intent inten = new Intent (ActivityA.this,ActivityB.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
标志位属性:
标记位属性 | 含义 |
---|---|
FLAG_ACTIVITY_SINGLE_TOP | 指定启动模式为栈顶复用模式(SingleTop ) |
FLAG_ACTIVITY_NEW_TASK | 指定启动模式为栈内复用模式(SingleTask ) |
FLAG_ACTIVITY_CLEAR_TOP | 所有位于其上层的Activity都要移除,SingleTask 模式默认具有此标记效果 |
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | 具有该标记的Activity不会出现在历史Activity的列表中,即无法通过历史列表回到该Activity上 |
两种启动模式的区别:
- 优先级不同
Intent
设置方式的优先级 > Manifest
设置方式
- 限定范围不同
Manifest
设置方式无法设定 FLAG_ACTIVITY_CLEAR_TOP
;Intent
设置方式 无法设置单例模式(SingleInstance
)