簡體   English   中英

無法弄清楚如何為警報創建取消按鈕

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM