[安卓基础] 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
相关文章推荐
- 我的Android进阶之旅------>Android知识图谱
- Zabbix安装及简单应用
- js闭包初体验
- 同一网站不同和二级域名和不同子目录的cookie
- 一篇故事讲述了计算机网络里的基本概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS
- 第2章 线程安全性-加锁机制
- stm32学习资料
- 南邮 OJ 1004 线性表操作
- HODJ3555 Bomb【数位dp】
- windows API获取物理内存大于4G的方法
- 南邮 OJ 1003 斐波那契数列
- Windows 下安裝 OpenCC
- 日经春秋 20150803
- HDU 1796 容斥原理
- rouser 移动脚本
- 服务器的响应数据的类型
- Mahout推荐算法API详解(实用)
- getaddrinfo函数使用
- 天声人語 20150803
- 二叉树遍历之(中序+先序,中序+后序)