BroadcastReceiver не работает во второй раз - PullRequest
2 голосов
/ 06 апреля 2020

Я пытаюсь запланировать уведомления с помощью AlarmManager. Это прекрасно работает, когда я планирую одно уведомление, но когда я планирую два уведомления, первое уведомление в порядке, но второе не работает.

Я понял, что открытие приложения через несколько минут оповестит о втором уведомлении. Я думаю, что-то не так с моим BroadcastReceiver

MainActivity. java

Intent intent = new Intent(context,NotificationClass.class);
intent.putExtra("notification_id", id);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,id,intent,PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),pendingIntent);

Уведомление. java

public class NotificationClass extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        int id = intent.getIntExtra("notification_id",0);
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context,"1")
            .setContentTitle("Notification")
            .setContentText("Content")
            .setSmallIcon(R.drawable.notif_ic);

        Notification notification = builder.build();
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel("1","test", NotificationManager.IMPORTANCE_HIGH);
            notificationManager.createNotificationChannel(channel);
        }
        notificationManager.notify(id,notification);
}

AndroidManifest. xml

<receiver android:name=".NotificationClass" ></receiver> 

Я не знаю, что не так с моим кодом. Кто-нибудь может мне помочь с этим?

Ответы [ 3 ]

1 голос
/ 14 апреля 2020

Приемник вещания для приема данных:

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String alertMessage = intent.getStringExtra("type");

        doNotificationAlertWorkHere(alertMessage);
    }
};

Зарегистрируйте и отмените регистрацию вашей трансляции, чтобы избежать утечек c.

через файл манифеста Android. (Статически)

<receiver android:name="YourBroadcastReceiverName"> </receiver>

посредством методов Context.registerReceiver () и Context.unregisterReceiver (). (Динамически)

 @Override
    protected void onPause() {
        super.onPause();
        // unregister broadcast
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver);
    }

    @Override
    protected void onResume() {
        super.onResume();

        // register broadcast
        IntentFilter filter = new IntentFilter(Constants.ACTION);
        LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filter);
    }

Отправить трансляцию, например:

// public static final String ACTION = "ALERT";

Intent intent = new Intent(Constants.ACTION);
intent.putExtra("type", "SUP BRO. Stay Inside");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

Примечание к сведению: - Приемник трансляции подобен пушечному ядру, чтобы нанести удар, вы должны определить, что выстрелить ( например, msg), где стрелять (например, активность). Загрузите и выгрузите пушку, чтобы нанести еще один удар. (например. Зарегистрироваться и отменить регистрацию)

0 голосов
/ 15 апреля 2020

Я пробовал, и это работает. Добавьте код уведомления внутри onReceive.

Broadcast Receiver

class AlarmReceiver : BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent) {

 /*
  Your implementation

   */
 }
}

Mainfest

    <receiver
        android:name=".AlarmReceiver"
        android:exported="true"
        android:enabled="true" />

Создание ожидающих намерений

val alarmManager = activity.getSystemService(Activity.ALARM_SERVICE) as AlarmManager
        val alarmIntent = Intent(activity.applicationContext, AlarmReceiver::class.java) // AlarmReceiver1 = broadcast receiver

        val calendar = Calendar.getInstance()
        calendar.timeInMillis = timeInMilliSeconds

        val pendingIntent = PendingIntent.getBroadcast(activity, timeInMilliSeconds.toInt(), alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT)
        alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
0 голосов
/ 09 апреля 2020

Во-первых, убедитесь, что ваш идентификатор уведомления отличается каждый раз, когда вы создаете уведомление

Во-вторых, вы пропускаете тэг intent-filter внутри тега receive в манифесте. Пожалуйста, проверьте это https://developer.android.com/guide/components/broadcasts.

Надеюсь, что это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...