Activity是安卓开发最常用的一个组件,网上好像并没有对四种模式开启Activity时候的Activity的生命周期变化的文章,以下是我对Activity的生命周期和四种开启模式的一些理解,不喜勿喷,谢谢
Activity的生命周期,Activity有七个生命周期
onCreate Activity创建时调用的方法,代表Activity被创建
onRestart Activity 重新可见时调用的方法
onStart Activity处于可视化调用的方法,代表Activity可见
onResume Activity获取焦点时调用的方法
onPause Activity 失去焦点时调用的方法
onStop Activity 失去焦点时调用的方法 ,代表Activity不可见
onDestroy Activity销毁时调用的方法 代表Activity被销毁
正常点击应用程序图标进入Activity会先后触发onCreate,onStart,onResume
正常返回退出Activity会先后触发onPause,onStop,onDestroy
而Home键退出Activity,或者开启其他的Activity界面时(实际上并没有关闭Activity)会先后触发onPause,onStop
上述状态退出Activity后再点应用程序图标进入Activity会先后触发onRestart,onStart,onResume
切换不同的Activity(并不关闭当前Activity)时会先触发上一个Activity的onPause
再触发下一个Activity的onCreate,onStart,onResume(或者是onRestart,onStart,onResume),再触发上一个Activity的onStop,但是由于Activity有四种不同的开启模式,使得在一个Activity中开启另外的Activity或者再开启一次Activity本身显得非常有意思了
在一个Activity中开启方式有四种不同的方式
standard (默认的开启模式):会在当前任务栈栈顶再创建一个新的Activity的实例
singleTop (单一顶部模式):如果当前的Activity已在栈顶,就不会创建一个新的Activity,而且复用以前的
singleTask (单一任务栈模式):在整个任务栈中只允许存在一个Activity实例,如果要开启的Activity已经存在,直接复用存在的Activity,并把这个Activity上面的所有其他Activity清空
singleInstance(单一实例模式):整个手机系统只有一个实例存在,并且是运行在自己的单独的任务栈里面,类似于java的单例模式
正常通过程序图标开启开启其他的Activity和通过返回键关闭的Activity调用的方法分别是onCreate,onStart,onResume和onPause,onStop,onDestroy
在切换Activity时可以明显看出"singleInstance"模式下开启的Activity界面切换的动画很大(可能是开启了新任务栈的原因),而其他模式开启的Activity切换动画至是一闪而过.
standard的模式下Activity再开启一次自己Activity
onPause,onCreate,onStart,onResume,onStop
singleTop的模式下Activity再开启一次自己Activity
onPause,onResume
singleTask的模式下再开启一次自己Activity
onPause,onResume
singleInstance的模式下Activity再开启一次自己Activity
onPause,onResume
而singleTask模式下的Activity开启了其他模式的Activity后,再开启一次自己的Activity会
先把其他的除上一个Activity的其他Activity销毁,
之后可视化自己,
再销毁上一个Activity
对应的触发的生命周期方法就是,
其他Activity(除上一个)的onDestroy,
上一个Activity的onPause,
singleTaskActivity的onRestart,onStart,onResume,
上一个Activity的onStop和onDestroy
(当然, singleTask模式不会销毁singleInstance模式下的Activity,因为彼此不在同一个任务栈)
以上的结论都是我通过自己打Log测试出来的,感兴趣的小伙伴也可以自己测试一下,加深一下映象,下面是我的代码,
很简单的布局文件,只有四个按钮,分别对应开启四种开启模式,四种开启模式开启的Activity也是用的这个布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<Button
android:id="@+id/bt_open_activity1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开启A1" />
<Button
android:id="@+id/bt_open_activity2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开启A2" />
<Button
android:id="@+id/bt_open_activity3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开启A3" />
<Button
android:id="@+id/bt_open_activity4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="开启A4" />
LinearLayout>
LinearLayout>
五个Activity写的代码都大致相同,就是打Log开启其他的Activity,复制粘贴改一下名字就好了
package com.fyuu.test;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivityextends Activityimplements OnClickListener{
private static final StringTAG ="MainActivity";
private Button bt_open_activity1;
private Button bt_open_activity2;
private Button bt_open_activity3;
private Button bt_open_activity4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_open_activity1 = (Button) findViewById(R.id.bt_open_activity1);
bt_open_activity2 = (Button) findViewById(R.id.bt_open_activity2);
bt_open_activity3 = (Button) findViewById(R.id.bt_open_activity3);
bt_open_activity4 = (Button) findViewById(R.id.bt_open_activity4);
bt_open_activity1.setOnClickListener(this);
bt_open_activity2.setOnClickListener(this);
bt_open_activity3.setOnClickListener(this);
bt_open_activity4.setOnClickListener(this);
Log.i(TAG, "onCreate");
}
@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart");
}
@Override
protected void onStart() {
super.onStart();
Log.i(TAG, "onStart");
}
@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume");
}
@Override
protected void onPause() {
Log.i(TAG, "onPause");
super.onPause();
}
@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy");
}
@Override
public void onClick(View v) {
Intent intent;
switch (v.getId()) {
case R.id.bt_open_activity1:
intent = new Intent(this, Activity1.class);
startActivity(intent);
break;
case R.id.bt_open_activity2:
intent = new Intent(this, Activity2.class);
startActivity(intent);
break;
case R.id.bt_open_activity3:
intent = new Intent(this, Activity3.class);
startActivity(intent);
break;
case R.id.bt_open_activity4:
intent = new Intent(this, Activity4.class);
startActivity(intent);
break;
}
}
}
清单文件,给四个Activity配置了四种不同的开启模式
xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fyuu.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="18" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.fyuu.test.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<activity
android:label="Activity1"
android:name="com.fyuu.test.Activity1"
android:launchMode="standard" >
activity>
<activity
android:label="Activity2"
android:name="com.fyuu.test.Activity2"
android:launchMode="singleTop" >
activity>
<activity
android:label="Activity3"
android:name="com.fyuu.test.Activity3"
android:launchMode="singleTask" >
activity>
<activity
android:label="Activity4"
android:name="com.fyuu.test.Activity4"
android:launchMode="singleInstance" >
activity>
application>
manifest>