Android - 是否可以确定某项活动是否是从其他任务启动的?

时间:2013-02-12 04:19:35

标签: android android-activity task lifecycle

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

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

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

有没有办法在不使用任何用户可怕的权限(例如GET_TASKS)的情况下执行此操作。我已经被困在这个问题很长一段时间了,所以任何帮助都会非常感激:)

Tyvm, B.坎贝尔

2 个答案:

答案 0 :(得分:3)

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

Tasks and Back Stack

Navigation with Back and Up

Application Structure

以下是一些亮点:

  

任务是用户与之交互的活动的集合   从事某项工作。活动排成一堆(   “后台堆栈”),按照每个活动的开放顺序。

     

当前活动开始另一个活动时,将推送新活动   在堆栈顶部并获得焦点。之前的活动仍然存在   在堆栈中,但已停止。当活动停止时,系统   保留其用户界面的当前状态。当用户按下时   在后退按钮,当前活动从顶部弹出   堆栈(活动被破坏),之前的活动恢复   (其UI的先前状态已恢复)。堆栈中的活动   永远不会重新排列,只能从堆叠中推出并弹出   当前活动启动时弹出到堆栈上并弹出   当用户使用“后退”按钮离开时。

这意味着当您的应用程序pick up a contact时,任务中的活动堆栈可能是:

|联系人|

中的活动A.

|您应用中的活动B |

|其他app中的活动C |

  

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

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

根据评论编辑:

您可以FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY检查活动是否已从历史记录中打开:

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

}else{

}

您还可以查看:

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

android:finishOnTaskLaunch

android:stateNotNeeded

答案 1 :(得分:1)

如果您加载的数据与application生命周期相关,而不是特定activity,则可以在application类中加载,因此不会再次重新加载你的申请任务被杀了。

相关问题