[英]Cannot figure out how to create the cancel button for ringing alarm
即使按了StopAlarm按鈕,也無法阻止警報響起。 我無法弄清楚如何訪問相同的Ringtone實例並調用stop()。
這是MainActivity java類中的啟動警報開關。
public void switchClicked(View view) {
if (((Switch) view).isChecked()) {
Log.d("MainActivity", "Alarm On");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, alarmTimePicker.getHour());
calendar.set(Calendar.MINUTE, alarmTimePicker.getMinute());
Intent myIntent = new Intent(MainActivity.this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, 0);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);
setAlarmText("ON");
} else {
alarmManager.cancel(pendingIntent);
setAlarmText("OFF");
Log.d("MainActivity", "Alarm Off");
}
}
public void setAlarmText(String alarmText) {
alarmTextView.setText(alarmText);
}
這是MainActivity java類中的StopAlarm按鈕。
public void stopAlarm(View view) {
setAlarmText("Alarm stopped");
Intent myIntent = new Intent(MainActivity.this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.cancel(pendingIntent);
}
這是AlarmReciver Java類。
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
MainActivity inst = MainActivity.instance();
inst.setAlarmText("Alarm! Wake up! Wake up!");
Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
if (alarmUri == null) {
alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
}
Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
ringtone.play();
}
}
腳步:
將RingtonePlayingService
添加到您的項目中(不要忘記在清單中聲明它)
public class RingtonePlayingService extends Service{
private Ringtone ringtone = null;
@Override
public int onStartCommand(Intent intent, int flags, int startId){
Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
if (alarmUri == null)
alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
this.ringtone = RingtoneManager.getRingtone(this, alarmUri);
ringtone.play();
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public void onDestroy(){
super.onDestroy();
shutUpRingtone();
}
private void shutUpRingtone(){
if(ringtone != null)
ringtone.stop();
ringtone = null;
}
}
刪除onReceive
內部的代碼,並將其放入:
@Override
public void onReceive(final Context context, Intent intent) {
Intent startIntent = new Intent(context, RingtonePlayingService.class);
context.startService(startIntent);
}
現在, RingtonePlayingService
正在處理鈴聲播放並保持引用。 您的stopAlarm
方法只是取消潛在的未決警報,因此,如果在單擊停止按鈕之前還沒有觸發它,則永遠不會觸發。 但是,當它已經開始響鈴時,您應該停止已啟動服務保留的ringtone
實例。 在方法末尾添加:
public void stopAlarm(View view) {
...
Intent stopIntent = new Intent(context, RingtonePlayingService.class);
stopService(stopIntent);
}
現在, stopAlarm
可以同時執行以下操作:取消掛起的警報(如果有的話)並停止服務(如果有的話),這可能正在播放鈴聲
還要刪除MainActivity.instance()
模式,這真是MainActivity.instance()
糟糕了……當您設置將來的警報(例如now + 1h)並且系統(或用戶)在應用程序被激發之前將其從內存中刪除時,您將獲得NullPointerException
,如.instance()
為null
,您立即嘗試訪問inst.setAlarmText
方法。 您的Intead可以使用本地廣播或服務綁定來更新您的UI-通過具有啟動/停止/當前狀態的運行RingtonePlayingService
將廣播/消息發送到您的Activity
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.