【问题标题】:Android GCM: different way of handling push depending on whether the app is visible or notAndroid GCM:根据应用程序是否可见处理推送的不同方式
【发布时间】:2014-05-19 13:31:10
【问题描述】:

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

现在,对于每次推送,我都会发送一个通知,并且在用户单击它后,他会被重定向到相应的屏幕。

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

知道如何实现它吗?

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

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

还有其他解决方案吗?

【问题讨论】:

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


    【解决方案1】:

    一个可能的解决方案(想法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
      }
    }
    

    希望对你有帮助!

    【讨论】:

    • 好吧,其实我是想避免这种情况。如果您有几个活动,则代码会变得复杂,并且在切换活动时还会出现过渡。如果在这种状态下推送进来,可能处理不当。
    【解决方案2】:

    我没有对其进行测试,但文档说您可以在每个任务中获得 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;
        }
    }
    

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

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

    所以使用它需要您自担风险。


    同时检查 GCM 广播是否为ordered。如果是这样,您可以使用每个活动中的其他“覆盖”您的默认BroadcastReceiver。只需使用IntentFilters 的priority 即可。当具有较高优先级的BroadcastReceiver 收到消息时,它可以abort 进一步传播。对于您的应用程序,这意味着当某些Activity 正在运行时,它会注册显示对话框并中止广播的接收器。如果没有活动处于活动状态,则您的默认接收器会显示通知。

    【讨论】:

    • 由于您提到的原因,我不想使用第一个解决方案。第二种解决方案似乎是promissiong,我会检查它
    • GCM 广播确实有顺序!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多