android启动模式的应用
A. Android —— Activity的四种启动模式
除了Activity的生命周期外,Activity的启动模式也是一个难点,有时候为了满足项目的特殊需求,就必须使用Activity的启动模式。
在默认情况下,当我们多次启动同一个Activity的时候,系统会创建多个实例并把它们放入任务栈中,但是有些场景重复创建多个实例,是没有必要且浪费资源的,这就需要启动模式来修改系统的默认行为。
下面,我将以理论+实践的形式为大家介绍Activity的启动模式。
这是系统的默认启动模式,采用这种模式的Activity无论是否已经存在实例,都会重新创建一个实例,在这种模式下谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。
实践:MainActivity 采用 standard 模式
在这种模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的 NewIntent 方法将会被回调。如果新Activity的实例已存在但不是位于栈顶,那么新Activity依然会被创建。
实践:MainActivity 采用 singleTop 模式
MainActivity 采用 singleTop 模式,SecondActivity采用 standard 模式
这是一种单实例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,而是回调 onNewIntent() 。
实践:MainActivity 采用 singleTask 模式
MainActivity 采用 singleTask 模式,SecondActivity采用 standard 模式
这是一种加强的 singleTask 模式,它除了具有 singleTask 模式的所有特性外,还加强了一点,那就是具有此模式的Activity只能单独的位于一个任务栈中。
实践:MainActivity 采用 singleInstance 模式
MainActivity 采用 singleInstance 模式,SecondActivity采用 standard 模式
以上就是Activity启动模式的介绍。
欢迎留言指出错误。
B. android 主界面一般用什么启动模式
我常用的是使用single单例模式,因为这样可以节省不必要的初始化动作
C. Android N“直接启动”是什么神奇的功能
从 Android N 开始,在首次开机时,在用户尚未来得及解锁设备之前,设备可直接启动到一种名为 Direct Boot(直接启动)的新模式中。在此模式下,操作系统可以全功能运行,但不允许访问私有应用数据,只能运行经过更新、可支持直接启动功能的应用。
直接启动适合我的应用吗?并非所有应用都应运行在直接启动模式下,因此,在开始编码之前,请务必先检查您的应用是否符合以下常见的用例:
安排闹铃的应用,如闹钟。
提供重要且及时的通知的应用,如短信应用。
为其他应用或系统提供服务的应用,例如辅助工具服务。
请注意,以上并非详尽的用例列表,我们期待看到还有哪些类型的应用能够从直接启动模式获益。
让您的应用支持直接启动
为了让您的应用能够在用户解锁设备之前运行,您必须在清单文件中将组件显式标记为支持直接启动:
<activity|provider|receiver|service ...
android:directBootAware=”true”>
您可以选择您的应用中需要支持直接启动的组件子集,但如果您使用的是自定义 Application 类,则假定应用内部标记为支持直接启动的任何组件均支持直接启动。对于需要在直接启动模式下在系统启动之后尽快运行的应用,现在提供一种新的 Intent.ACTION_LOCKED_BOOT_COMPLETED 广播。在用户解锁该设备之后,所有应用仍将收到 Intent.ACTION_BOOT_COMPLETED 广播。
使用设备保护存储区为了支持应用在用户提供解锁私有应用数据所需的凭据之前的正常运行,所有 Android N 设备现在均提供两个数据存储位置:
凭据保护存储区,这是所有应用的默认存储位置,仅在用户解锁设备后可用。
设备保护存储区,这是一个新的存储位置,当设备启动后(包括直接启动期间)随时都可访问该位置。
应用中被标记为支持直接启动的组件必须使用设备保护存储区来存储直接启动模式期间应用操作所需的任何数据。在用户解锁设备后,用户仍可访问凭据保护存储区。
要访问设备保护存储区,您需要为所有文件相关的 API 另外创建并使用一个 Context 对象:
Context deviceProtectedContext = context.();
deviceProtectedContext.openFileInput( ... )
当您的应用更新到支持直接启动的版本之后,您之前保存的共享首选项
或数据库可能需要迁移到设备保护存储区。在访问该存储区之前,即使数据已从旧版本或其他设备中备份并恢复,您仍应使
用 Context.moveSharedPreferencesFrom() 和
Context.moveDatabaseFrom(),以确保应用能够继续正常运行。
注意事项
您
应审慎考虑要在设备保护存储区中存储哪些数据。应尽量减少在设备保护存储区中存储的数据,以确保您的应用在直接启动期间正常运行为限。例如,在短信应用
中,您可以存储一个访问令牌,其作用域仅限于能够访问服务器上的新消息数量。所有敏感的私人信息(例如完整的短信历史记录和读/写访问令牌)仍应保存在凭
据保护存储区中。
另外需要提醒的一点是:在直接启动期间,应用只能访问其他支持直接
启动的应用和组件。如果您的应用依赖外部服务和 Activity,请确保妥善处理外部服务和 Activity
不可用的情形。默认情况下,Intent 过滤器仅匹配当前用户状态(已锁定/已解锁)下可用的组件。现在有两个新的标志,可用于向 Package
Manager
显式声明需要枚举哪些组
件:PackageManager.MATCH_DIRECT_BOOT_AWARE 和 PackageManager.MATCH_DIRECT_BOOT_UNAWARE。
未来计划
在
原生支持直接启动的 Android N 设备发布之前,您可以使用 Android N 开发者预览版测试您的应用。在 Nexus 5X 和
Nexus 6P 上,您可以通过使用 Settings > Developer options > Convert to file
encryption 来擦除所有用户数据并启用完整的直接启动模式。或者,您也可以重新启动到引导装载程序并发出相应的快速启动命令:
$ adb reboot-bootloader
$ fastboot --wipe-and-use-fbe
警告:这两种方法都将执行恢复出厂设置并删除设备中的所有用户数据。
或者,您也可以使用模拟的直接启动模式。若要启用模拟直接启动模式,请在设备上设置锁定模式,如果在设置锁定模式时系统提示安全启动屏幕,则选择“No thanks”,然后使用以下 adb shell 命令启用和禁用模拟:
$ adb shell sm set-emulate-fbe true
$ adb shell sm set-emulate-fbe false
请注意,使用这些命令会导致设备重启。您只应在测试设备上使用模拟直接启动模式,因为该模式可能导致数据丢失。
D. Android四种启动模式在什么时候使用
standard(默认)
系统默认的启动模式。
Android是使用返回栈来管理活动的,在standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。
对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,而是每次启动活动都会创建该活动的一个新的实例。
singleTop
android:launchMode="singleTop"
当活动的启动模式指定为singleTop,在启动活动时,如果发现该返回栈的栈顶已经是该活动时,则认为可以直接使用它,不会在创建新的活动实例
singleTask
当活动的启动模式指定为singleTask,每次启动该活动时,首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在就直接使用该实例,并把这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
android:launchMode="singleTask"
singleInstance
指定为singleInstance模式的活动会启用一个新的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,解决了共享活动实例的问题
修改SecondActivity的启动模式
android:launchMode="singleInstance"
使用方式:
standard:怎么样都要创建
singleTop:顶上不是target Activity,new一个
singleTask:顶上不是target Activity,移除target之上的,把自己变成top。
singleInstance:开辟私有的task,完全独立于程序的其他activity的task。
使用场景:
standard:普通activity
singleTop:要展示推送过来的消息
singleTask:程序入口等启动页面
singleInstance:完全独立的,类似闹钟的提示