Android_Activity(三)

Android_Activity_生命后期
相信如果你看了我的前两篇博客,那么你对Activity有了一点的了解,但是在面试的过程中,面试官经常会问到你Activity的生命周期是什么?如果你答的比较好的话,说不定面试官就聘用你了呢?好了,现在我们就开始学习一下Android中Activity的生命周期吧!

说的再好,尤其是这种理论性比较强的东西,还不如一张图让人更加的清晰明了:
ActivityLife

在学习Activity的生命周期的前,让我们先了解一下一个知识点:返回栈

返回栈
Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(Back Stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新年的活动,它会在返回栈中入栈,并处于栈顶的位置。而当我们按下Back键或调用finish()方法去销毁一个活动时,处于栈顶的活动会出栈,这时前一个入栈的活动就会重新处于栈顶的位置。系统总是会显示处于栈顶的活动给用户

活动状态
每个活动在其生命周期中最多可能会有四种状态。
1、运行状态
一个活动位于返回栈的栈顶,这时活动就处于运行状态。系统最不愿意回收的就是运行状态的活动,因为这会带来非常差的用户体验。
2、暂停状态
一个活动不再处于栈顶位置,但仍然可见时,这时活动就进入了暂停状态。比如对话框形式的活动只会占用屏幕中间的部分区域。
3、停止状态
一个活动不在处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
4、销毁状态
一个活动从返回栈中移除后就变成了销毁状态。

在面试的时候,可能会问道,我们经常在Activity生命周期的那个方法里面释放资源或者保存数据? onPause()

体验生命周期
1、我自己新建了一个ActivityLifeCircleTest项目,在activity_main.xml文件中定义了两个按钮:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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:orientation="vertical"
    tools:context="com.example.chw.activitylifecircletest.MainActivity">

    <Button
        android:id="@+id/main_start_normal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="StartNormalActivity"
        />
    <Button
        android:id="@+id/main_start_dialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="StartDialogActivity"
        />
</LinearLayout>

2、在MainActivity中的代码如下,代码很简单就不解释了。

public class MainActivity extends Activity {
    private static final String tag="ManiActivityf";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        Button btnStartNormalActivity= (Button) findViewById(R.id.main_start_normal);
        btnStartNormalActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent =new Intent(MainActivity.this,NormalActivity.class);
                startActivity(intent);
            }
        });
        Button btnStartDialogActivity= (Button) findViewById(R.id.main_start_dialog);
        btnStartDialogActivity.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.i(tag,"onStart()");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.i(tag,"onResume()");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.i(tag,"onPause()");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.i(tag,"onStop()");

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i(tag,"onDestroy()");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i(tag,"onRestart()");
    }
}

3、在又创建了一个NormalActivity,activity_normal.xml,和NormalActivity的代码如下,也很简单就不解释了。

<?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"
    tools:context="com.example.chw.activitylifecircletest.NormalActivity">
    <TextView
        android:id="@+id/normal_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a Normal Activity"
        android:textSize="18sp"
        android:gravity="center_horizontal"
        />
</RelativeLayout>
public class NormalActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_normal);
    }
}

3、我新建了一个DialogActivity,它是一个Dialog,这个类的代码和布局基本上与NormalActivity一样,就是需要在AndroidManifest.xml文件中在DialogActivity中添加一行代码:

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

一切工作准备完,下面开始体验Activity的生命周期吧:
1、当这个项目运行起来的时候,我们可以通过log日志看到,它一开始调用了那些方法:

06-05 13:12:45.494 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onCreate()
06-05 13:12:45.494 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onStart()
06-05 13:12:45.504 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onResume()

2、当我们点击StartNormalActivity按钮的时候,ManiActivity调用的如下的方法:

06-05 13:15:08.644 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onPause()
06-05 13:15:09.084 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onStop()

3、当我们处于NormalActivity界面的时候,我们点击Back键以后,看看MainActivity调用了那些方法:

06-05 13:16:43.184 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onRestart()
06-05 13:16:43.184 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onStart()
06-05 13:16:43.184 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onResume()

4、当我们点击StartDialogActivity按钮的时候,看MainActivity调用了那些方法:

06-05 13:17:44.024 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onPause()

5、当我们处于DialogActivity界面的时候,我们点击Back键,看MainActivity调用了那些方法:

06-05 13:19:16.404 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onResume()

6、当我们处于MainActivity界面的时候,我们点击Back键,看MainActivity调用了那些方法:

06-05 13:20:14.164 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onPause()
06-05 13:20:14.584 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onStop()
06-05 13:20:14.584 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onDestroy()

面试中有时候会被问到的
问:当我们启动一个程序以后,我们不做什么操作,直接按Home键退出,那么Activity将要经过那些生命周期方法?
答:我们还是用事实说话吧,我贴出log日志,一看便知;
1、按下Home键MainActivity会调用的方法:

06-05 13:23:26.734 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onPause()
06-05 13:23:27.044 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onStop()

2、当我们在桌面中在此点击ActivityLifeCircleTest这个项目的时候,我们来看一下MainActivity调用了那些方法:

06-05 13:24:53.184 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onRestart()
06-05 13:24:53.184 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onStart()
06-05 13:24:53.184 30901-30901/com.example.chw.activitylifecircletest I/ManiActivityf: onResume()

问:当我们启动一个程序以后,我们不做什么操作,直接按关机键锁屏,那么Activity将要经过那些生命周期方法?
答:我们还是用事实说话吧,我贴出log日志,一看便知;
1、当我们启动ActivityLifeCircleTest项目后,按下关机键,我们来看MainActivity调用了那些方法:

06-05 13:25:47.044 10930-10930/com.example.chw.activitylifecircletest I/ManiActivityf: onPause()
06-05 13:25:47.084 10930-10930/com.example.chw.activitylifecircletest I/ManiActivityf: onStop()

2、当我们在此开机,进入MainActivity中,我们来看MainActivity调用了那些方法:

06-05 13:28:46.244 10930-10930/com.example.chw.activitylifecircletest I/ManiActivityf: onRestart()
06-05 13:28:46.244 10930-10930/com.example.chw.activitylifecircletest I/ManiActivityf: onStart()
06-05 13:28:46.254 10930-10930/com.example.chw.activitylifecircletest I/ManiActivityf: onResume()

由此可见用户点击Home键和关机键对一个Activity经历的生命周期是一样的。

活动被回收了怎么办?
Activity中提供了一个onSaveInstanceState()回调方法,这个方法会保证一定在活动被回收之前调用。我将在MainActivity中重写这个方法:
1、

@Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.i(tag,"onSaveInstanceState()");
        String tempData= "Something you just typed";
        outState.putString("data_key",tempData);
    }

2、
在MainActivity中的onCreate()方法中添加以下代码:

if (savedInstanceState!=null) {
String tempData=savedInstanceState.getString("data_key");
   Log.i(tag,tempData);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值