如何解决创建一个每天都会在某个时间重复出现的android通知,即使应用已关闭
关于该主题的许多问题都已经过时了(1-4岁)。
How To give notifications on android on specific time?
How To give notifications on android on specific time in Android Oreo?
Repeat notification every day 12h
android的文档并未将我引向特定的解决方案,但帮助我了解了AlarmManager和NotificationCompat。我的代码在MainActivity中看起来像这样
Intent notifyIntent = new Intent(this,MyReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,NOTIFICATION_REMINDER,notifyIntent,PendingIntent.FLAG_UPDATE_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY,hours);
calendar.set(Calendar.MINUTE,minutes);
calendar.set(Calendar.SECOND,seconds);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY,pendingIntent);
我的BroadcastReceiver看起来像这样
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context,Intent intent) {
Log.d("Test","RAN");
Intent intent1 = new Intent(context,MyNewIntentService.class);
context.startService(intent1);
}
}
我的IntentService看起来像这样
public class MyNewIntentService extends IntentService {
private static final int NOTIFICATION_ID = 3;
public MyNewIntentService() {
super("MyNewIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel("SH","Simple",NotificationManager.IMPORTANCE_DEFAULT);
channel.setDescription("Notifs");
mNotificationManager.createNotificationChannel(channel);
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext(),"SH")
.setSmallIcon(R.mipmap.ic_launcher) // notification icon
.setContentTitle("Title") // title for notification
.setContentText("Message")// message for notification
.setAutoCancel(true); // clear notification after click
Intent intent1 = new Intent(getApplicationContext(),MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,intent1,PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(pi);
mNotificationManager.notify(0,mBuilder.build());
}
}
我已将这些代码添加到我的AndroidManifest.xml中,该代码位于我在应用程序标记中的活动下方
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true" >
</receiver>
<service
android:name=".MyNewIntentService"
android:exported="false" >
</service>
该通知会为我触发,但在应用关闭时不会触发。在android文档中,似乎android试图限制后台处理的数量和应用程序的计时,因此AlarmManager无法在准确的时间运行。
我如何将其设置为每天几乎在同一时间运行的我的应用程序的可靠通知提醒?
解决方法
您快到了。非常接近只是一件事。 代替 startService(),您应该使用startForegrounService()。在这种情况下,您的闹钟将始终触发。几点提示:
- 您应该在清单中声明前台服务
- 您必须将AlarmManager.setExactAndAllowWhileIdle用于高于23的API级别
您也可以签出this以获得更多信息。
更新:此方法适用于小米Redme note 8,但刚刚突然停止工作!目前,对于自定义OS设备而言,它可能不是一个非常可靠的解决方案。希望谷歌提出一个可靠的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。