Локальное уведомление в Android с помощью Alarmmanager при перезагрузке устройства

#android #android-notifications #alarmmanager

#Android #android-уведомления #alarmmanager

Вопрос:

Я создал локальное уведомление и запустил его в mainactivity.

Код MainActivity ниже:

 import android.app.AlarmManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {
    public static final String NOTIFICATION_CHANNEL_ID = "10001";
    private final static String default_notification_channel_id = "default";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //here i create and call the notification, it will trigger every 30 seconds or so
        scheduleNotification(getNotification("30 second delay"), 30000);
    }

    public void scheduleNotification(Notification notification, int delay) {
        //here is the intent which uses the MyNotificationPublisher.class
        Intent notificationIntent = new Intent(this, MyNotificationPublisher.class);

        notificationIntent.putExtra(MyNotificationPublisher.NOTIFICATION_ID, 1);
        notificationIntent.putExtra(MyNotificationPublisher.NOTIFICATION, notification);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        long futureInMillis = SystemClock.elapsedRealtime()   delay;
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        assert alarmManager != null;
        //here i am starting the alarm manager with setInexactRepeating to continuesly run the notification every 30 seconds
        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, futureInMillis, 3000 * 10, pendingIntent);;

    }

    public Notification getNotification(String content) {
        //here i setup the notification
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, default_notification_channel_id);
        builder.setContentTitle("Scheduled Notification");
        builder.setContentText(content);
        builder.setSmallIcon(R.drawable.ic_launcher_foreground);
        builder.setAutoCancel(true);
        builder.setChannelId(NOTIFICATION_CHANNEL_ID);
        return builder.build();
    }
}
  

Ниже приведен код класса MyNotificationPublisher:

 import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import static app.tutorialspoint.com.notifyme.MainActivity.NOTIFICATION_CHANNEL_ID;

public class MyNotificationPublisher extends BroadcastReceiver {

    public static String NOTIFICATION_ID = "notification-id";
    public static String NOTIFICATION = "notification";
    public void onReceive(Context context, Intent intent) {
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = intent.getParcelableExtra(NOTIFICATION);

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "NOTIFICATION_CHANNEL_NAME", importance);
            assert notificationManager != null;
            notificationManager.createNotificationChannel(notificationChannel);
        }
        int id = intent.getIntExtra(NOTIFICATION_ID, 0);
        assert notificationManager != null;
        notificationManager.notify(id, notification);
    }
}
  

Это XML-манифест, в котором находится приемник.Существует MyNotificationPublisher

 <? xml version = "1.0" encoding = "utf-8" ?>
<manifest xmlns: android = "http://schemas.android.com/apk/res/android"
   package= "app.tutorialspoint.com.notifyme" >
   <uses-permission android :name = "android.permission.VIBRATE" />
   <application
      android :allowBackup = "true"
      android :icon = "@mipmap/ic_launcher"
      android :label = "@string/app_name"
      android :roundIcon = "@mipmap/ic_launcher_round"
      android :supportsRtl = "true"
      android :theme = "@style/AppTheme" >
      <activity android :name = ".MainActivity" >
         <intent-filter>
            <action android :name = "android.intent.action.MAIN" />
            <category android :name = "android.intent.category.LAUNCHER" />
         </intent-filter>
      </activity>
      <receiver android :name = ".MyNotificationPublisher" />
   </application>
</manifest>
  

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

  1. Мне нужно начать показывать это уведомление, когда приложение закрывается пользователем. Не во время работы приложения.
  2. Как мне заставить уведомление запускаться снова и снова после перезагрузки устройства (я попробовал инструкции на этой странице https://developer.android.com/training/scheduling/alarms в разделе «Запуск будильника при перезагрузке устройства», но я не знаю, как снова запустить будильник и запустить уведомление, потому что каждый раз, когда устройство закрывается, все активные сигналы тревоги отменяются. Я попытался использовать «android.permission.RECEIVE_BOOT_COMPLETED», как мне было указано на веб-странице по адресу https://developer.android.com/training/scheduling/alarms а затем вызываем public void scheduleNotification (уведомление об уведомлении, задержка ввода), используя MainActivity mActivity = new MainActivity(); mActivity .scheduleNotification(mActivity.getNotification ( «задержка 30 секунд»), 30000); из класса MyNotificationPublisher, но приложение вылетает.)

Есть мысли или решения?

Ответ №1:

вам необходимо добавить intent-filter в файл манифеста для вашего получателя. Попробуйте приведенный ниже код.

 <receiver android :name = ".MyNotificationPublisher">
   <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
   </intent-filter>
</receiver> 
  

Комментарии:

1. Вы ссылаетесь на вторую проблему. Я уже выполнил ваше предложение. Оно запускается после перезагрузки устройства, но проблема в том, что я не могу создать notification и alarmmanager из класса MyNotificationPublisher. Это приводит к сбою приложения.

2. можете ли вы опубликовать журналы ошибок, чтобы было более понятно