#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 секунд, но мне нужно добиться следующего.
- Мне нужно начать показывать это уведомление, когда приложение закрывается пользователем. Не во время работы приложения.
- Как мне заставить уведомление запускаться снова и снова после перезагрузки устройства (я попробовал инструкции на этой странице 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. можете ли вы опубликовать журналы ошибок, чтобы было более понятно