Android_1
1.Activity
1. Activity概念
Activity 类是 Android 应用的关键组件,而 Activity 的启动和组合方式则是该平台应用模型的基本组成部分。移动应用往往需要从一个应用中调用另一应用的某一功能,这时实际上是调用了另一应用的某Activity而非整个应用。
Activity 提供窗口供应用在其中绘制界面。此窗口通常会填满屏幕,但也可能比屏幕小,并浮动在其他窗口上面。通常,一个 Activity 实现应用中的一个屏幕。
一个应用往往包含多个屏幕,也就意味着包含多个Activity,其中的一个Activity会被指定为主Activity,作为启动应用时的第一个屏幕。每个Activity可以启动另一个Activity,以实现不同的操作。虽然应用中的各个 Activity 协同工作形成统一的用户体验,但每个 Activity 与其他 Activity 之间只存在松散的关联,应用内不同 Activity 之间的依赖关系通常很小,Activity 经常会启动属于其他应用的 Activity。
2. 配置
1)声明Activity
在AndroidManifest.xml中,为元素添加子元素:
<manifest ... >
<application ... >
<activity android:name=".MainActivity"></activity>
...
</application ... >
...
</manifest >
2)声明 intent 过滤器
显式请求:在需求某一功能时,明确告诉系统调用某应用下的某Activity。
隐式请求:在需求某一功能时,告诉系统需要任何可实现该需求的Activity,系统界面则会询问用户使用哪个应用来执行任务。
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
<action>
元素:指定该 Activity 会发送数据。
<category>
元素:将之声明为 DEFAULT 可使 Activity 能够接收启动请求。
<data>
元素:指定此 Activity 可以发送的数据类型。
以下代码段展示了如何调用上述 Activity:
// Create the text message with a string
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.setType("text/plain");
sendIntent.putExtra(Intent.EXTRA_TEXT, textMessage);
// Start the activity
startActivity(sendIntent);
不允许其他应用激活其 Activity,则不需要任何其他 intent 过滤器。
3)权限声明
若某一应用A想使用某一应用B达成某一功能,则该应用B本身必须定义调用它的应用所需具备的权限:
<manifest>
<activity android:name="...."
android:permission="com.google.socialapp.permission.SHARE_POST"/>
...
</manifest>
应用A则必须匹配应用B清单中设置的权限:
<manifest>
<uses-permission android:name="com.google.socialapp.permission.SHARE_POST" />
</manifest>
3. 生存周期
系统会调用带有 @OnLifecycleEvent 注释的方法,以使您的生命周期感知型组件可以执行对应状态所需的任何设置代码。
1)onCreate() >>“已创建”状态 ON_CREATE
在首次创建该Activity时触发,此方法会接收 savedInstanceState 参数,后者是包含 Activity 先前保存状态的 Bundle 对象。如果 Activity 此前未曾存在,Bundle 对象的值为 null。
2)onStart() >>“已开始”状态 ON_START
3)onResume() >>“已恢复”状态 ON_RESUMN
这是应用与用户互动的状态。应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一个 Activity,或设备屏幕关闭。
4)onPause() >>“已暂停”状态 ON_PAUSE
多窗口模式下,只有正在互动的应用具有焦点,该Activity处于“已恢复”状态,另一个则处于“已暂停”状态。
5)onStop() >>“已停止”状态 ON_STOP
6)onDestory() >>“已销毁”状态 ON_DESTORY
4. 任务及返回堆栈
任务是用户在执行某项工作时与之互动的一系列 Activity 的集合。这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中。
Activity 和任务的默认行为如下:
1)当 Activity A 启动 Activity B 时,Activity A 会停止,但系统会保留其状态(例如滚动位置和输入到表单中的文本)。如果用户在 Activity B 中按返回按钮,系统会恢复 Activity A 及其状态。
2)当用户通过按主屏幕按钮离开任务时,当前 Activity 会停止,其任务会转到后台。系统会保留任务中每个 Activity 的状态。如果用户稍后通过点按该任务的启动器图标来恢复该任务,该任务会进入前台并恢复堆栈顶部的 Activity。
3)如果用户按返回按钮,当前 Activity 将从堆栈中退出并销毁。堆栈中的上一个 Activity 将恢复。Activity 被销毁后,系统不会保留该 Activity 的状态。堆栈中的 Activity 永远不会重新排列,只会被送入和退出。
4)Activity 可以多次实例化,甚至是从其他任务对其进行实例化。
定义启动模式:
通过启动模式定义 Activity 的新实例如何与当前任务关联,既可以在当前任务Activity在 intent 中定义的设置,也可以在新实例Activity的清单文件中设置,若两者都设置了,优先遵循当前任务Activity在 intent 中定义的设置。
1)使用清单文件:
在清单文件中声明 Activity 时,可以使用 元素的 launchMode 属性指定 Activity 应该如何与任务关联。可选值如下:
"standard"
默认值。在启动该Activity的任务中创建该Activity新实例,并将 intent 传送给该实例。
Activity 可以多次实例化,每个实例可以属于不同的任务,一个任务可以拥有多个实例。
"singleTop"
若当前任务顶部Activity与要创建的新实例相同,则通过 onNewIntent() 方法来将 intent 转送给该实例,而不是创建 Activity 的新实例。若不相同则新建实例。
Activity 可以多次实例化,每个实例可以属于不同的任务,一个任务可以拥有多个实例(但前提是返回堆栈顶部的 Activity 不是该 Activity 的现有实例)。
"singleTask"
若存在任意任务中已存在该Activity实例,则系统会通过调用其 onNewIntent() 方法将 intent 转送到该现有实例。若不存在,则会创建新任务,并实例化新任务的根 Activity。
Activity 一次只能有一个实例存在。
"singleInstance"
与 “singleTask” 相似,唯一不同的是系统不会将任何其他 Activity 启动到包含该实例的任务中。该 Activity 始终是其任务唯一的成员;由该 Activity 启动的任何 Activity 都会在其他的任务中打开。
2)使用 Intent 标记
启动 Activity 时,可以在传送给 startActivity() 的 intent 中添加相应的标记来修改 Activity 与其任务的默认关联。可选标记如下:
FLAG_ACTIVITY_NEW_TASK
与在清单文件中将 launchMode 设置为“singleTask”效果相同。
FLAG_ACTIVITY_SINGLE_TOP
与在清单文件中将 launchMode 设置为“singleTop”效果相同。
FLAG_ACTIVITY_CLEAR_TOP
若所要启动的Activity已在当前任务中运行,则不会创建新实例,而是销毁位于其上的所有Activity,并通过 onNewIntent() 将此 intent 传送给它的已恢复实例。
5. 清除返回堆栈
默认情况下,当用户离开任务较长时间,系统会清除任务中除根 Activity 以外的所有 Activity。当用户再次返回到该任务时,只有根 Activity 会恢复。
可以使用以下Activity属性来修改:
alwaysRetainTaskState
如果在任务的根 Activity 中将该属性设为 “true”,则不会发生上述默认行为。即使经过很长一段时间后,任务仍会在其堆栈中保留所有 Activity。
clearTaskOnLaunch
如果在任务的根 Activity 中将该属性设为 “true”,那么只要用户离开任务再返回,堆栈就会被清除到只剩根 Activity,即使是短暂离开。
finishOnTaskLaunch
与clearTaskOnLaunch类似,但仅作用于单个Activity上。如果某个Activity将这个属性设置成true,那么用户一旦离开了当前任务,再次返回时这个Activity就会被清除掉。