Остановка фоновой службы музыки - PullRequest
1 голос
/ 01 октября 2011
package com.falling.inairproandmark;



import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

public class BackgroundSoundService extends Service {
    private static final String TAG = null;
    MediaPlayer player;
    public IBinder onBind(Intent arg0) {

    return null;
}
@Override
public void onCreate() {
    super.onCreate();


    player = MediaPlayer.create(this, R.raw.bgmusic);

    player.setVolume(100,100);

}
public int onStartCommand(Intent intent, int flags, int startId) {


    player.start();

    return 1;
}

public void onStart(Intent intent, int startId) {
    // TODO



}
public IBinder onUnBind(Intent arg0) {
    // TODO Auto-generated method stub

    return null;
}

public void onStop() {

}
public void onPause() {

}
@Override
public void onDestroy() {

    player.stop();
    player.release();
}

@Override
public void onLowMemory() {

    }
}

Я не очень разбираюсь в кодировании ... Но я пытаюсь играть музыку во время занятий.

Допустим, у меня есть 10 занятий ... Я хочу, чтобы музыка воспроизводилась во время их просмотра и когда мне звонят или выходят из приложения, нажав клавишу Home ... Музыка останавливается или, по крайней мере, останавливается ... я делаю это?

Спасибо

Вахид

1 Ответ

3 голосов
/ 01 октября 2011

Вам нужно запустить отдельную службу (другой фильтр намерений в манифесте для той же услуги) в onStartCommand(), вы проверите действие намерения, т. Е. Если значение действия совпадает с тем, которое вы указали для действия намерения в файле манифеста, и если действие соответствует имени действия фильтра намерений, просто остановите службу.

Пример из одного из моих проектов:

В файле манифеста:

<service android:name=".MyPlayerService" android:permission="android.permission.MODIFY_AUDIO_SETTINGS">        
      <intent-filter >
        .... some other filters
        <action android:name="com.my.player.EXIT"/>
        ....
        </intent-filter>   
      </service>

В onStartCommand (): Здесь мы видим необходимость указания имени действия, которое используется для различения многочисленных действий в рамках одной и той же службы.

@Override
public int onStartCommand(Intent intent, int flags, int startId)
{
    Log.i("ON START COMMAND", "Huston, we have a lift off!");

    if(intent.getAction().equals("com.my.player.EXIT")
             { // means that you have envoked action that will has to stop the service
                 MyPlayerService.this.stopSelf();   // See the note below
             }else if(//some other actions that has to be done on the service)

}

Примечание: Обратите внимание, что здесь вы можете просто остановить воспроизведение MediaPlayer или приостановить его, используя .stop() или .pause(), или просто прекратить обслуживание, как я предоставил выше.

Теперь вернемся к деятельности. Ловить Home button не очень хорошая идея. Но это вы можете сделать в методе onDestroy(), где действие не находится в стеке, то есть непосредственно перед его уничтожением. Здесь вы просто запускаете намерение, которое будет сигнализировать о прекращении работы службы.

Пример:

Intent exit = new Intent("com.my.player.EXIT"); //intent filter has to be specified with the action name for the intent
this.startService(exit);

Подробнее об Android Dev о stopSelf() Если вы пробуете этот подход, запустите MediaPlayer, то хорошей практикой будет сделать так, чтобы игра имела свое собственное имя действия в фильтре намерений, и сделайте такую ​​же проверку в onStartCommand()

...