通知只有在后台运行时才将Activity带入前台

时间:2014-12-16 15:07:50

标签: android android-intent notifications

我正在尝试制作类似于原生闹钟应用的应用。所以,这是我正在寻找的理想结果。 AlarmGoOffActivity接收待处理的意图,它会触发并显示闹钟,并通过按钮和关闭按钮完成。它必须始终作为单个实例运行。实例应该在前/后按钮和通知图标的帮助下移动前景/背景(通知与警报同时发布)

但是,从我编写的代码中,我能够

1)显示通知和警报。单击通知时,无论它在何处(前景或背景),都会将其置于前台。

2)当活动进入前景时,在实际报警屏幕之前显示白色屏幕和操作栏。

这就是我必须要做的事情

1)当用户检查闹钟并按主屏幕或后退按钮并且活动进入后台时,我需要在通知的帮助下将其提前。 2)但是,如果活动已经在前台并且点击了通知图标,则不会发生任何事情。

如果您可以在此代码中建议我需要更改的内容,那就太棒了。

的AndroidManifest.xml

   <activity
        android:name="com.alarm.productive.justalarm.Activities.AlarmGoOffActivity"
        android:label="@string/app_name"
        android:launchMode="singleTask"
        android:screenOrientation="portrait">

    </activity>

AlarmGoOffActivity.java 通知部分

  NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(context)
                    .setSmallIcon(R.drawable.clock_logo)
                    .setContentTitle(utilFunctions.toCamelCase(currentAlarmInView.getName()))
                    .setContentText("Snooze or Dismiss Alarm");
    Intent resultIntent = new Intent(context, AlarmGoOffActivity.class);
resultIntent.putExtra(DBHelper.COLUMN_ID,currentAlarmInView.getId());
if(isSnooze){
    resultIntent.putExtra(DBHelper.TASK_TITLE,"snooze");

}

resultIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(AlarmGoOffActivity.class);
    stackBuilder.addNextIntent(resultIntent);
    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(
                    1001,
                    PendingIntent.FLAG_UPDATE_CURRENT
            );
    mBuilder.setContentIntent(resultPendingIntent);
    mNotificationManager =
            (NotificationManager)context. getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(currentAlarmInView.getId(), mBuilder.build());

1 个答案:

答案 0 :(得分:5)

您不需要使用TaskStackBuilder,因为您的任务只包含1个活动。使用TaskStackBuilder会导致您的活动重新启动,这不是您想要的。

您不需要使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT。此标志用于重新排序任务中的活动。你的任务只包含一个Activity,所以将它重新排序到前面是没用的,因为它已经在前面(任务)。

您需要使用Intent.FLAG_ACTIVITY_NEW_TASK,它将在新任务中启动活动(如果活动尚未在现有任务中运行),或者它只是将现有任务带到前台(如果它已经在运行)。

改为创建这样的通知:

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.clock_logo)
                .setContentTitle(utilFunctions.toCamelCase(currentAlarmInView.getName()))
                .setContentText("Snooze or Dismiss Alarm");
Intent resultIntent = new Intent(context, AlarmGoOffActivity.class);
resultIntent.putExtra(DBHelper.COLUMN_ID,currentAlarmInView.getId());
if (isSnooze){
    resultIntent.putExtra(DBHelper.TASK_TITLE,"snooze");
}
// Setting this flag ensures that the task will be brought forward if
//  it is in the background, but nothing will happen if it is already
//  in the foreground
resultIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

PendingIntent resultPendingIntent =
        PendingIntent.getActivity(this,
                1001,
                resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT
        );
mBuilder.setContentIntent(resultPendingIntent);