01-Activity生命周期及启动模式

Posted toly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了01-Activity生命周期及启动模式相关的知识,希望对你有一定的参考价值。

既然总结安卓,第一个上场的人物自然是Activity。首先从生命周期来看,具体分析的是A01_ActivityLifeCycle类。A01_ActivityLifeCycle 两个按钮,分别打开A01_TaskActivity和A01_DialogActivity。用日志查看方法调用情况。
 
Activity生命周期:为了区别三个Activity,分别为期添加了label,并为A01_DialogActivit添加了Dialog样式。布局就几个按钮,就不贴代码
技术分享图片

androidManifest.xml
 1 <activity android:name="top.toly.www.unit_common.activity.A01_ActivityLifeCycle"
 2           android:label="A01_ActivityLifeCycle">
 3 </activity>
 4 <activity
 5     android:name=".activity.A01_TaskActivity"
 6     android:label="A01_TaskActivity">
 7 </activity>
 8 <activity
 9     android:name=".activity.A01_DialogActivity"
10     android:label="A01_DialogActivity"
11     android:theme="@style/AlertDialog.AppCompat.Light">
12 </activity>
  • 打开A01_ActivityLifeCycle:onCreate: ==>onStart: ==>onResume:

技术分享图片

  • A01_ActivityLifeCycle点击按钮打开A01_TaskActivity:onPause: ==>onStop:
 技术分享图片
  • 返回键到A01_ActivityLifeCycle:onRestart: ==>onStart: ==>onResume:

技术分享图片

  • 打开A01_ActivityLifeCycle点击按钮打开A01_DialogActivity:onPause:

技术分享图片

  • 返回键到A01_ActivityLifeCycle:onResume:

技术分享图片

  • 旋转屏幕:onPause: ==>onStop:==>onDestroy==>onCreate: ==>onStart: ==>onResume: 相当于销毁在重建

技术分享图片


A01_ActivityLifeCycle
 1 package top.toly.www.unit_common.activity;
 2 
 3 import android.content.Intent;
 4 import android.os.Bundle;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.util.Log;
 7 import android.view.View;
 8 import android.widget.Button;
 9 
10 import butterknife.Bind;
11 import butterknife.ButterKnife;
12 import butterknife.OnClick;
13 import top.toly.www.unit_common.R;
14 
15 public class A01_ActivityLifeCycle extends AppCompatActivity {
16     private static final String TAG = "A01_ActivityLifeCycle";
17     @Bind(R.id.btn_task_activity)
18     Button mBtnTaskActivity;
19     @Bind(R.id.btn_dialog_activity)
20     Button mBtnDialogActivity;
21 
22     @Override//Activity第一次创建时调用
23     protected void onCreate(Bundle savedInstanceState) {
24         super.onCreate(savedInstanceState);
25         setContentView(R.layout.a01_lifecycle);
26         ButterKnife.bind(this);
27         Log.e(TAG, "onCreate: ");
28 
29         Log.e("TASK_ID", "Task id is " + getTaskId());
30     }
31 
32     @Override//Activity可见的时候调用
33     protected void onStart() {
34         super.onStart();
35         Log.e(TAG, "onStart: ");
36 
37     }
38 
39     @Override//Activity位于栈顶,获取焦点时调用
40     protected void onResume() {
41         super.onResume();
42         Log.e(TAG, "onResume: ");
43     }
44 
45 
46     @Override//Activity移除栈顶,失去焦点时调用
47     protected void onPause() {
48         super.onPause();
49         Log.e(TAG, "onPause: ");
50     }
51 
52     @Override//由停止状态变为运行状态之前调用
53     protected void onRestart() {
54         super.onRestart();
55         Log.e(TAG, "onRestart: ");
56     }
57 
58     @Override//Activity不可见的时候调用
59     protected void onStop() {
60         super.onStop();
61         Log.e(TAG, "onStop: ");
62     }
63 
64     @Override//Activity销毁的时候调用
65     protected void onDestroy() {
66         super.onDestroy();
67         Log.e(TAG, "onDestroy: ");
68     }
69 
70     @OnClick({R.id.btn_task_activity, R.id.btn_dialog_activity})
71     public void onViewClicked(View view) {
72         switch (view.getId()) {
73             case R.id.btn_task_activity:
74                 startActivity(new Intent(this, A01_TaskActivity.class));
75                 break;
76             case R.id.btn_dialog_activity:
77                 startActivity(new Intent(this, A01_DialogActivity.class));
78                 break;
79         }
80     }
81 }
Activity启动方式: standard、singleTop、singleTask 、singleInstance
通过A01_TaskActivity启动自己,和返回,观察A01_TaskActivity内存地址进行比较
技术分享图片
standard:android:launchMode="standard":默认的启动模式 先进后出 依次叠加
打开四个A01_TaskActivity:分析内存地址都不一样,可见standard,每打开Activity新建一个实例,返回四次才能退出。
技术分享图片
 
