我正在尝试制作类似于原生闹钟应用的应用。所以,这是我正在寻找的理想结果。 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());
答案 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);