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

时间:2017-06-14 14:39:11

标签: java android push-notification notifications alarm

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

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

panel

它还会随机发送通知。

提前致谢!

修改

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);

在AsyncTask类loadText中,NotificationBuilding类在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); } } 中执行:

onPostExecute

1 个答案:

答案 0 :(得分:0)

// 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。