[安卓基础] 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