簡體   English   中英

調用 onPause 后鬧鍾繼續播放

[英]Alarm keeps playing after onPause called

這是一個計時器的代碼,它在達到 0 時播放聲音(計時器工作正常)。 問題是即使通過調用MainActivity.java onPause()聲音仍然存在。

我在SimpleIntentService.java實現了onDestroy()來停止聲音,但顯然即使在調用Activity使用finish()也從未調用過它。 當應用程序暫停時,我應該如何讓聲音停止?

這是我的MainActivity.java

public class MainActivity extends Activity {

    private BroadcastReceiver broadcastReceiver;
    NumberPicker picker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        picker = (NumberPicker) findViewById(minutePicker);

        Log.i("TurnToTech", "Project Name - SimpleBackgroundService");

        picker.setMinValue(0);
        picker.setMaxValue(20);

        broadcastReceiver = new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent intent) {
                   String text = intent.getStringExtra(SimpleIntentService.PARAM_OUT_MSG);
                   Toast.makeText(getApplicationContext(),
                            text, Toast.LENGTH_SHORT).show();
            }
        };
    }

    Intent msgIntent;

    public void startTimer(View view) {
        setContentView(R.layout.activity_main);

        msgIntent = new Intent(this, SimpleIntentService.class);
        msgIntent.putExtra(SimpleIntentService.PARAM_IN_MSG, "Alarm: ");
        msgIntent.putExtra("time", picker.getValue());

        startService(msgIntent);
    }

    public void onResume() {
        super.onResume();

        IntentFilter filter = new IntentFilter(SimpleIntentService.ACTION_RESP);
        filter.addCategory(Intent.CATEGORY_DEFAULT);

        registerReceiver(broadcastReceiver,filter);
      }

      public void onPause() {
          finish();
          unregisterReceiver(broadcastReceiver);
          super.onPause();
      }
}

SimpleIntentService.java

public class SimpleIntentService extends IntentService {
    public static final String PARAM_IN_MSG = "in_msg";
    public static final String PARAM_OUT_MSG = "out_msg";
    int time;

    public static final String ACTION_RESP = "org.turntotech.intent.action.MESSAGE_PROCESSED";

    public SimpleIntentService() {
        super("SimpleIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        System.out.println("SimpleIntentService Called");
        String msg = intent.getStringExtra(PARAM_IN_MSG);
        int time = intent.getIntExtra("time", 0);

        // Timer implementation
        if (time == 0 ){
            playSound();
        }

        while(time > 0){

            SystemClock.sleep(5000); // 5 seconds
            time -= 5;
            String resultTxt = msg + time + " seconds remaining";
            Intent broadcastIntent = new Intent();

            broadcastIntent.setAction(ACTION_RESP);
            broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT);
            broadcastIntent.putExtra(PARAM_OUT_MSG, resultTxt);
            broadcastIntent.putExtra("time", time);

            sendBroadcast(broadcastIntent);
            if (time == 0) {
                playSound();
            }
        }
    }

    Uri alert;

    public void playSound(){
        alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), alert);
        r.play();
    }

    public void onDestroy() {
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), alert);
        r.stop();

        super.onDestroy();
    }
}

在您的IntentService您並沒有真正停止onDestroy函數中的相同警報。 因為每次你都會得到一個新的實例。

所以我想建議保留一個Ringtone的公共靜態變量,以便可以從任何地方訪問它。 在您的MainActivity聲明它們。

public static Ringtone r; 
public static Uri alert;

MainActivityonCreate函數中初始化它們。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // ... Other statements 

    // Initialize ringtone here
    initializeRingtone();
}

private void initializeRingtone() {
    alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    r = RingtoneManager.getRingtone(getApplicationContext(), alert);
}

現在你的MainActivityonPause()函數應該是這樣的

public void onPause() {
    unregisterReceiver(broadcastReceiver);
    r.stop();
    super.onPause();
}

如果您想在從后台恢復應用程序然后計時器用完后播放聲音,您可以考慮在MainActivityonResume函數中執行類似的操作

public void onResume() {
    super.onResume();
    registerReceiver(broadcastReceiver);
    initializeRingtone();  // Initialize it again. 
}

IntentServiceplaySound()函數可能如下所示。

public void playSound(){
    // Initialize the alert and ringtone again. 
    MainActivity.alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
    MainActivity.r = RingtoneManager.getRingtone(getApplicationContext(), alert);

    MainActivity.r.play();
}

public void onDestroy() {
    MainActivity.r.stop();
    super.onDestroy();
}

希望有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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