为什么 android 通知不是每 2 分钟后出现一次?
Why android notifications are not occurring after every 2 mins?
我试图每 2 分钟创建一个通知,但是,只有一个通知被创建(当应用程序启动时)。
我的代码是:
notifyme.java :
public class notifyme extends Service {
@Override
public void onCreate() {
super.onCreate();
Intent intent=new Intent(this,MainActivity.class);
TaskStackBuilder stackBuilder=TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent=stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder notify=new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("Hello")
.setContentText("Some random text")
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setContentIntent(pendingIntent)
.setAutoCancel(true);
NotificationManager nMgr=(NotificationManager)this.getSystemService(this.NOTIFICATION_SERVICE);
Random r=new Random();
int nid=r.nextInt(50000)+1;
nMgr.notify(nid,notify.build());
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
在MainActivity.java中:
Intent notificationIntent = new Intent(this, notifyme.class);
PendingIntent contentIntent = PendingIntent.getService(getApplicationContext(), 0, notificationIntent,0);
AlarmManager am = (AlarmManager) getSystemService(this.ALARM_SERVICE);
am.cancel(contentIntent);
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),120*1000, contentIntent);
首先,每两秒发送一次新通知是完全违反准则的。
正如 docs 所说:
When you need to issue a notification multiple times for the same type
of event, you should avoid making a completely new notification.
Instead, you should consider updating a previous notification, either
by changing some of its values or by adding to it, or both.
此处的问题是您使用相同的 ID 来创建通知。 (这里是 19)。
当您发布一个通知时,如果有一个具有相同id的活动通知。通知管理器将更新现有的。所以每次服务是 运行,它只是更新 ID 为“19”的通知。
如果您热衷于每 2 分钟发布一次通知(这将非常严重地影响您应用的用户体验,让我警告您),请尝试为通知提供不同的 ID。您可以将发布的 id 保存在 SharedPreferences 或其他东西中。
首先,您不需要整个服务来显示通知,如果仅此而已,您可以使用 BroadcastReceiver
并使用 PendingIntent.getBroadcast
方法。 BroadcastReceiver 需要更少的内存并且没有任何生命周期(这可能会使事情复杂化)。
您没有看到多个通知的原因是 nMgr.notify(119,notify.build());
这个数字119
是通知ID。所以在它再次执行该代码的 X 秒后,你的新通知直接替换了旧的通知,它看起来好像没有改变。
如果您想设置多个通知(也就是向用户发送垃圾邮件),您应该始终更改该号码。也许使用 Random
我试图每 2 分钟创建一个通知,但是,只有一个通知被创建(当应用程序启动时)。 我的代码是:
notifyme.java :
public class notifyme extends Service {
@Override
public void onCreate() {
super.onCreate();
Intent intent=new Intent(this,MainActivity.class);
TaskStackBuilder stackBuilder=TaskStackBuilder.create(this);
stackBuilder.addParentStack(MainActivity.class);
stackBuilder.addNextIntent(intent);
PendingIntent pendingIntent=stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder notify=new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("Hello")
.setContentText("Some random text")
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setContentIntent(pendingIntent)
.setAutoCancel(true);
NotificationManager nMgr=(NotificationManager)this.getSystemService(this.NOTIFICATION_SERVICE);
Random r=new Random();
int nid=r.nextInt(50000)+1;
nMgr.notify(nid,notify.build());
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
在MainActivity.java中:
Intent notificationIntent = new Intent(this, notifyme.class);
PendingIntent contentIntent = PendingIntent.getService(getApplicationContext(), 0, notificationIntent,0);
AlarmManager am = (AlarmManager) getSystemService(this.ALARM_SERVICE);
am.cancel(contentIntent);
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),120*1000, contentIntent);
首先,每两秒发送一次新通知是完全违反准则的。
正如 docs 所说:
When you need to issue a notification multiple times for the same type of event, you should avoid making a completely new notification. Instead, you should consider updating a previous notification, either by changing some of its values or by adding to it, or both.
此处的问题是您使用相同的 ID 来创建通知。 (这里是 19)。
当您发布一个通知时,如果有一个具有相同id的活动通知。通知管理器将更新现有的。所以每次服务是 运行,它只是更新 ID 为“19”的通知。
如果您热衷于每 2 分钟发布一次通知(这将非常严重地影响您应用的用户体验,让我警告您),请尝试为通知提供不同的 ID。您可以将发布的 id 保存在 SharedPreferences 或其他东西中。
首先,您不需要整个服务来显示通知,如果仅此而已,您可以使用 BroadcastReceiver
并使用 PendingIntent.getBroadcast
方法。 BroadcastReceiver 需要更少的内存并且没有任何生命周期(这可能会使事情复杂化)。
您没有看到多个通知的原因是 nMgr.notify(119,notify.build());
这个数字119
是通知ID。所以在它再次执行该代码的 X 秒后,你的新通知直接替换了旧的通知,它看起来好像没有改变。
如果您想设置多个通知(也就是向用户发送垃圾邮件),您应该始终更改该号码。也许使用 Random