您的位置:首页 > 其它

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

2015-08-03 09:51 597 查看

组件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,需要继承一下。代码如下:

package com.babybus.study.activities;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity{

private static final String TAG = "com.babybus.study.activities.MainActivity";

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

}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.i(TAG, "onRestoreInstanceState");
super.onRestoreInstanceState(savedInstanceState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
Log.i(TAG, "onSaveInstanceState");
super.onSaveInstanceState(outState);
}

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

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

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

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

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


如何保存Activity的状态

当Activity被挂在后台的时候,最重要的就是保存它的状态啦。等到Activity恢复的时候,再把保存的状态还原回来。接下来介绍如何保存Activity的状态。在这里,记住几个关键点:

1、当Activity挂在后台时,它处在onPause或者onStop,虽然此时Activity不可见,但它依然处在手机的运行的内存中,它还活着。虽然你看不见,所以,当进入onPause或者onStop的时候,我们需要保存此刻Activity的状态。当恢复的时候再显示出来。

2、然而,当因为手机内存不够的原因,Activity会被回收,这种情况下,就比较麻烦,如果没有被回收,系统会帮助我们保存Activity当前的状态,但如果被回收了,这个状态,就要我们自己来恢复。这个时候,就用到系统提供给我们的这个方法:onSaveInstanceState()。

3、使用onSaveInstanceState()来保存状态,需要用到一个东西:Bundle,可以用键值的方式,把需要保存的信息,通过Bundle保存下来。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate");
// 可以在这里获得保存下来的数据
if (savedInstanceState != null) { // savedInstanceState有可能是null,因为如果第一次打开,或者activity没有被杀死,是不需要用到这个的。
String value1 = savedInstanceState.getString("key1");
String value2 = savedInstanceState.getString("key2");
String value3 = savedInstanceState.getString("key3");
System.out.println("--bb-- (value1, value2, value3) = (" + value1 + ", " + value2 + ", " + value3 + ")");
}

setContentView(R.layout.activity_main);

}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
Log.i(TAG, "onRestoreInstanceState");
// 也可以在这里获得保存下来的数据,当然这个方法在onCreate之后、onStart之前被执行
if (savedInstanceState != null) { // savedInstanceState有可能是null,因为如果第一次打开,或者activity没有被杀死,是不需要用到这个的。
String value1 = savedInstanceState.getString("key1");
String value2 = savedInstanceState.getString("key2");
String value3 = savedInstanceState.getString("key3");
System.out.println("--bb-- (value1, value2, value3) = (" + value1 + ", " + value2 + ", " + value3 + ")");
}
super.onRestoreInstanceState(savedInstanceState);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
Log.i(TAG, "onSaveInstanceState");
// 这个方法会在onPause和onStop之间被调用
// 这个方法里保存数据
String value1 = "a";
String value2 = "b";
String value3 = "c";
outState.putString("key1", value1);
outState.putString("key2", value2);
outState.putString("key3", value3);
super.onSaveInstanceState(outState);
}


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团队】 原文链接: /article/6669135.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: