2012-06-22 1 views
2

Я использую класс MediaPlayer в своем приложении, и я хочу, чтобы музыка воспроизводилась на фоне, поэтому я использовал Сервис вместо Activity или BroadcastReciever. Теперь проблема в том, что если пользователь существует или приостанавливает приложение, воспроизведение музыки происходит без остановки. Я добавил методы onStop и onPause, но проблема сохраняется. И я не могу вызвать метод super.onPause(), как в классе Activity.Android Сервис для воспроизведения музыки и остановки при паузе и при остановке

После некоторого исследования выяснилось, что служба продолжает активно даже приостанавливать приложение или останавливается. (Я не знаю, что это правда), но с моим опытом я думаю, что это правда. Что мне делать? Я искал google и stackoverflow для ответа, но не смог получить ответ.

Вот код.

package in.isuru.animation; 

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

public class PlayMusic extends Service{ 

private static final String TAG = null; 
MediaPlayer player; 

public void onCreate(){ 
    super.onCreate(); 
    Log.d(TAG, "Music service started onCreate()"); 
    player = MediaPlayer.create(this, R.raw.oh_holy_night); 
    player.setLooping(true); 
    //player.setVolume(100, 100); 
} 

public int onStartCommand(Intent intent, int flags, int startId){ 
    player.start(); 
    Log.d(TAG, "Player started!"); 
    if(player.isLooping() != true){ 
     Log.d(TAG, "Player not playing any file."); 
    } 
    return 1; 
} 

public void onStart(Intent intent, int startId){ 

} 

public IBinder onUnBinder(Intent arg0){ 
    return null; 
} 

public void onStop(){ 
    player.stop(); 
    player.release(); 
} 

public void onPause(){ 

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

} 

public void onDestroy(){ 
    player.stop(); 
    player.release(); 
    Log.d(TAG, "Player destroyed"); 
} 

public void onLowMemory(){ 
    player.release(); 
} 

@Override 
public IBinder onBind(Intent arg0) { 

    return null; 
} 

} 

ответ

3

Во-первых, вы никогда не иметь возможность сделать что-нибудь долго работает в BroadcastReceiver, потому что система не понравится вам. Так что я немного смущен. Вы хотите, чтобы музыка воспроизводилась в фоновом режиме, поэтому вы использовали Сервис. Это верно. Но теперь вы говорите, что когда пользователь выходит или приостанавливает вашу деятельность, музыка все еще играет? Ну да, это будет, разве это не причина, по которой вы положили ее в Службу, чтобы начать?

У вас есть 2 варианта. Вы можете переместить вызовы, чтобы начать и остановить медиаплеер в onStart()/onResume() и onPause()/onStop() вашей активности. Это будет воспроизводиться только в том случае, если у Activity есть передний план.

Ваш второй вариант - сохранить MediaPlaying в Сервисе. Однако вам нужно будет отправить Intent на свою службу, чтобы сообщить, когда прекратить воспроизведение музыки. Лучший способ сделать это - собрать PendingIntent, чтобы дать Менеджеру уведомлений, который запустит Activity, у которого есть кнопки на нем, которые будут приостанавливать и воспроизводить вашу музыку. Если вы не предоставляете способ для использования, чтобы вернуться к Управлению, которое управляет службой, тогда ваша музыка будет воспроизводиться до конца, и у пользователя не будет прекрасного способа отключить ее.

+0

Ну, моя основная деятельность - это анимация, будет ли она работать с потоком пользовательского интерфейса, если я буду играть музыку на этом мероприятии? –

+0

Ну почти. По умолчанию Служба также работает в потоке пользовательского интерфейса. Служба сама по себе не выходит из своей собственной нити. Поскольку вы используете интенсивное воспроизведение в формате MP3, вам нужно создать новую тему, в которой вы запускаете эту услугу. Этот новый класс должен будет использовать контекст, чтобы он мог запускать и контролировать действие. Я бы предложил, чтобы ваша Activity выполняла Runnable (вместо продолжения Thread). Это должно позволить вам еще большую гибкость и повторное использование ваших переменных. –

+0

Хорошо, спасибо. Я буду использовать Activity вместо Service. Спасибо за объяснение! –

0

Проблема - связь. Вы использовали player.start() в onStartCommand(), поэтому служба может начать воспроизведение.

Остановить/приостановить музыку никогда не сообщалось службе и, следовательно, проблема.

Смежные вопросы