Android通知在事件中重复多次而不是一次

Posted

技术标签:

【中文标题】Android通知在事件中重复多次而不是一次【英文标题】:Android notification repeats several times at event instead of one time 【发布时间】:2017-06-14 14:39:10 【问题描述】:

我希望代码在每天早上 7 点执行一次通知。我创建了一个调试 apk 并安装它以查看它的执行情况并注意到它实际上在大约 07 am 发送通知,但是如果您单击通知并进入应用程序并在之后关闭它,它再次发送通知。有人看到代码中有错误吗?

这是MainActivity.java(通知部分)中的代码:

public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    intent_anmeldeActivity = new Intent(this, anmeldeActivity.class);
    intent_WebViewActivity = new Intent(this, WebViewActivity.class);

    prefs = getSharedPreferences("prefs", Context.MODE_PRIVATE);
    prefsEditor = prefs.edit();


    Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 07);
        calendar.set(Calendar.MINUTE, 00);
        calendar.set(Calendar.SECOND, 00);

    intent_notification = new Intent(this, NotificationClass.class);

    Intent intent1 = new Intent(MainActivity.this, NotificationClass.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) MainActivity.this.getSystemService(MainActivity.this.ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

它还会随机发送通知。

提前致谢!

编辑:

public class NotificationClass extends BroadcastReceiver

@Override
public void onReceive(Context context, Intent intent) 
    // TODO Auto-generated method stub

    loadText loadText = new loadText();
    loadText.startAsyncTask(context);
 

在AsyncTask类loadText中,类NotificationBuilding在onPostExecute中执行:

public class NotificationBuilding 

Context mContext = null;

int ID = 1;
Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
long when = System.currentTimeMillis();

public void startNotificationBuilding(Context con, String title, String text) 

    this.mContext = con;

    NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent notificationIntent = new Intent(mContext, MainActivity.class);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0,
            notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    NotificationCompat.Builder mNotifyBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(
            mContext)
            .setSmallIcon(R.drawable.ic_stat_name)
            .setColor(Color.argb(255, 234, 146, 21))
            .setContentTitle(title)
            .setContentText(text)
            .setSound(alarmSound)
            .setAutoCancel(true)
            .setWhen(when)
            .setContentIntent(pendingIntent)
            .setVibrate(new long[]1000, 1000, 1000, 1000, 1000)
            .setLights(Color.argb(255, 234, 146, 21), 1000, 10000)
            .setStyle(new NotificationCompat.BigTextStyle().bigText(text));

    notificationManager.notify(ID, mNotifyBuilder.build());
    ID++;
 

【问题讨论】:

你是从NotficationClass广播发射MainActivty吗? 不,NotificationClass 使用 AsyncTask 代码启动另一个类 【参考方案1】:
// Set the alarm to start at approximately 7:00 a.m.
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 07);

       // With setInexactRepeating(), you have to use one of the AlarmManager interval
        // constants--in this case, AlarmManager.INTERVAL_DAY.
        alarmMgr.**setInexactRepeating**(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                AlarmManager.INTERVAL_DAY, alarmIntent);

确定您的闹钟需要多精确 如上所述,选择警报类型通常是创建警报的第一步。另一个区别是您需要警报的精确程度。对于大多数应用程序,setInexactRepeating() 是正确的选择。当您使用此方法时,android 会同步多个不精确的重复警报并同时触发它们。这减少了电池的消耗。

对于很少有严格的时间要求的应用程序(例如,闹钟需要在上午 8:30 准确触发,以及之后的每个小时)使用 setRepeating()。但是你应该尽可能避免使用精确的警报。

使用 setInexactRepeating(),您不能像使用 setRepeating() 那样指定自定义间隔。您必须使用间隔常数之一,例如 INTERVAL_FIFTEEN_MINUTES、INTERVAL_DAY 等。有关完整列表,请参阅 AlarmManager。

【讨论】:

好的,谢谢!但是每次打开和关闭应用后仍然会发送通知。 你可以在问题部分发布通知类

以上是关于Android通知在事件中重复多次而不是一次的主要内容,如果未能解决你的问题,请参考以下文章

UILocalNotification 多次触发

如何在每天不同的时间在android studio中设置每日重复通知?

Socket.io 事件多次发出

推送通知在android中获得多次

本地通知在计划外的时间多次触发

Android种使用Notification实现通知管理以及自定义通知栏(示例四)