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/

  

 

posted @ 2016-06-16 16:12  chenyizh  阅读(196)  评论(0)    收藏  举报