Android - Activity LaunchMode相关知识验证
0、关于任务与Activity返回栈 高质量译文:
「深入讲解Android中Activity launchMode」 http://droidyue.com/blog/2015/08/16/dive-into-android-activity-launchmode/
1、Activity协调:Activity A 打开 Activity B:
A:onPause
B:onCreate - onStart - onResume
A:onSaveInstanceState - onStop
2、前提条件(A:singleTask, STACK:A-B)
1)Activity B 打开 Activity A
B:onPause
A:onNewIntent - onRestart - onStart - onResume
B:onStop - onDestroy
[注] Activity出栈不会执行onSaveInstanceState
2)Activity B 打开 Activity C
B:onPause
C:onCreate - onStart - onResume
B:onSaveInstanceState - onStop
[注] Activity失去栈顶位置,会执行onSaveInstanceState
3)(STACK:A-B-C), Activity C 按下返回键
C:onPause
B:onRestart - onStart - onResume
C:onStop - onDestroy
[注] Activity重回栈顶,不会执行onRestoreInstanceState
4)(STACK:A-B-C), Activity C 按下home键
C:onPause - onSaveInstanceState - onStop
3、前提条件(A:singleTask, STACK:A-B-C)
1)Activity C 打开 Activity A
B:onDestroy
C:onPause
A:onNewIntent - onRestart - onStart - onResume
C:onStop - onDestroy
[注]singleTask模式下,若栈中已存在目标Activity,则目标Activity上方的Activity将被出栈
4、Activity A 转屏
A:onPause - onSaveInstanceState - onStop - onDestroy
A:onCreate - onStart - onRestoreInstanceState - onResume
[注]配置变更,Activity将重建(onDestroy - onCreate)
5、Activity onCreate() 中调用 finish()
onCreate - onDestroy
[注]调用finish()将直接执行onDestroy,跳过其它生命周期
6、(STACK:A-B-C) C中销毁B.finish(), C按下返回键
B:onDestroy //C中销毁B
----------------------
C:onPause
A:onRestart - onStart - onResume
C:onStop - onDestroy
[注]Activity.finish()后,Activity将销毁,并从栈中移除
7、Activity开启自行处理配置变更,如 android:configChanges="orientation|screenSize"
1)转屏
onConfigurationChanged
[注]自行处理配置变更,当其中一个配置发生变化,Activity不会重启,而是收到对 onConfigurationChanged() 的调用
代码如下:
MainActivity:
package com.android.testlifeterm;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String TAG="MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnToSecond=(Button)findViewById(R.id.btnToSecond);
Button btnToThird=(Button)findViewById(R.id.btnToThird);
btnToSecond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
}
});
btnToThird.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, ThirdActivity.class);
startActivity(intent);
}
});
Log.d(TAG, "onCreate");
startService(new Intent(this, FirstService.class));
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@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");
stopService(new Intent(this, FirstService.class));
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "onSaveInstanceState");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "onRestoreInstanceState");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, "onConfigurationChanged");
}
}
SecondActivity:
package com.android.testlifeterm;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
/**
* Created by Yizhui on 2016/6/15.
*/
public class SecondActivity extends AppCompatActivity {
private static final String TAG="SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Button btnToMain=(Button)findViewById(R.id.btn2to1);
Button btnToThird=(Button)findViewById(R.id.btn2to3);
btnToMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SecondActivity.this,MainActivity.class);
startActivity(intent);
}
});
btnToThird.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(SecondActivity.this,ThirdActivity.class);
startActivity(intent);
}
});
ActivityManager.getInstance().addActivity(this);
Log.d(TAG, "onCreate");
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@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
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "onSaveInstanceState");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "onRestoreInstanceState");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, "onConfigurationChanged");
}
}
ThirdActivity:
package com.android.testlifeterm;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
/**
* Created by Yizhui on 2016/6/15.
*/
public class ThirdActivity extends AppCompatActivity {
private static final String TAG="ThirdActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_third);
Button btnToMain=(Button)findViewById(R.id.btn3to1);
Button btnToSecond=(Button)findViewById(R.id.btn3to2);
Button btnFinish2=(Button)findViewById(R.id.btnFinish2);
btnToMain.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(ThirdActivity.this,MainActivity.class);
startActivity(intent);
}
});
btnToSecond.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(ThirdActivity.this,SecondActivity.class);
startActivity(intent);
}
});
btnFinish2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Activity activity=ActivityManager.getInstance().getActivity(0);
if(activity!=null){
activity.finish();
}
}
});
Log.d(TAG, "onCreate");
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG,"onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart");
}
@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
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "onSaveInstanceState");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d(TAG, "onRestoreInstanceState");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, "onConfigurationChanged");
}
}
ActivityManager:
package com.android.testlifeterm;
import android.app.Activity;
import java.util.ArrayList;
/**
* Created by Yizhui on 2016/6/16.
*/
public class ActivityManager {
private ArrayList<Activity> mActivityList=new ArrayList<>();
private static ActivityManager instance;
private ActivityManager(){}
public static ActivityManager getInstance(){
if(instance==null){
synchronized (ActivityManager.class){
if(instance==null){
instance=new ActivityManager();
}
}
}
return instance;
}
public void addActivity(Activity activity){
mActivityList.add(activity);
}
public void removeActivity(Activity activity){
mActivityList.remove(activity);
}
public void removeAllActivity(){
for(int i=mActivityList.size();i>0;i--){
mActivityList.remove(i);
}
}
public Activity getActivity(int index){
if(index<0 || index>=mActivityList.size())
return null;
return mActivityList.get(index);
}
}
FirstService:
package com.android.testlifeterm;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
/**
* Created by Yizhui on 2016/6/16.
*/
public class FirstService extends Service {
private static String TAG="FirstService";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG,"onStartCommand");
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy");
}
}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.android.testlifeterm.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MainActivity"
android:id="@+id/textView" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open second activity"
android:id="@+id/btnToSecond"
android:layout_below="@+id/textView"
android:layout_alignParentStart="true"
android:layout_marginTop="77dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open third activity"
android:id="@+id/btnToThird"
android:layout_below="@+id/btnToSecond"
android:layout_alignParentStart="true"
android:layout_marginTop="25dp" />
</RelativeLayout>
activity_second.xml:
<?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="wrap_content"
android:layout_height="wrap_content"
android:text="SecondActivity" />
<Button
android:id="@+id/btn2to1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open main activity" />
<Button
android:id="@+id/btn2to3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open third activity" />
</LinearLayout>
activity_third.xml:
<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="wrap_content"
android:layout_height="wrap_content"
android:text="ThirdActivity" />
<Button
android:id="@+id/btn3to1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open main activity" />
<Button
android:id="@+id/btn3to2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open second activity" />
<Button
android:id="@+id/btnFinish2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Finish Activity Second"
/>
</LinearLayout>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.testlifeterm">
<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" android:launchMode="singleTask" android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"/>
<activity android:name=".ThirdActivity"/>
<service android:name=".FirstService"></service>
</application>
</manifest>
可参考:
http://niorgai.github.io/2014/12/08/Activity%E4%B8%ADlaunchMode%E7%9A%84%E5%80%BC/
浙公网安备 33010602011771号