在服务中,检查活动堆栈中是否存在特定活动

时间:2016-08-16 10:17:35

标签: android service google-cloud-messaging activity-stack

我需要为我的应用程序结构提供一些建议。它是关于使用GCM进行消息传递的。 所以我在GcmListenerService中获取了onMessageReceived调用(带有消息数据)。 现在有两种情况:

a)活动堆栈中已经有一个聊天活动,我应该发送一个含有新消息信息的Intent,以便活动更新其视图

b)目前还没有打开的聊天活动,所以我只是要显示通知。
重要的是,如果在堆栈顶部有活动,我不想显示通知。

如何检测活动堆栈中是否有聊天活动?

1 个答案:

答案 0 :(得分:0)

可以使用 ActivityManager检查当前任务及其堆栈。

因此,要确定活动是否是最后一个活动:

在清单中请求 android.permission.GET_TASKS 权限。

使用以下代码:

ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );

List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);

if(taskList.get(0).numActivities == 1 &&
   taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
    Log.i(TAG, "This is last activity in the stack");
}

只有当您有单个任务时,上述代码才有效。如果您的应用程序可能存在多个任务 - 您需要检查其他taskList元素。阅读有关任务任务和后台堆栈的更多信息

第二个解决方案是

public boolean isRunning(Context ctx) {
        ActivityManager activityManager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

        for (RunningTaskInfo task : tasks) {
            if (ctx.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName())) 
                return true;                                  
        }

        return false;
    }
相关问题