[英]Receiving Notifications in android studio
我正在尝试向用户发送通知,以提醒他每天10 AM使用我的应用程序执行特定操作。
我的问题是,仅当我在上午10点打开此应用时,我才收到通知。 从那时起,每次我打开该应用程序时,我都会收到一条通知。 因此,如果我在10:03 AM打开它,则会收到通知。
这是我的MainActivity:
public void sendNotification() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 10);// 10 am
cal.set(Calendar.MINUTE, 03);
cal.set(Calendar.SECOND, 00);
cal.set(Calendar.MILLISECOND, 00);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, NotificationReceiver.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(this, 0 , intent , 0 ) ;
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pendingIntent1);
}
我正在使用onCreate()
方法调用我的方法
AndroidManifest:
<receiver
android:name=".NotificationReceiver"
android:enabled="true"
android:exported="true">
</receiver>
NotificationReceiver:
String NOTIFICATION_CHANNEL_ID = "001";
Calendar calendar = Calendar.getInstance();
if( calendar.get(Calendar.DAY_OF_WEEK) != Calendar.FRIDAY ) { // Friday ? dont send a notificatoin : send a notification !
Intent main_intent = new Intent(context , MainActivity.class) ;
PendingIntent pIntent = PendingIntent.getActivity(context , 0, main_intent , 0) ;
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_DEFAULT);
// Configure the notification channel.
notificationChannel.setDescription("Channel description");
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000});
notificationChannel.enableVibration(true);
notificationManager.createNotificationChannel(notificationChannel);
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID);
notificationBuilder.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.dropdown)
.setTicker("some text") // status bar message
.setContentTitle("some text")
.setContentText("some text")
.addAction(R.mipmap.back,"pay Now", pIntent)
.setContentInfo("Info");
notificationManager.notify(1, notificationBuilder.build());
} // END OF FRIDAY CHECK
注意:首次安装应用程序时,我还会收到通知!
首先,如果您想尝试在正好10点收到应用通知,请不要使用setInexactRepeating
。 使用setRepeating
代替:
public void sendNotification() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 10);// 10 am
cal.set(Calendar.MINUTE, 03);
cal.set(Calendar.SECOND, 00);
cal.set(Calendar.MILLISECOND, 00);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(this, NotificationReceiver.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(this, 0 , intent , 0 );
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY , pendingIntent1);
}
其次,另一个可能的问题是,如果此问题发生在特定的手机(通常具有主动电源管理的手机,如华为,诺基亚等)上,请禁用该应用程序的电池管理。 众所周知,这些手机以杀死后台应用程序而臭名昭著,这些应用程序也会将其从发送通知中删除。
那里有针对特定手机的解决方案:
华为:
手机设置>高级设置>电池管理器>受保护的应用程序–将您的应用程序检查为受保护的
手机设置>应用>您的应用>电池>耗电量大的提示[x],屏幕关闭后继续运行[x]
手机设置>应用程序>高级(在底部)>忽略优化>按允许>所有应用程序>在列表中找到您的应用程序并设置为允许
手机设置>电池>应用启动,然后将您的应用设置为“手动管理”,并确保所有功能均已打开。
手机设置>电池>启动,然后将您的应用设置为“手动管理”,并确保所有功能均已打开。
对于其他品牌的手机,请沿此路线寻找...
编辑:
我刚刚注意到您所做的编辑,即使您是第一次安装,也会收到通知。 也许在您的日历上添加以下内容:
Calendar newDay = Calendar.getInstance();
if (cal.getTimeInMillis() < newDay.getTimeInMillis()) {
cal.add(Calendar.DATE, 1); //add calendar to the next day instead of the time that has passed
}
这是我使用警报管理器发送每日本地通知的方式。 您应该检查是否已设置警报。 我在这种情况下使用共享的首选项。
val pref = PreferenceManager.getDefaultSharedPreferences(context)
pref?.let {
if (!pref.getBoolean(BundleParams.AlarmAlreadyRegistered.name, false)) {
val alarmIntent = Intent(context, TrialNotificationAlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, YOUR_CODE, alarmIntent, 0)
val manager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager?
val calendar = Calendar.getInstance().apply {
timeInMillis = System.currentTimeMillis()
set(Calendar.HOUR_OF_DAY, 13)
set(Calendar.MINUTE, 30)
set(Calendar.SECOND, 0)
}
manager?.apply {
setRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent)
pref.edit().apply {
putBoolean(BundleParams.AlarmAlreadyRegistered.name, true)
}.apply()
}
}
}
另外,当电话重启时,我正在使用Broad Cast接收器进行监听以重置警报。
class DeviceBootReceiver : BroadcastReceiver() {
override fun onReceive(context:Context ?, intent:Intent ?){
intent ?.let {
if (intent.action == "android.intent.action.BOOT_COMPLETED") {
// on device boot complete, reset the alarm
}
}
}
}
希望这会帮助你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.