Android GCM:根据应用程序是否可见来处理推送的不同方式

kma*_*mur 8 java android push-notification google-cloud-messaging

我有几个活动和一个处理GCM传入消息的意图服务.

现在,每次推送,我都会发送一个通知,在用户点击它之后,他会被重定向到适当的屏幕.

我想改变这种行为,即如果应用程序可见(任何活动在前台),而不是通知,则显示对话框消息(通过适当的操作).

知道如何实现它吗?

我有2个想法,但没有一个是完美的:

  • 跟踪应用程序中的每个活动,如果活动可见,不显示通知,但向活动发送意图(不是很好的解决方案)
  • 在每个活动的onResume/onPause中注册/取消注册第二个广播接收器,"捕获"传入的GCM广播(我不确定是否可能).

还有其他方法吗?

Ale*_*rev 0

我没有测试它,但文档说您可以获取每个任务正在运行的活动的数量。

尝试在当前正在运行的任务中找到您的应用程序的任务:

ActivityManager acitivityManager = (ActivityManager) 
    context.getSystemService(Context.ACTIVITY_SERVICE);
// Get the top of running tasks, limit by 100
List<RunningTaskInfo> tasks = acitivityManager.getRunningTasks(100);
for (RunningTaskInfo taskInfo : tasks) {
    if (YOUR_PACKAGE_NAME.equals(taskInfo.baseActivity.getPackageName())) {
        if (taskInfo.numRunning > 0) {
            // Show dialog
        } else {
            // Show notification
        }
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

谷歌添加了一条注释getRunningTasks()

注意:此方法仅用于调试和呈现任务管理用户界面。这不应该用于应用程序中的核心逻辑,例如根据此处找到的信息在不同行为之间做出决定。此类用途不受支持,并且将来可能会中断。例如,如果多个应用程序可以同时主动运行,则出于控制流目的而对此处数据的含义所做的假设将是不正确的。

因此,使用它需要您自担风险。


还要检查 GCM 广播是否已排序。如果是这样,您可以BroadcastReceiver使用每个活动中的其他默认值“覆盖”您的默认值。就玩s的优先级IntentFilter吧。当BroadcastReceiver具有较高优先级的接收到该消息时,它可以中止其进一步的传播。对于您的应用程序来说,这意味着当某些应用程序Activity运行时,它会注册显示对话框的接收器并中止广播。如果没有活动活动,则您的默认接收器会显示通知。