活动的生命周期和启动

  • 实验目的
  • 实验内容
  • 实验步骤
  • 一、新建Activity并初始化
  • 二、尝试初运行并添加对话回显
  • 三、在活动间切换&调试
  • 四、验证系统可能自行对活动运行onDestroy
  • 五、利用saveinstantstate处理系统自行运行onDestroy而导致数据丢失的情况
  • 六、standard, singleTop, singleTask三种启动模式之间的区别点


实验目的

理解Android Studio的活动调用过程和生命周期

实验内容

1、通过在不同的活动之间的转换,观察onCreate, onStart, onResume, on Pause, onStop,onDestroy以及onRestart函数的调用情况。
2、通过实验说明存在系统可能自行对活动运行onDestroy。
3、利用saveinstantstate处理系统自行运行onDestroy而导致数据丢失的情况
4、通过实验说明活动的standard, singleTop, singleTask三种启动模式之间的区别点。
5、说明活动singleInstance启动模式的功能

实验步骤

一、新建Activity并初始化

1.在activity中new两个新empty activity,重命名为normal和dialog

android stuio project和android区别 android studio的standard和custom_android


2.在两个activity的layout中分别添加不同的显示,这里在Normal中添加textView,dialog中不用做修改,用以弹出对话框即可,但是要在Manifest里更改activity样式。

android stuio project和android区别 android studio的standard和custom_启动模式_02

<activity android:name=".dialog"
                android:theme="@style/Theme.AppCompat.Dialog"
            ></activity>

3.在value-strings中添加两个词条,用以快速连接text

android stuio project和android区别 android studio的standard和custom_ide_03

<string name="button_normal_name">Goto normal activity</string>
    <string name="button_dialog_name">Goto dialog activity</string>

4.在MainActivity中添加两个button,分别点击text右侧的长条选择上述两个词条

android stuio project和android区别 android studio的standard和custom_启动模式_04


5.最后添加代码,new两个button,并新建点击事件setOnClickListener

@Override
    protected void onCreate(@NonNull Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button button=(Button) findViewById(R.id.button_normal);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,normal.class);
                startActivity(intent);
            }
        });
        
        Button button1=(Button) findViewById(R.id.button_diolog);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent1=new Intent(MainActivity.this,diolog.class);
                startActivity(intent1);
            }
        });
    }
}

二、尝试初运行并添加对话回显

1.试运行很明显分为三个界面。分别如下:

(1)主界面

android stuio project和android区别 android studio的standard和custom_启动模式_05


(2)普通界面

android stuio project和android区别 android studio的standard和custom_ide_06


(3)对话框界面(半透明)

android stuio project和android区别 android studio的standard和custom_android studio_07


2.为了研究onCreate, onStart, onResume, on Pause, onStop,onDestroy以及onRestart函数的调用情况,添加如下代码用以回显

public static final String TAG = "1812190523";
    @Override
    protected void onDestroy(){
        super.onDestroy();
        Log.d(TAG,"onDestroy:");
    }
    @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 onStart(){
        super.onStart();
        Log.d(TAG,"onStart:");
    }
    @Override
    protected void onRestart(){
        super.onRestart();
        Log.d(TAG,"onRestart:");
    }

在 onCreate里创建如下:

Log.d(TAG,"onCreate:");

在button中添加

tmpData="I am changed";

在button1中添加

Log.d(TAG,tmpData);

三、在活动间切换&调试

---------- 在Logcat中筛选词条后即可观察 ----------

前言:科普一下Activity的四种状态:

1.Running状态:一个新的Activity的启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并,可与用户交互的激活装态;

2.Paused状态:当Activity被另一个透明或者Dialog样式的Activity覆盖时的状态,此时它依然与窗口管理器保持连接,系统继续维护其内部状态,他仍然可见,但是它已经失去焦点,故不可与用户交互。

3.Stopped状态:当Activity不可见时,Activity处于Stopped状态。当Activity处于此状态时,一定要保存当前数据和当前的UI状态,否则一旦Activity退出或关闭时,当前的数据和UI状态就丢失了。

