android在特定时间,如何在Android Oreo的特定时间在Android上发出通知?

我正在寻找一种在“设置”中创建首选项的方法,以便在Android应用中的特定时间(由用户在设置中设置)发送通知.我看过像this这样的不同线程,但是这在Android Oreo中不起作用.

有人可以帮我这个或者指点我一个教程吗?

解决方法:

在查看了不同的帖子和对AlarmManager实现的一些研究后,这对我有用.

这个基础是this帖子和Schedule重复警报Android Documentation.

这是我目前的实施:

我有一个SwitchPreference,而TimePicker实现是Settings

SwitchPreference询问用户是否要启用重复每日通知.

TimePicker设置通知时间.

在MainActivity的OnCreate方法中或者在您阅读SharedPreferences的任何地方执行此操作:

PreferenceManager.setDefaultValues(this, R.xml.preferences, false);

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(this);

Boolean dailyNotify = sharedPref.getBoolean(SettingsActivity.KEY_PREF_DAILY_NOTIFICATION, true);

PackageManager pm = this.getPackageManager();

ComponentName receiver = new ComponentName(this, DeviceBootReceiver.class);

Intent alarmIntent = new Intent(this, AlarmReceiver.class);

PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, 0);

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

// if user enabled daily notifications

if (dailyNotify) {

//region Enable Daily Notifications

Calendar calendar = Calendar.getInstance();

calendar.setTimeInMillis(System.currentTimeMillis());

calendar.set(Calendar.HOUR_OF_DAY, sharedPref.getInt("dailyNotificationHour", 7));

calendar.set(Calendar.MINUTE, sharedPref.getInt("dailyNotificationMin", 15));

calendar.set(Calendar.SECOND, 1);

// if notification time is before selected time, send notification the next day

if (calendar.before(Calendar.getInstance())) {

calendar.add(Calendar.DATE, 1);

}

if (manager != null) {

manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),

AlarmManager.INTERVAL_DAY, pendingIntent);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

manager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);

}

}

//To enable Boot Receiver class

pm.setComponentEnabledSetting(receiver,

PackageManager.COMPONENT_ENABLED_STATE_ENABLED,

PackageManager.DONT_KILL_APP);

//endregion

} else { //Disable Daily Notifications

if (PendingIntent.getBroadcast(this, 0, alarmIntent, 0) != null && manager != null) {

manager.cancel(pendingIntent);

//Toast.makeText(this,"Notifications were disabled",Toast.LENGTH_SHORT).show();

}

pm.setComponentEnabledSetting(receiver,

PackageManager.COMPONENT_ENABLED_STATE_DISABLED,

PackageManager.DONT_KILL_APP);

}

接下来添加实现BroadcastReceiver的AlarmReceiver类,如下所示:

public class AlarmReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(Objects.requireNonNull(context));

SharedPreferences.Editor sharedPrefEditor = prefs.edit();

NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

Intent notificationIntent = new Intent(context, MainActivity.class);

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP

| Intent.FLAG_ACTIVITY_SINGLE_TOP);

PendingIntent pendingI = PendingIntent.getActivity(context, 0,

notificationIntent, 0);

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {

NotificationChannel channel = new NotificationChannel("default",

"Daily Notification",

NotificationManager.IMPORTANCE_DEFAULT);

channel.setDescription("Daily Notification");

if (nm != null) {

nm.createNotificationChannel(channel);

}

}

NotificationCompat.Builder b = new NotificationCompat.Builder(context, "default");

b.setAutoCancel(true)

.setDefaults(NotificationCompat.DEFAULT_ALL)

.setWhen(System.currentTimeMillis())

.setSmallIcon(R.mipmap.ic_launcher_foreground)

.setTicker("{Time to watch some cool stuff!}")

.setContentTitle("My Cool App")

.setContentText("Time to watch some cool stuff!")

.setContentInfo("INFO")

.setContentIntent(pendingI);

if (nm != null) {

nm.notify(1, b.build());

Calendar nextNotifyTime = Calendar.getInstance();

nextNotifyTime.add(Calendar.DATE, 1);

sharedPrefEditor.putLong("nextNotifyTime", nextNotifyTime.getTimeInMillis());

sharedPrefEditor.apply();

}

}

}

如果设备电源关闭或重新启动,系统将关闭AlarmManager,因此在BOOT COMPLETE上再次重新启动它添加此类:

public class DeviceBootReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (Objects.equals(intent.getAction(), "android.intent.action.BOOT_COMPLETED")) {

// on device boot complete, reset the alarm

Intent alarmIntent = new Intent(context, AlarmReceiver.class);

PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, 0);

AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

final SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(Objects.requireNonNull(context));

Calendar calendar = Calendar.getInstance();

calendar.setTimeInMillis(System.currentTimeMillis());

calendar.set(Calendar.HOUR_OF_DAY, sharedPref.getInt("dailyNotificationHour", 7));

calendar.set(Calendar.MINUTE, sharedPref.getInt("dailyNotificationMin", 15));

calendar.set(Calendar.SECOND, 1);

Calendar newC = new GregorianCalendar();

newC.setTimeInMillis(sharedPref.getLong("nextNotifyTime", Calendar.getInstance().getTimeInMillis()));

if (calendar.after(newC)) {

calendar.add(Calendar.HOUR, 1);

}

if (manager != null) {

manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),

AlarmManager.INTERVAL_DAY, pendingIntent);

}

}

}

}

最后不要忘记将这些权限添加到AndroidManidest:

并在AndroidManifest中注册您的接收器

android:enabled="false">

如果用户启用了SwitchPreference,则应在TimePicker指定的日期的特定时间设置通知.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值