Почему я должен дважды щелкнуть по уведомлению, чтобы закрыть его, когда мое приложение было закрыто? - PullRequest
1 голос
/ 28 апреля 2019

Я создаю ClockApp для Android. У меня есть 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);
    }
}

}

Идентификатор канала:

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

}

Manifest:

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

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

1 Ответ

0 голосов
/ 28 апреля 2019

попробуйте добавить .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>>  ;
...