W e S D
0 1

[安卓基础] 009.组件Activity详解

组件Activity详解

这篇文章学到得内容
1、什么是Activity
2、Activity的生命周期
3、如何保存Activity的状态
4、Activity之间切换时,相互之间生命周期的执行顺序

 

什么是Activity

Activity是Android用来和用户进行界面交互的组件。比如,你用android手机打电话,查看地图,玩游戏,都是在已经写好的Activity上操作的。如果拿生活中最常见的举例子,Activity相当于一个网页,上面有许多的按钮和布局和图片。所以,在android的机制里,Activity是最常用的一个组件。它可大可小,就像网页一样,可以占据怎个屏幕,也可以只占据屏幕的某一部分。

一个app通常会有多个Activity组合起来,他们互相松散的关联,互相调用。从用户的角度来看,通常表现为页面(Activity)在屏幕上的切换。在这众多的Activity中,会有一个Activity是入口Activity,也就是用户打开App,第一个看到的Activity。这个主入口Activity,我们在AndroidManifest.xml可以通过以下代码注册,告知系统说,这个Activity是主入口Activity。

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.babybus.study.activities.MainActivity"
            android:label="@string/app_name" >
            <!-- 标志这个activity是主入口activity -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
         <activity 
             android:name="com.babybus.study.activities.SecondActivity"
             android:label="@string/app_name" ></activity>
    </application>

当一个activity被创建或者销毁时,会被通知执行许多类似callback机制的方法。这些方法,就是我们熟悉的生命周期方法。如:onStart()、onCreate()、onResume()、onPause()、onStop()、onDestory()。你可以在这些回调方法里,写一些Activity处于这个时刻要执行的代码。

学习Activity,要掌握三个:

1、掌握在Activity上面进行界面布局(这里不讲)。  
2、掌握Activity的生命周期。  
3、如何保存Activity的状态,当Activity挂在后台时。 

 

Activity的生命周期

这里主要的,是要告诉大家Activity的生命周期机制。界面布局,后面再介绍。

当一个Activity被创建的时候,要按照生命周期机制来执行一系列生命周期的方法。下图是Activity的生命周期机制图:



从上面的流程图,非常直观的介绍给我们,Activity这些回调方法的执行顺序和在各种状态下的流程。

从流程图可以总结出
1、在Activity running,也就是在Activity在屏幕上展现出来时,它经过了三个回调方法:onCreate->onStart->onResume。
2、当这个Activity被遮盖时,会执行onPause,如果这个Activity被完全遮盖,会执行onPause->onStop。
3、当这个Activity从后台回来时,如果只是执行到onPause(局部被盖住),则回到onResume然后重新进入running状态,如果执行到onStop(全部遮盖),则执行onRestart,再进入onStart->onResume->Activity running。
4、如果退出这个app,Activity会执行onDestory,因为退出app,系统会把app的内容销毁。
5、有的时候,当Activity处在后台看不见的状态太久,也就是处于onStop的状态太久或者app内存资源不够时,这个Activity的进程会被杀死,如果这时候这个Activity要回到前台,则会进入onCreate方法开始执行。简单理解就是:因为它被销毁了,所以需要重新创建出来。
要创建一个属于自己的Activity,需要继承一下。代码如下:

 1 package com.babybus.study.activities;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.util.Log;
 6 
 7 
 8 public class MainActivity extends Activity{
 9 
10     private static final String TAG = "com.babybus.study.activities.MainActivity";
11     
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         Log.i(TAG, "onCreate");
16         setContentView(R.layout.activity_main);
17 
18     }
19     
20     @Override
21     protected void onRestoreInstanceState(Bundle savedInstanceState) {
22         Log.i(TAG, "onRestoreInstanceState");
23         super.onRestoreInstanceState(savedInstanceState);
24     }
25     
26     @Override
27     protected void onSaveInstanceState(Bundle outState) {
28         Log.i(TAG, "onSaveInstanceState");
29         super.onSaveInstanceState(outState);
30     }
31     
32     @Override
33     protected void onStart() {
34         Log.i(TAG, "onStart");
35         super.onStart();
36     }
37     
38     @Override
39     protected void onRestart() {
40         Log.i(TAG, "onRestart");
41         super.onRestart();
42     }
43     
44     @Override
45     protected void onPause() {
46         Log.i(TAG, "onPause");
47         super.onPause();
48     }
49     
50     @Override
51     protected void onStop() {
52         Log.i(TAG, "onStop");
53         super.onStop();
54     }
55     
56     @Override
57     protected void onDestroy() {
58         Log.i(TAG, "onDestroy");
59         super.onDestroy();
60     }
61 }

