Android开发学习之路--Activity之生命周期

    事实上这篇文章应该要在介绍Activity的时候写的,只是那个时候还不怎么熟悉Activity,还是在这里具体介绍下好了。还是參考下官方文档的图吧:


    从上面的流程,我们能够看出首先就是打开APP,開始运行到当前的FirstActivity了。接着anroid系统会调用onCreate方法,然后是onStart方法,onResume方法。之后FirstActivity就全然启动好了。展现到前台,假设这个时候用intent启动了还有一个SecondActivity的话,那么就会调用FirstActivity的onPause方法,通过back键返回到FirstActivity就会调用onResume方法。而此时SecondActivity会销毁会调用onStop方法,假设这个时候又从FirstActivity调用到SecondActivity,那么会调用onRestart方法,接着onStart方法。然后循环。

可是假设这个时候内存不够,或者finish了Activity,那么就会调用onDestory方法,Activity就结束了。假设启动就必须又一次创建了。

    依据官方文档,介绍了Activiy的三个重要的循环对:

    1、整个生命周期:从第一个onCreate方法到onDestroy方法。Activity须要在onCreate中准备全部的全局状态,须要在onDestroy方法中释放全部的资源。比方,我们有一个线程在后台跑须要从网络下载数据,我们再onCreate方法里创建线程。在onDestroy方法里停止线程。

    2、可见生命周期:从onStart方法到onStop方法。顾名思义叫做可见生命周期,事实上是由于这个过程用户能够非常直观的在屏幕上看到Activity,在这两个过程之间我们能够保持我们须要展示给用户的资源。比方。我们能够在onStart方法中注冊一个BroadcastReceiver监视一些改变来设置UI,当我们不在看到显示的UI的时候。我们须要在onStop方法中取消监视。

onStart方法和onStop方法能够在用户可见和隐藏不多切换的时候被多次调用。

    3、前台生命周期:这个过程从onResume方法到onPause方法。

这个过程Activity是聚焦到最上层展现给用户。Activity从onResume到onPause可能切换很频繁-比如当设备处于休眠状态,当result和一个新的intent被发送后,所以这里的代码须要很简洁。

public class Activity extends ApplicationContext {
     protected void onCreate(Bundle savedInstanceState);

     protected void onStart();
     
     protected void onRestart();

     protected void onResume();

     protected void onPause();

     protected void onStop();

     protected void onDestroy();
 }
    关于各个函数在这里也做个简单的介绍。事实上也是參考的官方文档:

    1、onCreate方法:当Activity第一次被创建。调用onCreate方法。

这里我们须要完毕初始化操作:载入view布局,绑定事件等。

    2、onRestart方法:在Activity被停止后调用该方法又一次启动。

    3、onStart方法:当Activity将要展示给用户的时候被调用。

    4、onResume方法:当Activity能够和用户交互的时候被调用。这个时候Activity在Activity栈的栈顶。等待用户交互。

    5、onPause方法:当系统准备启动或恢复之前的Activity的时候被调用,这个时候。我们须要保存数据。停止动画和其它一些耗费CPU资源的事情。这个实现必须很快,由于假设函数未返回,会影响下一个Activity的resume。

    6、onStop方法:当Activity长时间不可见的时候被调用。

    7、onDestroy方法:当Activity被销毁时我们会收到最后一个调用。无论是调用finish方法还是由于系统没有为了释放空间都会调用该方法。

    这些函数也解说了。那么我们来了解下了上述的Activity栈,听名字我们也能够明确什么意思了,就是一个一个Activity就像栈一样,栈的话事实上就和我们曾经用过的储蓄硬币的小罐子,一个一个压进去,然后之后栈顶的取出来之后栈底的才干取出来。Activity也是如此。比方我们执行了FirstActivity,那么FirstActivity就进栈了,接着调用intent执行了SecondActivity,那么SecondActivity进栈了,FirstActiviy在栈底。接着按back键,SecondActivity出栈被销毁,FirstActiviy又出来了在栈顶。

全部的显示在我们面前的Activity就是在栈顶的Activity了。

    讲了这么多,接下来还是通过实例来看看执行结果吧。这里我们通过logcat来查看调用的情况。ui显示看信息已经不能满足要求了,以下我们新建个projectActivityLifetime,详细新建就依照前几篇文章来。这里不多加赘述。

    这里须要为了实现7种方法都有调用,所以就用了三个Activity,第一个是主的Activity,第二个是普通的Activity,第三个是Dialog。首先第一个Activity加入两个button,例如以下所看到的


    新建TestActivity和TestDialog两个Activity。

代码基本同样,都加上textview。

仅仅是显示内容不一样,例如以下图:

    

     可是这样不过显示不一样的内容,不是dialog,那么须要在TestDialog的AndroidManifest中加入主题了:

