【问题标题】:How to know if my app is open when I managed a push-notification当我管理推送通知时如何知道我的应用程序是否打开
【发布时间】:2013-05-07 19:42:53
【问题描述】:

使用 Android,当我收到通知推送时抛出我的 GCMIntentService,我想知道我的应用程序是否打开,因为如果我的应用程序在用户单击通知时打开,我什么都不想做,但如果应用已关闭 我想打开应用。

【问题讨论】:

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


    【解决方案1】:

    启动根活动(清单中包含 ACTION=MAIN 和 CATEGORY=LAUNCHER 的活动)并添加 Intent.FLAG_ACTIVITY_NEW_TASK。如果应用程序已经处于活动状态(无论哪个活动在顶部),这只会将任务带到前面。如果应用程序未处于活动状态,它将使用您的根活动启动它。

    【讨论】:

    • 但是当应用程序已经处于活动状态时,我不想什么都不做,我不想把活动带到最前面
    • 是的,如果应用程序已经处于活动状态,它将把包含应用程序的任务带到最前面,但它不会再次启动根活动。这不是你想要的吗?
    • 不,当应用程序已经处于活动状态时(打开,在前台运行)我不想做任何事情
    • @Sababado 你说的不是真的。如果您只是“启动”根 Activity,它不会将根 Activity 置于最前面(即:Activity 堆栈的顶部)。这样做的目的是将整个 task(从根 Activity 开始)带到前台,无论它处于何种状态。这意味着,如果您的应用程序中有 6 个 Activity,然后按 HOME,然后拉下通知栏并选择一个启动应用程序的根活动的通知,这会将任务返回到前台并显示第 6 级活动。
    • 我有一个包含 3 个活动的应用程序,它们使用通知来启动/恢复我的应用程序。如果应用程序是从通知启动的,大卫的解决方案对我有用,以后的每个通知都会像我想要的那样恢复应用程序,但是如果我通过单击应用程序图标启动应用程序然后单击通知,它将创建一个新实例并且我不知道为什么,任务 id 看起来一样,知道为什么会这样吗?
    【解决方案2】:

    在所有活动中定义这一点: 1.) 定义一个名为“check_running mode”的静态最终布尔标志 2.) 在所有活动中定义(覆盖)onResume() 和 onPause() 方法。 3.) 分别在 onResume() 和 OnPause() 方法中将此 falg 的值设置为“true”和“false”。 4.)当你收到推送通知时检查: 一种。如果 falg 值为 true,则表示应用程序处于前台,因此在这种情况下什么也不做 湾。如果标志值为 false,则表示应用处于后台,因此您可以在这种情况下打开应用

    注意:falg 必须是静态的 final,因为您可以从任何活动中更改它并在您的接收器类中简单地访问它。希望对你有用!

    1 :
    static boolean check_running mode = false;
    
    
    -------------------
    2:
    @Override
    protected void onResume() {
        super.onResume();
    
        check_running mode = true;
    }
    
    @Override
    protected void onPause() {
        check_running mode = false;
    
        super.onPause();
    }
    
    ---------------------
    3 :
    if (check_running mode) {
        showUserView();
    }
    else {
        showNotification();
    }
    

    【讨论】:

      【解决方案3】:
      public static boolean isAppRunning(Context context) {
          // check with the first task(task in the foreground)
          // in the returned list of tasks
          ActivityManager activityManager = (ActivityManager) context
                  .getSystemService(Context.ACTIVITY_SERVICE);
          List<RunningTaskInfo> services = activityManager
                  .getRunningTasks(Integer.MAX_VALUE);
          if (services.get(0).topActivity.getPackageName().toString()
                  .equalsIgnoreCase(context.getPackageName().toString())) {
              // your application is running in the background
              return true;
          }
          return false;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多