4.Killed状态: Activity被杀掉以后或者被启动以前,处于Killed状态。这是Activity已从Activity堆栈中移除,需要重新启动CIA可以显示和使用。

以上四种状态,Running状态和Paused状态是课件的,Stopped状态和Killed状态时不可见的。

android stuio project和android区别 android studio的standard和custom_ide_08


android stuio project和android区别 android studio的standard和custom_android studio_09

摘自

1.首先打开软件,看到如下步骤

android stuio project和android区别 android studio的standard和custom_ide_10


2.打开normal界面

android stuio project和android区别 android studio的standard和custom_android studio_11


3.退出normal界面

android stuio project和android区别 android studio的standard和custom_ide_12


4.打开对话框

android stuio project和android区别 android studio的standard和custom_启动模式_13


5.退出对话框

android stuio project和android区别 android studio的standard和custom_启动模式_14


6.退出程序

android stuio project和android区别 android studio的standard和custom_ide_15


看过前面的科普应该很容易理解实验结果,不再赘述

四、验证系统可能自行对活动运行onDestroy

直接举例,在主界面中,直接用屏幕翻转功能

android stuio project和android区别 android studio的standard和custom_android studio_16


android stuio project和android区别 android studio的standard和custom_ide_17

五、利用saveinstantstate处理系统自行运行onDestroy而导致数据丢失的情况

首先在第四点的条件下,系统直接destroy会销毁数据。比如说先调用button的tmpData赋值语句后(I am changed),再调用button1中的Log.d时显示的也是I am changed,但是经过一次屏幕翻转就会清空这个tmpData的值,直接调用button1会显示I am original。
这时候,可以用saveinstantstate。

并再添加字符串提取

@Override
    protected void onSaveInstanceState(Bundle outState){
        super.onSaveInstanceState(outState);
        outState.putString("IS",tmpData);
    }

在 onCreate里创建如下:

if(savedInstanceState!=null){
            String tmp=savedInstanceState.getString("IS");
            Log.d(TAG,tmpData);
        }

这两个的作用呢,是在不是发自用户的destroy后查找已经被赋值的语句,存储到名为IS的一个字符串中,并再重新启动后赋值。

六、standard, singleTop, singleTask三种启动模式之间的区别点

直接贴代码,新建一个自己调用自己的活动

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button button=(Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent=new Intent(MainActivity.this,MainActivity.class);
                startActivity(intent);
            }
        });
    }

android stuio project和android区别 android studio的standard和custom_android_18

在下图中,可以设置launch mode为standard, singleTop, singleTask,singleInstance

<activity android:name=".MainActivity"
            android:launchMode="*******"
            >

standard模式很好理解,相当于没有任何限制
在如下代码的情况下,只要你单击button就会一直产生新窗口界面(可以通过返回确认页面数)

<activity android:name=".MainActivity"
            android:launchMode="standard"
            >

single top也很好理解,相当于限制置顶页面的创建,因为当前页面是置顶页面,那么就不能通过自己调用自己产生新的置顶页面

<activity android:name=".MainActivity"
            android:launchMode="singleTop"
            >

singletask也很好理解,就是这个活动只能存在一个,在single top模式下,通过其他函数仍可以创建新的自己,但是在单task模式下,无论如何都只能同时存在1个

<activity android:name=".MainActivity"
            android:launchMode="singleTask"
            >

附加题:singleInstance

singleInstance与singletask基本一致,但是singleinstance存在于另一任务栈中

比如activity A是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A独自在这个新的任务栈中,由于栈内复用的特性,后续的请求均不会创建新的activity,除非这个独特的任务栈被系统销毁了

实验的话可以通过新建一个activity2页面设置为singleInstance模式,并设置任务id回显即可

android stuio project和android区别 android studio的standard和custom_启动模式_19


android stuio project和android区别 android studio的standard和custom_android studio_20