为什么关闭应用程序后,我必须双击通知才能将其关闭?

时间:2019-04-28 12:26:19

标签: java android android-notifications

我正在为Android创建ClockApp。我有AlarmBroadcastReceiver,它通过按钮close alarm给我通知,当用户单击该按钮时,通知将消失。但是,当我的应用程序关闭时,它不起作用。例如,我将闹钟设置为上午7:00,然后关闭了应用程序,然后醒来,并在手机上发现了一个通知close alarm,我点击了该按钮,但是我刚刚被重定向到主要活动,然后点击了再次,只有这样,通知才会消失。为什么我必须单击两次?但是,如果未关闭我的应用程序,则只需单击一次,通知将消失。希望您能解决我的问题)

代码:(我的MainActivity带标签)

MainActivity:

  @Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    // cancel notifications
    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    if (intent.getBooleanExtra("alarm_cancel_notification", false)) {
        if (notificationManager != null) {
            notificationManager.cancel(1);
        }
    }
}

AlarmFragment:

 private void startAlarm() {
    Intent intent = new Intent(getContext(), AlarmManagerBroadcastReceiver.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(
            getContext(),
            1,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    if (Build.VERSION.SDK_INT >= 23) {
        AlarmManager.AlarmClockInfo alarmClockInfo =
                new AlarmManager.AlarmClockInfo(mCalendar.getTimeInMillis(), pendingIntent);
        mAlarmManager.setAlarmClock(alarmClockInfo, pendingIntent);
    } else if (Build.VERSION.SDK_INT >= 19) {
        mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pendingIntent);
    } else {
        mAlarmManager.set(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pendingIntent);
    }
}

BroadcastReceiver:

public class AlarmManagerBroadcastReceiver extends BroadcastReceiver {

private static final int ALARM_EXPIRED_NOTIFICATION_ID = 1;

@Override
public void onReceive(Context context, Intent intent) {
    NotificationManager notificationManager =
            (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent notificationIntent = new Intent(context, MainActivity.class);
    notificationIntent.putExtra("alarm_cancel_notification", true);
    PendingIntent notificationPendingIntent = PendingIntent.getActivity(
            context,
            1,
            notificationIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    RemoteViews remoteViews = new RemoteViews(
            context.getPackageName(),
            R.layout.partial_notification);
    remoteViews.setTextViewText(
            R.id.cancel_button_notification,
            context.getString(R.string.alarm_notification));
    remoteViews.setOnClickPendingIntent(
            R.id.cancel_button_notification,
            notificationPendingIntent);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(
            context,
            ChannelIdApp.CHANNEL_ID);
    builder.setAutoCancel(true)
            .setTicker("Alarm")
            .setCustomContentView(remoteViews)
            .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM))
            .setSmallIcon(R.drawable.ic_stat_notify_clock);

    Notification notification = builder.build();
    notification.flags = notification.flags | Notification.FLAG_INSISTENT;

    if (notificationManager != null) {
        notificationManager.notify(ALARM_EXPIRED_NOTIFICATION_ID,  notification);
    }
}

}

频道ID:

 public class ChannelIdApp extends Application {

public static final String CHANNEL_ID = "clock_channel_id";

@Override
public void onCreate() {
    super.onCreate();

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        NotificationChannel notificationChannel = new NotificationChannel(
                CHANNEL_ID,
                "Clock notifications",
                NotificationManager.IMPORTANCE_HIGH);
        notificationChannel.enableVibration(true);
        notificationChannel.enableLights(true);

        if (notificationManager != null) {
            notificationManager.createNotificationChannel(notificationChannel);
        }
    }
}

}

清单:

 <activity
        android:launchMode="singleTop"
        android:name=".activities.MainActivity"
        android:screenOrientation="portrait" />

    <receiver
        android:exported="false"
        android:name=".AlarmManagerBroadcastReceiver" />

1 个答案:

答案 0 :(得分:0)

尝试在此行之后的.setAutoCancel(true);类中添加AlarmManagerBroadcastReceiver

NotificationCompat.Builder builder = new NotificationCompat.Builder(
        context,
        ChannelIdApp.CHANNEL_ID);
builder.setAutoCancel(true)
        .setTicker("Alarm")
        .setCustomContentView(remoteViews)
        .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM))
        .setSmallIcon(R.drawable.ic_stat_notify_clock)
        // <<here>>  ;