<activity android:name=".TestDialog" android:theme="@style/Theme.AppCompat.Dialog"></activity>
     既然这些都完毕了,那么剩下就是把两个button按钮的功能给实现  

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startTestActivity = (Button)findViewById(R.id.button1);
        startTestDialog = (Button)findViewById(R.id.button2);

        startTestActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intentActivity = new Intent(MainActivity.this, TestActivity.class);
                startActivity(intentActivity);
            }
        });

        startTestDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intentDialog = new Intent(MainActivity.this, TestDialog.class);
                startActivity(intentDialog);
            }
        });
    }

    基本代码写好了,好像忘了我们的目的是生命周期,那就用logcat来看看信息打印吧。在三个Activity中加入7个方法的log信息。

    

package com.example.jared.activitylifetime;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    public static  String TAG = "MainActivity";

    private Button startTestActivity;
    private Button startTestDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate is Called");
        setContentView(R.layout.activity_main);

        startTestActivity = (Button)findViewById(R.id.button1);
        startTestDialog = (Button)findViewById(R.id.button2);

        startTestActivity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intentActivity = new Intent(MainActivity.this, TestActivity.class);
                startActivity(intentActivity);
            }
        });

        startTestDialog.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intentDialog = new Intent(MainActivity.this, TestDialog.class);
                startActivity(intentDialog);
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart is Called");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume is Called");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause is Called");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop is Called");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy is Called");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "onRestart is Called");
    }
}

    好了,代码已经所有加入完成,那么我们来看看结果是不是如上面所说的一样呢?首先执行打开app,查看logcat例如以下:

02-03 07:38:59.105 6967-6967/com.example.jared.activitylifetime D/MainActivity: onCreate is Called
02-03 07:38:59.485 6967-6967/com.example.jared.activitylifetime D/MainActivity: onStart is Called
02-03 07:38:59.485 6967-6967/com.example.jared.activitylifetime D/MainActivity: onResume is Called

    能够看出结果和我们所学的一样。接着打开还有一个Activity,查看logcat例如以下:


02-03 07:45:32.425 6967-6967/com.example.jared.activitylifetime D/MainActivity: onPause is Called
02-03 07:45:36.305 6967-6967/com.example.jared.activitylifetime D/MainActivity: onStop is Called
    接着按back键回退到MainActivity:

02-03 07:45:42.875 6967-6967/com.example.jared.activitylifetime D/MainActivity: onRestart is Called
02-03 07:45:42.875 6967-6967/com.example.jared.activitylifetime D/MainActivity: onStart is Called
02-03 07:45:42.875 6967-6967/com.example.jared.activitylifetime D/MainActivity: onResume is Called
    从上能够知道首先app开启后启动了MainActivity,然后调用了onCreate->onStart->onResume,然后显示了MainActivity的UI,接着打开TestActivity的时候调用了onPause->onStop来停止MainActivity,显示TestActivity的UI。当按back键后,TestActivity被销毁。然后MainActivity调用了onRestart->onStart->onResume来又一次显示MainActivity的UI。

   接着我们看看打开Dialog的效果,查看logcat例如以下:


02-03 08:09:14.975 6967-6967/com.example.jared.activitylifetime D/MainActivity: onPause is Called

    然后按back键退回到MainActivity:

02-03 08:10:02.335 6967-6967/com.example.jared.activitylifetime D/MainActivity: onResume is Called

    由于MainActivity还是显示给用户的。不过在他之上另一个dialog,所以不会stop Activity,而不过Pause。然后Resume。

    另一点须要注意的就是假设在MainActivity之后启动了TestActivity,然后因为系统内存不够了,然后MainActivity会被Destroy,释放,尽管当我们再次按back键会又一次创建MainActivity给人的感觉基本没事。可是万一MainActivity中原本就实用户输入的数据,比方注冊的时候填写了一些信息,发现错了,想回去又一次填写,那么就会出问题。

    Android肯定想到了这个问题。有一个函数onSaveInstanceState方法就能够实现这个功能,在系统kill该MainActivity之前会先调用这种方法。然后我们能够在这种方法中保存一些信息。

例如以下:

 protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        String SaveData = "We must save the info";
        String key = "SaveInfo";
        outState.putString(key, SaveData);
    }
     信息保存好后。那么什么时候读取呢?之前那7个方法,也就onCreate方法有传入的參数了。

那也是个Bundle,那个Bundle的话通常是null,仅仅有这个会系统回收,须要又一次create的时候才调用。

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate is Called");
        setContentView(R.layout.activity_main);
        if(savedInstanceState != null) {
            String key = "SaveInfo";
            String savedData = savedInstanceState.getString(key);
            Log.d(TAG, savedData);
        }
}
    Activity的生命周期基本是就学到这里了。

    


posted @ 2017-06-13 15:41  jzdwajue  阅读(134)  评论(0编辑  收藏  举报