乐趣区

关于android:Android-开发入门活动的生命周期

2.4.1 返回栈

每启动一个新的流动,会在返回栈中入栈,并处于栈顶的地位。每销毁一个流动,处于栈顶的流动会出栈,前一个入栈的流动会从新处于栈顶的地位。

2.4.2 活动状态

  1. 运行状态:位于返回栈栈顶的流动。
  2. 暂停状态:不在栈顶地位,但依然可见。
  3. 进行状态:不在栈顶地位,齐全不可见。可能会被零碎回收。
  4. 销毁状态:在返回栈中移除的流动。

2.4.3 流动的生存期

  • onCreate():流动第一次被创立时调用,在此办法中实现流动的初始化工作。
  • onStart():流动由不可见变为可见时调用。
  • onResume():在流动筹备好和用户进行交互时调用。此时流动位于栈顶,并处于运行状态。
  • onPause():零碎筹备去启动或复原另一个流动时调用。启动新的对话框流动,此办法会被调用。
  • onStop():在流动齐全不可见时调用。启动新的对话框流动,此办法不会被调用。
  • onDestroy():流动被销毁前被调用。
  • onRestart():流动由进行状态变为运行状态前调用。

能够将流动分为 3 中生存期:

  • 残缺生存期。在 onCreate() 和 onDestroy() 之间所经验的。
  • 可见生存期。在 onStart() 和 onStop() 之间所经验的。
  • 前台生存期。在 onResume() 和 onPause() 之间所经验的。

2.4.4 体验流动的生命周期

# app/src/main/res/layout/normal_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a normal activity"
        />

</LinearLayout>
# app/src/main/res/layout/dialog_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a dialog activity"
        />

</LinearLayout>
# app/src/main/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activitylifecycletest">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".NormalActivity">
        </activity>
        <activity android:name=".DialogActivity"
            # DialogActivity 流动应用 Dialog 对话框主题
            android:theme="@android:style/Theme.Dialog">
        </activity>
    </application>

</manifest>
# app/src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/start_normal_activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Start NormalActivity" />

    <Button
        android:id="@+id/start_dialog_activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Start DialogActivity" />

</LinearLayout>
# app/src/main/java/com/example/activitylifecycletest/MainActivity.java

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        setContentView(R.layout.activity_main);
        Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);
        Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);
        
        // 启动 NormalActivity 流动
        startNormalActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {Intent intent = new Intent(MainActivity.this, NormalActivity.class);
                startActivity(intent);
            }
        });
        
        // 启动 DialogActivity 流动
        startDialogActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {Intent intent = new Intent(MainActivity.this, DialogActivity.class);
                startActivity(intent);
            }
        });
    }

    @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");
    }

}

程序启动:Create – Start – Resume

按钮一:Pause – Stop

返回按钮:Restart – Start – Resume

退出程序:Pause – Stop – Destroy

程序启动:Create – Start – Resume

按钮二:Pause

返回按钮:Resume

退出程序:Pause – Stop – Destroy

2.4.5 流动被回收了怎么办

流动进入进行状态,可能会被零碎回收。用户返回流动后,流动不会执行 onRestart() 办法,而是会执行 onCreate() 办法,从新创立一次该流动。

Android 提供了 onSaveInstanceState() 回调办法,保障在流动被回收前被调用,可用于保留上一个流动的长期数据:

    @Override
    protected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);
        // 保留长期数据
        String tempData = "Something you just typed";
        outState.putString("data_key", tempData);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        setContentView(R.layout.activity_main);
        // 取出长期数据
        if(savedInstanceState != null) {String tempData = savedInstanceState.getString("data_key");
            Log.d(TAG, tempData);
        }
    }
退出移动版