当我管理推送通知时如何知道我的应用程序是不是打开

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于当我管理推送通知时如何知道我的应用程序是不是打开的主要内容,如果未能解决你的问题,请参考以下文章

在前台单击推送通知横幅后如何触发操作

如何在点击推送通知时打开特定帖子

Wp7 推送通知以启动我的应用程序

当我的 iPad 关闭时,只收到最后一个推送通知

单击推送通知时如何打开应用程序的特定页面

当我删除应用程序时推送通知