5

我可以通过activity.getTaskId(). 它将报告回来185。如果我去另一个应用程序,并从共享按钮开始我的活动,它将被放置在那个应用程序堆栈中。例如,如果我这样做activity.getTaskId(),它将报告回来192。我假设一个应用程序进程只能有一个与之关联的主任务堆栈。我如何获得该任务 ID?我希望能够知道“嘿,我正在您的应用程序任务堆栈之外运行”。

我打算通过在第一次创建我的活动时轮询 taskId 并将其设置为我的应用程序类的成员变量来做到这一点,但是如果我的应用程序被杀死,然后首先从另一个应用程序启动,它将具有不正确的任务 ID 为“AppTaskStackId”。我还没有找到任何API。

4

3 回答 3

2

另一种方法可能是同时拥有出口和非出口活动。导出的活动将简单地转发到未导出的活动,但额外表示它是从外部启动的。然后在内部启动活动时,您总是调用未导出的活动而没有额外的“isExternal”。

然后,在未导出的活动中,您可以检查该额外活动是否存在,以确定活动是在内部还是外部启动的。

于 2014-07-18T19:55:18.203 回答
1

我能找到更接近你想要完成的唯一方法是在你Activity的 's中使用以下代码onCreate

ActivityManager m = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> runningTaskInfoList =  m.getRunningTasks(1);
if(!runningTaskInfoList.isEmpty()) {
    String callingPackageName = runningTaskInfoList.get(0).baseActivity.getPackageName();
}

callingPackageName如果该活动已从您自己的应用程序中的另一个活动调用,或者是您的应用程序的主要活动,则此处将设置为您的应用程序的包名称。

但是,如果 Activity 是由另一个应用程序启动的,比如使用 share 函数,那么callingPackageName将是调用应用程序的包名,所以您所要做的就是通过调用来检查这是否等于您的应用程序的包名getPackageName()

另请注意:

  • 您的应用现在需要android.permission.GET_TASKS权限
  • 此方法的文档指出:

注意:此方法仅用于调试和呈现任务管理用户界面。这绝不应该用于应用程序中的核心逻辑,例如根据此处找到的信息来决定不同的行为。此类用途不受支持,将来可能会中断。

所以我不确定这有多可靠,或者它是否对你有用。

于 2014-07-18T20:05:50.997 回答
0

最近(API 29)添加了 TaskInfo:

https://developer.android.com/reference/android/app/TaskInfo

应该在这里有所帮助。

于 2020-10-27T22:16:24.843 回答