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

时间:2014-04-07 10:45:43

标签: java android push-notification google-cloud-messaging

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

现在,对于每次推送,我都会发送通知,在用户点击后,他会被重定向到适当的屏幕。

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

知道如何实现它吗?

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

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

还有其他解决方案吗?

2 个答案:

答案 0 :(得分:3)

可能的解决方案(想法1):

要检测您的应用程序是在后台运行还是前台运行,您只需在onPause / onResume中设置一个布尔值:

@Override
protected void onResume() {
  super.onResume();
  runningOnBackground = false;
}

@Override
protected void onPause() {
  super.onPause();
  runningOnBackground = true;
}

当您从通知中启动一个新意图时,会调用此方法:(如果您使用的是singleTop),使用布尔值可以确定在onNewIntent方法中要执行的操作。

@Override
protected void onNewIntent (Intent intent){
  if(runningOnBackground){
    //do this
  }
  else{
    //do that
  }
}

希望它有所帮助!

答案 1 :(得分:1)

我没有对它进行测试,但是文档说你可以为每项任务获得number of running activities

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

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;
    }
}

Google在getRunningTasks()上添加了一条说明:

  

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

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


同时检查GCM广播是否为ordered。如果是这样,你可以&#34;覆盖&#34;您的默认BroadcastReceiver与每个活动中的其他人一起使用。只需使用IntentFilter的{​​{3}}即可。当具有较高优先级的BroadcastReceiver收到该消息时,它可以priority进一步传播。对于您的应用程序,这意味着当某些Activity正在运行时,它会注册显示对话框并中止广播的接收器。如果没有活动,则默认接收者会显示通知。