1

这是相当详尽的,所以我会尽量清楚。目前,我的应用程序在启动时需要重新加载一些数据。我在我的主要活动的 onCreate/onRestart 方法中加载这些数据。但是,如果用户从不离开当前任务,我需要小心不要重新加载数据。

例如,如果我需要从我的主要活动启动内置的联系人应用程序来选择一个联系人,那么我的主要活动将在我选择一个新联系人时暂停/停止。当我回到我的主要活动时,将调用 onRestart。在这种情况下,因为我从未离开过应用程序的任务,所以我不想重新加载数据。这意味着需要在此处包含一些检查,以确定用户是否直接从联系人应用程序返回而无需离开它。

否则,如果用户在打开时退出联系人应用程序并从启动器菜单(或最近的应用程序列表等)重新启动应用程序 - 我想关闭联系人应用程序并在主活动的 onRestart 方法时重新加载数据叫。

有没有办法在不使用任何可怕的权限(例如 GET_TASKS)的情况下做到这一点。我已经被这个问题困扰了很长时间,所以任何帮助都将不胜感激:)

Tyvm, B. 坎贝尔

4

2 回答 2

3

我从 Android 文档中学到了很多东西:

任务和回栈

带有返回和向上的导航

应用结构

这里有一些亮点:

任务是用户在执行特定工作时与之交互的活动的集合。活动按每个活动的打开顺序排列在一个堆栈(“后堆栈”)中。

当当前活动开始另一个活动时,新活动被推到堆栈顶部并获得焦点。前一个活动保留在堆栈中,但已停止。当活动停止时,系统会保留其用户界面的当前状态。当用户按下 Back 按钮时,当前 Activity 从栈顶弹出(该 Activity 被销毁)并恢复前一个 Activity(其 UI 的先前状态被恢复)。堆栈中的 Activity 永远不会重新排列,只会从堆栈中压入和弹出——当当前 Activity 启动时将其压入堆栈,并在用户使用“后退”按钮离开时弹出。

这意味着当您的应用程序拿起一个联系人时,任务中的活动堆栈可能是:

| 联系人中的活动 A |

| 应用程序中的活动 B |

| 其他应用中的活动 C|

当用户通过按 Home 按钮离开任务时,当前活动停止,其任务进入后台。系统保留任务中每个活动的状态。如果用户稍后通过选择启动任务的启动器图标来恢复任务,则任务将进入前台并恢复堆栈顶部的活动。

即使用户在打开时退出联系人应用程序并从启动器菜单或最近的应用程序列表重新启动应用程序,活动堆栈仍然与我们在上面看到的一样。可能使您的活动从另一个任务开始的唯一可能性是另一个应用程序(可能是启动器应用程序),它通过 startActivity 标志在新任务中启动主要活动,这是一种罕见的情况。在这种罕见的情况下,您可以通过Binder.getCallinguid()简单地检查启动您的活动的应用程序的 uid以区分它。

根据评论编辑:

您可以通过FLAG_ACTIVITY_LAUNCED_FROM_HISTORY检查是否从历史记录中打开了活动:

if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0){

}else{

}

您还可以查看:

android:excludeFromRecents如果您不希望您的应用从最近的应用开始

机器人:finishOnTaskLaunch

android:stateNotNeeded

于 2013-02-12T05:10:20.567 回答
1

如果您正在加载的数据与application生命周期相关而不是特定的activity,您可以在application类中加载它,因此除非您的应用程序任务被终止,否则它不会再次重新加载。

于 2013-02-12T04:26:11.737 回答