Activity的生命周期和四种开启模式之我见

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)时会先触发上一个ActivityonPause

再触发下一个ActivityonCreate,onStart,onResume(或者是onRestart,onStart,onResume),再触发上一个ActivityonStop,但是由于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,

上一个ActivityonPause,

singleTaskActivityonRestart,onStart,onResume,

上一个ActivityonStoponDestroy

(当然, 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>

你可能感兴趣的:(android)