2015-01-17 7 views
2

Я разрабатываю приложение, и я использую сервис для воспроизведения фоновой музыки. Музыка должна воспроизводиться только в том случае, когда приложение используется, означает на переднем плане. Музыка останавливается, когда я оставляю приложение с помощью кнопки «Главная» или «Назад» (приложение может оставаться в фоновом режиме, но не видно -> нет музыки). Когда я возвращаюсь в приложение (используя домашнюю кнопку и переключаюсь обратно в приложение), музыка также возобновляется.Android запустить службу, пока приложение используется

Моя_служба:

public class MusicService extends Service { 

MediaPlayer myPlayer; 
private final IBinder localBinder = new LocalBinder(); 

public class LocalBinder extends Binder { 

    MusicService getService() { 
     return MusicService.this; 
    } 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return localBinder; 
} 

public boolean onUnbind(Intent intent) { 
    return true; 
    // called when the last Activity is unbound from this service 
    // stop your timed operations here 
} 


@Override 
public void onCreate() { 
    Toast.makeText(this, "Music Service Created", Toast.LENGTH_LONG).show(); 
    myPlayer = MediaPlayer.create(this, R.raw.ost); 
    myPlayer.setLooping(true); // Set looping 
} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "Music Service Stopped", Toast.LENGTH_LONG).show(); 
    myPlayer.stop(); 
} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "Music Service Started", Toast.LENGTH_LONG).show(); 
    if(!myPlayer.isPlaying()) 
     myPlayer.start(); 
} 

}

Я также использую родительский класс для всех Активности. В этом родительском классе я хочу, чтобы остановить службу на методах OnPause() и OnStop():

ComponentName topActivity = taskInfo.get(0).topActivity; 
     if(!topActivity.getPackageName().equals(getApplicationContext().getPackageName())) { 
      stopService(new Intent(this, MusicService.class)); 

я запустить службу на моей пусковой деятельности

startService(new Intent(this, MusicService.class)); 
     Intent intent = new Intent(this, MusicService.class); 
     bindService(intent, this, 0); 

Теперь к моим проблемам: Служба не останавливается, когда я нажимаю кнопку «домой», служба не останавливается, когда я покидаю приложение (кнопка «Назад»). Когда я убью задачу приложения, служба запустится через несколько секунд, и музыка будет работать до тех пор, пока я не заставлю приложение в настройках не остановить службу или не удалить приложение.

Итак, как отключить услугу полностью, когда приложение не видно или закрыто? Я прошел через несколько потоков здесь, youtube видео, учебники и много пробовал. Я также попробовал не-сервисные решения, но я не мог решить проблему.

Спасибо!

+1

Service используется только тогда, когда вы хотите сделать некоторые фоновую задачу, так как вам не требуется фоновое задание, вы не должны использовать службу, а взять MediaPlayer управления на уровне приложений –

+0

Тогда я должен был бы остановить медиаплеера когда я начинаю новую активность и снова запускаю игрока в новом действии. – AlcuPala

+0

Нет. Когда вы создаете объект MediaPlayer на уровне приложения, вы можете перемещаться по любому экрану на любой экран, проигрыватель будет воспроизводиться до тех пор, пока вы не остановите/не приостановите его. –

ответ

0

Альтернативный способ реализации этой функции здесь, однако внедрение с использованием службы является стандартным способом

сделать класс ApplicationContextHolder, как показано ниже

public class ApplicationContextHolder extends Application { 

    public static ApplicationContextHolder instance; 

    public MediaPlayer mediaPlayerHome = new MediaPlayer(); 

    public static ApplicationContextHolder getAppInstance() { 

     return instance; 
    } 

    public ApplicationContextHolder() { 
     instance = this; 
    } 

    public void saveLastPlayingSongPath(String filePath) { 
     songHolder = this.getSharedPreferences("songPath", 0); 
     Editor editor = songHolder.edit(); 
     editor.putString("path", filePath); 
     editor.commit(); 
    } 


    public MediaPlayer getMediaPlayerForHome(Context ctx, int id) { 
     return mediaPlayerHome = MediaPlayer.create(ctx, id); 
    } 

    public void stopMediaPlayerHome() 

    { 
     if (mediaPlayerHome != null && mediaPlayerHome.isPlaying()) { 
      mediaPlayerHome.stop(); 
      mediaPlayerHome.reset(); 

     } 
    } 

    public void pauseMediaPlayerHome() { 
     if (mediaPlayerHome != null && mediaPlayerHome.isPlaying()) { 
      mediaPlayerHome.pause(); 

     } 
    } 

    public void startMediaPlayerHome() { 
     if (mediaPlayerHome != null) 
      mediaPlayerHome.start(); 
    } 


} 

Теперь, как использовать этот класс 1) сделать объект этого класса и локальный объект MediaPlayer внутри Activity/Fragment, в котором у вас есть медиаплеер, или вы можете сделать это в MainActivity

private ApplicationContextHolder App; 
private MediaPlayer mMediaPlayer; 

2) Инициализировать объекты в OnCreate

App = ApplicationContextHolder.getAppInstance(); 
mMediaPlayer = App.getMediaPlayerForHome(getActivity(), 
       R.raw.new_introduction); 

3) и, наконец, в случае, если вы хотите играть музыкальный проигрыватель

App.startMediaPlayerHome(); 

4) и переопределить OnDestory() последней активности, из которого если Назад кнопка нажата, приложение будет закрыто

public void onDestroy() { 

     try { 
      App.stopMediaPlayerHome(); 

     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } 
     super.onDestroy(); 
    } 

Это лишь основные основы, однако вы можете использовать setLooping()/Pause(); и все методы, если вы хотите

Заключительный шаг - зарегистрировать этот класс в манифесте.XML в первой строке Application Tag, как показано ниже

<application 
     android:name="yourpackagename.ApplicationContextHolder" 

Это рабочий код живого приложения, поэтому, пожалуйста, дайте ему попробовать

Для дома Button Event, Вы должны использовать следующий код в ваш каждое действие EDIT: Этот код Теперь Приостановка медиаплеера при нажатии Home,

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if ((keyCode == KeyEvent.KEYCODE_HOME)) { 
      System.out.println("KEYCODE_HOME"); 
      try { 
     App.pauseMediaPlayerHome(); 

    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 
      return true; 
     } 
    return false; 
} 

Предположим, если вы хотите возобновить музыку, когда приложение возобновляется, вы должны проверить логическое значение в конкретной деятельности,

if (mediaplayerPaused) 
App.startMediaPlayerHome(); 
+1

Большое спасибо за ваш блеск. Я попробую как можно скорее. – AlcuPala

+0

Хорошо, я протестировал его и получил следующие проблемы. Музыка воспроизводится при нажатии кнопки «домой». Музыка продолжает играть, когда я переключаюсь на другую активность и нажимаю кнопку «Назад», пока приложение не закрывается (но я использовал метод onDestroy, как вы, в последнем действии). – AlcuPala

+0

@AlcuPala, Обновленный мой ответ, Не получил ваш второй пункт ..! –

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