最好使用SetRepeating()在19 API之后不起作用

时间:2018-05-08 15:01:51

标签: java android alarmmanager repeatingalarm

我正在对之前安置学生开发的应用程序做一些支持工作,这是一个接受用户输入的应用程序说5.这意味着每隔5分钟就会发出一次警报。

她的应用程序已经回复给我,因为警报已经有了自己的想法并且一直不一致。以下是她正在使用的代码:

 alertDialogBuilder = new AlertDialog.Builder(MainActivity.this);
        //set alert
        alertDialogBuilder
                .setTitle("IP Check frequency: " + time.getText() + " minutes")
                .setMessage("Processing commenced at \n" + startTime.getText())
                .setCancelable(false)
                .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        if (currentTime.after(alarmTime)) {
                            Toast.makeText(MainActivity.this, "Missed first alert", Toast.LENGTH_LONG).show();
                        }
                        intent1 = new Intent(MainActivity.this, MyBroadcastReceiver.class);

                        i = Integer.parseInt(time.getText().toString());
                        scTime2 = (i * 60 * 1000); //5 minutes before set time

                        pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT);
                        manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
                        manager.setRepeating(AlarmManager.RTC_WAKEUP, timeCommenced, scTime2, pendingIntent);
                        Toast.makeText(MainActivity.this, "Alert Set", Toast.LENGTH_SHORT).show();
                        stopped.setVisibility(View.VISIBLE);
                        commenced1.setVisibility(View.GONE);

                        //Change editText to TextView
                        time.setVisibility(View.GONE);
                        timeText.setVisibility(View.VISIBLE);
                        timeText.setText(time.getText().toString());
                        processingText.setText(R.string.processing_commenced);

                    }
                })
                .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
        alertDialog = alertDialogBuilder.create();
        alertDialog.show();

    }
}

我可以看到她正在使用SetRepeating()并且我已经从api级别19读取了这个可能是问题。

我尝试使用SetExact(),但我在方法内的变量下面有一个红线。

是否有人能告诉我如何保留变量但获得一致性?

谢谢!

2 个答案:

答案 0 :(得分:0)

setRepeatingsetExact使用不同数量的变量,因此您无法在不更改代码的情况下使用相同的内容。

如果你想要在那个确切的时间触发某些东西,那么你需要使用setExact,每当警报触发时,你需要计算下一次应该自动提交的信息并再次使用setExact新的时间触发它。

如果您使用setRepeating,操作系统可以/将会将触发时间设置为可以同时触发多个警报以节省电量的时间。

答案 1 :(得分:0)

你是对的。根据{{​​3}}

  

注意:从API 19开始,所有重复警报都不准确。如果你的   应用程序需要精确的交付时间,然后必须使用一次性   确切的警报,每次重新安排,如上所述。遗产   targetSdkVersion早于API 19的应用程序将   继续发出所有警报,包括重复警报,   确切地对待。

他们建议你做的是使用https://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int,%20long,%20long,%20android.app.PendingIntent)而不是set()来触发一次。 触发警报后,再次在处理程序或pendingIntent内调用set()。