安卓中,不同的活动是通过类似栈的结构来进行切换的,即最晚发生的活动位于栈顶,当这个操作结束,从栈顶弹出该活动,再次执行新的栈顶活动。
其主要有以下的状态(图片源于菜鸟教程),这个是个安卓中活动的生存周期过程,类似Java中的 Servlet的周期,不过更复杂些。
其中,每个活动周期的使用场景为:
1 onCreate() 这是第一个回调,在活动第一次创建时调用,仅在整个活动中调用一次,用来创建整个工程
2 onStart() 这个回调在活动为用户可见时被调用,开始我们的操作
3 onResume() 这个回调在应用程序与用户开始可交互的时候调用,也就是继续执行,在活动创建结束后,会依次经过 onCreate ->onStart->onResume,等待继续操作
4 onPause() 被暂停的活动无法接受用户输入,不能执行任何代码。当前活动将要被暂停,上一个活动将要被恢复时调用,一般在没有全屏覆盖情况下,让底层的活动先暂停
5 onStop() 当活动不在可见时调用,相当于在安卓页面中发生了页面跳转
6 onDestroy() 当活动被系统销毁之前调用,也只调用一次,用来销毁活动
7 onRestart() 当活动被停止以后重新打开时调用
具体实例
代码部分,包括三个活动,MainActivity DialogActivity SecondActivity ,其中MainActivity 和 SecondActivity 之间发生页面的切换,MainActivity DialogActivity 两者之间不发生页面切换,只是DialogActivity 会浮于 MainActivity 上方。
1 MainActivity
//声明组件名称
private Button button1,button2;
private final String TAG="MainActivity";
//创建
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init_view();
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()");
}
/**
* 初始化视图
*/
public void init_view(){
//根据id加载按钮对象
button1=findViewById(R.id.button1);//SecondActivity
button2=findViewById(R.id.button2);
// 为按钮添加事件监听器
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//接收来自其他页面的返回值
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,DialogActivity.class);
startActivity(intent);
}
});
}
**2 DialogActivity SecondActivity 为两个空的 Activity **
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dialog);
}
MainActivity 对应的 activity_main 布局文件中添加按钮,同时整体布局更改为LinearLayout 布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="SecondActivity" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="DialogActivity" />
</LinearLayout>
DialogActivity 对应的 AndroidManifest.xml 设置为对话弹出框的布局
<activity android:name=".DialogActivity"
android:theme="@style/Theme.AppCompat.Dialog">
</activity>
SecondActivity 对应的 activity_second 布局文件中添加按钮
<Button
android:id="@+id/button3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="button2"
/>
主页面布局
运行过程
1 打开运行虚拟机,打印的日志为:
D/MainActivity: onCreate()
D/MainActivity: onStart()
D/MainActivity: onResume()
2 点击 SecondActivity按钮时:
D/MainActivity: onPause()
D/MainActivity: onStop()
3 点击下面的返回按钮时:
D/MainActivity: onRestart()
onStart()
D/MainActivity: onResume()
4 点击 DialogActivity 时
D/MainActivity: onPause()
5 对话框运行结束:
D/MainActivity: onResume()