当我管理推送通知时,如何知道我的应用程序是否处于打开状态?

6

使用Android平台,当我通过GCMIntentService收到推送通知时,我想要知道我的应用程序是否打开。因为如果我的应用程序打开时,用户点击通知时我想什么都不做,但是如果应用程序关闭了,我想要打开应用程序。

3个回答

8

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


2
但是当应用程序已经活动时,我不想做任何事情,也不想将活动带到前台。 - jlmg5564
1
是的,如果应用程序已经处于活动状态,它会将包含该应用程序的任务置于前台,但不会再次启动根活动。这不是你想要的吗? - David Wasser
3
不,当应用程序已经处于活动状态(打开、在前台运行)时,我不想做任何事情。 - jlmg5564
3
@Sababado 你说的并不正确。如果只是“启动”根活动,它将不会将根活动带到前台(即:活动堆栈的顶部)。这样做的作用是将整个任务(以根活动启动)带到前景中,以其原来的状态显示。这意味着,如果您的应用程序有6个活动,并且您按下HOME键,然后拉下通知栏并选择一个启动您的应用程序的根活动的通知,则此操作将返回该任务到前景,并显示第6个级别的活动。 - David Wasser
1
我有一个包含3个活动的应用程序,使用通知来启动/恢复我的应用程序。如果从通知中启动应用程序,则David的解决方案适用于我,每个将来的通知都会像我想要的那样恢复应用程序。但是,如果我通过单击应用程序图标启动应用程序,然后再单击通知,它会创建一个新的实例,我不知道为什么,任务ID看起来是相同的,这是为什么?你有什么想法吗? - xlar8or
显示剩余5条评论

1
在所有活动中定义以下内容: 1.) 定义一个名为“check_running mode”的静态最终布尔标志。 2.) 在所有活动中定义(覆盖) onResume() 和 onPause() 方法。 3.) 在 onResume() 中将此标志的值设置为“true”,在 OnPause() 方法中将其设置为“false”。 4.) 当您接收到推送通知时,请检查: a. 如果标志值为 true,则表示应用程序在前台,因此在这种情况下不执行任何操作。 b. 如果标志值为 false,则表示应用程序在后台,因此可以在这种情况下打开应用程序。
注意:falg 必须是静态最终的,因为您可以从任何活动更改它并在接收器类中简单地访问它。我希望这对你有用!
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();
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接