android - setexactandallowwhileidle() 无法正常工作
问题描述
我正在制作一个警报应用程序,该应用程序会在用户给定的确切时间响起。由于打盹模式已经出来,我听说我需要setExactAndAllowWhileIdle()
在 API 23 或更高版本上使用。(我的目标是 API 26)。但问题是每当我设置警报时,无论如何它都会在 3 秒后响起(此时只有敬酒消息)。我不知道为什么。任何类型的反馈将不胜感激。
注意:我已经注册BroadcastReceiver
了Manifest.xml
public class MainActivity extends AppCompatActivity {
static final String CP ="checkpi";
MediaPlayer mp;
Calendar c= Calendar.getInstance();
TimePickerDialog.OnTimeSetListener otsl;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final TextView textView = (TextView)findViewById(R.id.tv);
Button testbtn = (Button)findViewById(R.id.test);
testbtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new TimePickerDialog(MainActivity.this,android.R.style.Theme_Holo_Light_Dialog,otsl,
c.get(Calendar.HOUR_OF_DAY),c.get(Calendar.MINUTE),true).show();
}
});
otsl = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
textView.setText(hourOfDay+":"+minute);
//c.set(Calendar.HOUR_OF_DAY,hourOfDay);
//c.set(Calendar.MINUTE,minute);
setAlarm(c.getTimeInMillis());
}
};
Button canceltestbtn = (Button)findViewById(R.id.canceltest);
canceltestbtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(!textView.equals("")){
textView.setText("");
}
cancelAlarm();
}
});
}
public void setAlarm(long timeinmils) {
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
Intent i = new Intent(MainActivity.this,Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,timeinmils,pi);
}
public void cancelAlarm() {
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
Intent i = new Intent(MainActivity.this,Alarm.class);
PendingIntent pi = PendingIntent.getBroadcast(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);
am.cancel(pi);
pi.cancel();
if(pi==null){
Log.v(CP,"Pendingintent==null");
}
else{
Log.v(CP,"Pendingintent!=null");
}
}
}
// ---------------------------------------------
public class Alarm extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Wake up!!",Toast.LENGTH_SHORT).show();
}
}
解决方案
推荐阅读
- c# - 房屋平面图场景变化的最佳实践
- eclipse - 如何在 Eclipse 中编译文档并运行 Jshop2?
- matlab - 触发和监听事件
- javascript - 如何正确解析 CSV 文件以使用 SVG 元素
- powershell - Get-AdUser 给我一个操作员不支持的错误
- websphere - WebSphere Web App 上的后退按钮后文档过期
- google-sheets - 谷歌表格 - 拖动包含公式的 n 行
- python - JupyterHub 无法访问:在 http://8000 上运行
- powershell - 需要针对此脚本在 foreach 中合并多个变量的帮助
- java - 如何使用 Install4J 将 EULA 屏幕添加到我的 MacOS 单一包存档?