Android四大组件之一Activity

Android四大组件之一Activity

八月 02, 2019

Activity

1、什么是Activity?

四大组件之一,通常一个用户交互界面对应一个activity。activity是Context的子类,同时实现了
window.callback和keyevent.callback,可以处理与窗体用户交互的事件

常见的Activity类型有FragmentActivity,ListActivity,TabActivity等

如果界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity

2、Activity的生命周期

Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包
括:onCreate onStart onResume onPause onStop onDestory

其实这些方法都是两两对应的,onCreate创建onDestroy销毁

onStart可见与onStop不可见,onResume可编辑(即焦点)与onPause

这6个方法是相对应的,那么就只剩下一个onRestart,这个方法的调用是在Activity被onStop后,但是
没有被onDestory,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法

如果被onDestory了,则是调用onCreate方法

3、Activity的状态

a) foreground activity

b) visible activity

c) background activity

d) empty process

4、如何保存Activity的状态

Activity的状态通常情况下系统会自动保存的,只有当我们需要保存额外的数据时才需要使用到这样的功

一般来说,调用onPause()和onStop()方法后的activity实例仍然存在于内存中,activity的所有信息
和状态数据不会消失,当activity重新回到前台之后,所有的改变都会得到保留

但是当系统内存不足时,调用onPause()和onStop()方法后的activity可能会被系统摧毁,此时内存中
就不会存有该activity的实例对象了。如果之后这个activity重新回到前台,之前所作的改变就会消
失。为了避免此种情况的发生,我们可以覆写onSaveInstanceState()方法。onSaveInstanceState()
方法接受一个Bundle类型的参数,开发者可以将状态数据存储到Bundle对象中,这样即使activity被系
统摧毁,当用户重新启动这个activity而调用它的onCreate()方法时,上述的Bundle对象会作为实参传
递给onCreate()方法,开发者可以从Bundle对象中取出保存的数据,然后利用这些数据将activity恢复
到被摧毁之前的状态。

需要注意的是,onSaveInstanceState()方法并不是一定会被调用的,因为有些场景是不需要保存状态数
据的。比如用户按下BACK键退出activity时,用户显然想要关闭这个activity,此时是没有必要保存数
据以供下次恢复的,也就是onSaveInstanceState()方法不会被调用。如果调用onSaveInstanceState
()方法,调用将发生在onPause()或onStop()方法之前。

1
2
3
4
5
@Override
protected void onSaveInstanceState(Bundle outState){
//TODO Auto-generated method stub
super.onSaveInstanceState(outState);
}

5、两个 Activity 之间跳转时必然会执行的方法

一般情况下比如说有两个activity,分别叫A、B,当在A里面激活B组件的时候,A会调用
onPause()方法,然后B调用onCreate()、onStart()、onResume()

这个时候B覆盖了窗体,A会调用onStop()方法。如果B是个透明的,或者是对话框的样
式, 就不会调用A的onStop()方法

如下,打开一个 MainActivity,然后点击MainActivity中的按钮跳转到
SecondActivity的日志

1
2
3
4
5
6
7
8
MainActivity onCreate
MainActivity onStart
MainActivity onResume
MainActivity onPause
SecondActivity onCreate
SecondActivity onStart
SecondActivity onResume
MainActivity onStop

###6、横竖屏切换时 Activity 的生命周期

此时的生命周期跟清单文件里的配置有关系。

1、不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期 默认首先销毁前
activity,然后重新加载。

如下,当横竖屏切换时先执行 onPause/onStop 方法

1
2
3
4
5
SecondActivity onPause
SecondActivity onStop
SecondActivity onCreate
SecondActivity onStart
SecondActivity onResume

2、设置 Activity 的 android:configChanges=”orientation|keyboardHidden|screenSize”时,
切屏不会重新调 用各个生命周期,只会执行 onConfigurationChanged 方法。

通常在游戏开发, 屏幕的朝向都是写死的。

###7、将一个 Activity 设置成窗口的样式

只需要给我们的 Activity 配置如下属性即可

android:theme=”@android:style/Theme.Dialog”

###8、退出 Activity 如何安全退出已调用多个 Activity 的 Application

1、通常情况用户退出一个 Activity 只需按返回键,我们写代码想退出 activity 直接调用 finish()
方法就行。

2、记录打开的 Activity:

每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。

1
2
3
4
5
6
7
8
9
10
//伪代码 
List<Activity> lists ;
// 在 application 全局的变量里面
lists = new ArrayList<Activity>();
lists.add(this);
for(Activity activity: lists)
{
activity.finish();
}
lists.remove(this);

3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。

//给某个 activity 注册接受接受广播的意图

registerReceiver(receiver, filter)

//如果过接受到的是 关闭 activity 的广播 就调用 finish()方法 把当前的 activity finish()掉

4、递归退出

在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult
中处理,递归关闭。

5、其实 也可以通过 intent 的 flag 来实现 intent.setFlag(Intent.FLAG_ACTIVITY_CLEAR_TOP)
激活 一个新的 activity。此时如果该任务栈中已经有该 Activity,那么系统会把这个 Activity 上
面的所有 Activity 干掉。其 实相当于给 Activity 配置的启动模式为 SingleTop。

###9、 Activity 的启动模式

启动模式(launchMode)在多个 Activity 跳转的过程中扮演着重要的角色,它可以决定是否生成新的
Activity 实例, 是否重用已存在的 Activity 实例,是否和其他 Activity 实例公用一个 task
里。这里简单介绍一下 task 的概念,task 是 一个具有栈结构的对象,一个 task 可以管理多个
Activity,启动一个应用,也就创建一个与之对应的 task。

Activity 一共有以下四种 launchMode:

1.standard

2.singleTop

3.singleTask

4.singleInstance

我们可以在 AndroidManifest.xml 配置的 android:launchMode 属性为以上四种之一即
可。