singleTop:android:launchMode="singleTop"其为顶部,则用之。不管点多少次打开自己,都只会是一个实例。

技术分享图片

当打开别的Activity后返回,也是该实例(因为该实例还没有onDestroy)。但当打开别的Activity,别的Activity再打开A01_TaskActivity时就会创建型的实例。
 
singleTask:android:launchMode="singleTask"压着我的人注意了,我打开时会把你们统统抹杀。
打开A01_ActivityLifeCycle:
技术分享图片
之后打开A01_TaskActivity:
技术分享图片
再打开A01_ActivityLifeCycle
技术分享图片
重点来了:打开A01_TaskActivity:被压在下面的A01_TaskActivity吧A01_ActivityLifeCycle抹杀了
 
singleInstance:android:launchMode="singleInstance"呵呵,我有自己的办公室,不跟你们挤来挤去
设成singleInstance之前,其他模式下的,打开不同的Activitytaskid都是一样的
技术分享图片
设成singleInstance之后,独占一个任务栈
技术分享图片
注意:此时用A01_TaskActivity和A01_ActivityLifeCycle互相循环打开多次,按返回键时你会发现出现的都是A01_ActivityLifeCycle,一直返回到头最后一个Activity才是A01_TaskActivity。
 

A01_TaskActivity :
 1 package top.toly.www.unit_common.activity;
 2 import android.content.Intent;
 3 import android.os.Bundle;
 4 import android.support.v7.app.AppCompatActivity;
 5 import android.util.Log;
 6 import android.view.View;
 7 import android.widget.Button;
 8 import butterknife.Bind;
 9 import butterknife.ButterKnife;
10 import butterknife.OnClick;
11 import top.toly.www.unit_common.R;
12 
13 public class A01_TaskActivity extends AppCompatActivity {
14     private static final String TAG = "A01_TaskActivity";
15     @Bind(R.id.btn_start_self)
16     Button mBtnStartSelf;
17     @Bind(R.id.button_start_others)
18     Button mButtonStartOthers;
19 
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.a01_task);
24         ButterKnife.bind(this);
25         Log.e(TAG, this.toString());
26         Log.e("TASK_ID", "Task id is " + getTaskId());
27     }
28     @Override
29     protected void onDestroy() {
30         super.onDestroy();
31     }
32     @OnClick({R.id.btn_start_self, R.id.button_start_others})
33     public void onViewClicked(View view) {
34         switch (view.getId()) {
35             case R.id.btn_start_self:
36                 startActivity(new Intent(this, A01_TaskActivity.class));
37                 break;
38             case R.id.button_start_others:
39                 startActivity(new Intent(this, A01_ActivityLifeCycle.class));
40                 break;
41         }
42     }
43 
44 }
A01_DialogActivity :
 1 package top.toly.www.unit_common.activity;
 2 import android.os.Bundle;
 3 import android.support.v7.app.AppCompatActivity;
 4 import android.util.Log;
 5 import top.toly.www.unit_common.R;
 6 public class A01_DialogActivity extends AppCompatActivity {
 7     @Override
 8     protected void onCreate(Bundle savedInstanceState) {
 9         super.onCreate(savedInstanceState);
10         setContentView(R.layout.a01_dialog);
11         Log.e("TASK_ID", "Task id is " + getTaskId());
12     }
13 
14 }

 

 

以上是关于01-Activity生命周期及启动模式的主要内容,如果未能解决你的问题,请参考以下文章

Android Activity生命周期及启动模式

在不存在的片段上调用片段生命周期和 onCreate 的问题

关于片段生命周期,何时调用片段的 onActivityResult?

Activity生命周期

关于Activity和Fragment生命周期的问题

Activity生命周期以及启动模式对生命周期的影响