2017-01-09 86 views
1

这里是定时器的代码,一旦它达到0就会播放声音(定时器工作正常)。问题是声音仍然存在,即使通过调用MainActivity.javaonPause后继续播放闹钟

我实施onDestroy()SimpleIntentService.java停止声音,但显然它从来没有被称为finish()在呼叫Activity。当应用程序暂停时,我该如何让声音停止?

这里是我的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(); 
    } 
} 

回答

1

在你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(); 
} 

如果你希望你继续从后台应用程序后,然后时间用完播放声音,你可能会考虑做这样的事情在你的MainActivity

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

而且012 onResume功能在IntentService中的函数可能看起来像这样。

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(); 
} 

希望有所帮助!

+0

非常感谢,但不幸的是,当以这种方式实施时,声音不会开始播放。定时器用完后就死定了,任何想法为什么? –

+0

这里的实际场景是什么?你在后台执行了应用程序,计时器停止播放了吗?然后,你又恢复了应用程序,你期望在定时器耗尽后播放声音? –

+0

请参阅最新的答案。这可能有帮助。 –