【磨叽教程】Android进阶之Activity保活

我想很多开发者都遇到过这种情况:

用户打开我们的应用,在某个表单Activity填写信息准备提交,但是这个时候进来了一个电话或者用户去干其他事情而不得不离开当前界面(而不是直接退出)。等过了一段时间,用户打算重新来处理的时候发现之前填写的信息已经都不见了。

那么我们本节就讨论怎么让这个Activity保活。

在这里插入图片描述

众所周知

如果用户离开任务较长时间,系统会清除任务中除根 Activity 以外的所有 Activity。当用户再次返回到该任务时,只有根 Activity 会恢复。系统之所以采取这种行为方式是因为,经过一段时间后,用户可能已经放弃了之前执行的操作,现在返回任务是为了开始某项新的操作。

那么,如果我们要解决文首那个问题怎么办?很简单。

您可以使用一些 Activity 属性来解决:

alwaysRetainTaskState

如果在任务的根 Activity 中将该属性设为 “true”,则不会发生上述默认行为。即使经过很长一段时间后,任务仍会在其堆栈中保留所有 Activity。

clearTaskOnLaunch

如果在任务的根 Activity 中将该属性设为 “true”,那么只要用户离开任务再返回,堆栈就会被清除到只剩根 Activity。也就是说,它与 alwaysRetainTaskState 正好相反。用户始终会返回到任务的初始状态,即便只是短暂离开任务也是如此。

finishOnTaskLaunch

该属性与 clearTaskOnLaunch 类似,但它只会作用于单个 Activity 而非整个任务。它还可导致任何 Activity 消失,包括根 Activity。如果将该属性设为 “true”,则 Activity 仅在当前会话中归属于任务。如果用户离开任务再返回,则该任务将不再存在。

经常使用keep的同学应该知道,当你打开keep的跑步功能的时候,不管你是锁屏还是把它切换到后台,系统都不会把它kill掉。他们用的就是这种方法。

同时,在解决类似问题的时候,我们还需要了解一个小知识点。

启动任务

你可以设置一个 Activity 作为任务的入口点,方法是为该 Activity 提供一个 intent 过滤器,并将 “android.intent.action.MAIN” 作为指定操作,将 “android.intent.category.LAUNCHER” 作为指定类别。例如:

   <activity ... >
        <intent-filter ... >
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        ...
    </activity>

这种 intent 过滤器可在应用启动器中显示 Activity 的图标和标签,让用户可以启动 Activity 并在启动后随时返回到该 Activity 创建的任务。

但这仅仅是它的第一种作用,第二种作用就显得非常重要了:用户必须能够离开任务,之后再使用此 Activity 启动器返回到该任务。因此,只有当 Activity 具有 ACTION_MAIN 和 CATEGORY_LAUNCHER 过滤器时,才应使用 “singleTask” 和 “singleInstance” 这两种启动模式,它们会将 Activity 标记为始终启动任务。

比如,想象一下如果缺少该过滤器会发生什么情况:intent 会启动 “singleTask” Activity,随之启动新任务,用户花了一些时间在该任务上。然后,用户按主屏幕按钮。此时,该任务会转到后台,不再可见。那么,这个时候用户将无法返回到该任务,因为它未显示在应用启动器中。更对内容请关注“计算机自学平台”

所以,对于那些您不希望用户能够返回到 Activity 的情况,请将**< activity >**元素的 finishOnTaskLaunch 设置为 “true”。

猜你喜欢

转载自blog.csdn.net/farley119/article/details/107932348