如何保存Activity的状态

当Activity被挂在后台的时候,最重要的就是保存它的状态啦。等到Activity恢复的时候,再把保存的状态还原回来。接下来介绍如何保存Activity的状态。在这里,记住几个关键点
1、当Activity挂在后台时,它处在onPause或者onStop,虽然此时Activity不可见,但它依然处在手机的运行的内存中,它还活着。虽然你看不见,所以,当进入onPause或者onStop的时候,我们需要保存此刻Activity的状态。当恢复的时候再显示出来。
2、然而,当因为手机内存不够的原因,Activity会被回收,这种情况下,就比较麻烦,如果没有被回收,系统会帮助我们保存Activity当前的状态,但如果被回收了,这个状态,就要我们自己来恢复。这个时候,就用到系统提供给我们的这个方法:onSaveInstanceState()。
3、使用onSaveInstanceState()来保存状态,需要用到一个东西:Bundle,可以用键值的方式,把需要保存的信息,通过Bundle保存下来。

 

 1     @Override
 2     protected void onCreate(Bundle savedInstanceState) {
 3         super.onCreate(savedInstanceState);
 4         Log.i(TAG, "onCreate");
 5         // 可以在这里获得保存下来的数据
 6         if (savedInstanceState != null) { // savedInstanceState有可能是null,因为如果第一次打开,或者activity没有被杀死,是不需要用到这个的。
 7             String value1 = savedInstanceState.getString("key1");
 8             String value2 = savedInstanceState.getString("key2");
 9             String value3 = savedInstanceState.getString("key3");
10             System.out.println("--bb-- (value1, value2, value3) = (" + value1 + ", " + value2 + ", " + value3 + ")");
11         }
12 
13         setContentView(R.layout.activity_main);
14         
15     }
16     
17     @Override
18     protected void onRestoreInstanceState(Bundle savedInstanceState) {
19         Log.i(TAG, "onRestoreInstanceState");
20         // 也可以在这里获得保存下来的数据,当然这个方法在onCreate之后、onStart之前被执行
21         if (savedInstanceState != null) { // savedInstanceState有可能是null,因为如果第一次打开,或者activity没有被杀死,是不需要用到这个的。
22             String value1 = savedInstanceState.getString("key1");
23             String value2 = savedInstanceState.getString("key2");
24             String value3 = savedInstanceState.getString("key3");
25             System.out.println("--bb-- (value1, value2, value3) = (" + value1 + ", " + value2 + ", " + value3 + ")");
26         }
27         super.onRestoreInstanceState(savedInstanceState);
28     }
29     
30     @Override
31     protected void onSaveInstanceState(Bundle outState) {
32         Log.i(TAG, "onSaveInstanceState");
33         // 这个方法会在onPause和onStop之间被调用
34         // 这个方法里保存数据
35         String value1 = "a";
36         String value2 = "b";
37         String value3 = "c";
38         outState.putString("key1", value1);
39         outState.putString("key2", value2);
40         outState.putString("key3", value3);
41         super.onSaveInstanceState(outState);
42     }

 

4、如果系统因为内存不够把Activity释放掉,你可以通过Bundle把保存下来的信息,在onCreate()和onRestoreInstanceState()方法中,把这些状态重新恢复回来。

看下保存Activity状态的流程图


我们看到,当Activity进程没有被杀死的时候,onRestart会自动把Activity的状态恢复回来,而当进程被杀死的时候,就需要通过onCreate或者onRestoreInsrtanceState()来把状态恢复过来。

(注意:onSaveInstanceState()这个方法不是必须被执行的,系统会根据情况(内存是否不足)来执行,当这个方法被执行的时候,它会在onPause和onStop之前。以确保状态被准确的记录下来。所以,不可以用在这个方法来存储数据,而是要在onPause方法中,储存数据,比如把它储存在数据库中。)

在Activity中,在onCreate方法有一个参数:savedInstanceState,你可以在onCreate里,通过这个参数来获得保存下来的数据。通常,我们只要这么做就够了。但如果你希望在Activity被全部创建好后,再根据保存下来的数据做一些改变,这时候就要用到onRestoreInstanceState()方法了,这个方法执行在onCreate之后,onStart之前。

 

本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 

转载自【宝宝巴士SuperDo团队】 原文链接: http://www.cnblogs.com/superdo/p/4698569.html

 

posted @ 2015-08-03 09:51  SD.Team  阅读(349)  评论(0编辑  收藏  举报