首页 > 解决方案 > setexactandallowwhileidle() 无法正常工作

问题描述

我正在制作一个警报应用程序,该应用程序会在用户给定的确切时间响起。由于打盹模式已经出来,我听说我需要setExactAndAllowWhileIdle()在 API 23 或更高版本上使用。(我的目标是 API 26)。但问题是每当我设置警报时,无论如何它都会在 3 秒后响起(此时只有敬酒消息)。我不知道为什么。任何类型的反馈将不胜感激。

注意:我已经注册BroadcastReceiverManifest.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();
}
}

标签: androidbroadcastreceiveralarm

解决方案


推荐阅读