В моем приложении, которое является медиаплеером, я хочу знать, работает ли моя служба или нет.
Причина, по которой я хочу это знать, заключается в том, что я хочу bind myсервис, когда он уже запущен.
Когда мое приложение открыто и нажата песня, я вызываю метод startMusicService , который проверяет, привязан ли сервис или нет, если нет, тогда я вызываюmethod bindMusicService .
in bindMusicService я проверяю, имеет ли mServiceIsBound значение true / false, если false, то тогда я Bind my Service который затем вызывает onServiceConnected .
in onServiceConnected я проверяю, является ли serviceAlreadyRunning ложным, если да, тогда я начинаю проигрывать мою песню.
Все работает отлично, но я уверен, что есть лучший и более эффективный способ достижения того же самого.
Я сделал это так, потому что, если я связываю свой сервис, скажем, в onCreate, это уженачинает играть песню безвыбор одного.
Я хочу, чтобы мой сервис запускался только при выборе песни для воспроизведения.
public void bindMusicService(boolean alreadyRunning){
//boolean alreadyRunning: if True, then we don't call startActionPlay() in onServiceConnected() because Service is already running.
serviceAlreadyRunning = alreadyRunning;
/*mediaPlayerServiceIntent binds our connection to the MediaPlayerService. */
if (!mServiceIsBound) {
try {
mediaPlayerServiceIntent = new Intent(context, MediaPlayerService.class);
context.bindService(mediaPlayerServiceIntent, serviceConnection, Context.BIND_AUTO_CREATE);
} catch (Exception e) {
Log.e("Main", "An exception was caught: Service is not bound!");
}
}
}
public void startMusicService(int songPos, ArrayList<Song> songs){
songIndex = songPos;
songList = songs;
if (mServiceIsBound) {
mediaPlayerService.startActionPlay(context, songList, songIndex);
}else{
bindMusicService(false);
Log.i("Main", "startMusicService(): Service was not bound yet, binding Service...");
}
Код в onServiceConnected
public void onServiceConnected(ComponentName name, IBinder service) {
MediaPlayerService.MusicBinder binder = (MediaPlayerService.MusicBinder)service;
mediaPlayerService = binder.getService();
if (!serviceAlreadyRunning) {
mediaPlayerService.startActionPlay(context, songList, songIndex);
}
mServiceIsBound = true;
Intent intent = new Intent(Constants.ACTIONS.BROADCAST_SERVICE_BOUND);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
Log.i("Main","MediaPlayerService is connected!");
}
Почему код ниже считается плохим? Во многих публикациях говорится, что ActivityManager для проверки работающей службы должен использоваться только для целей отладки, а не для выпуска.
in onResume () У меня есть этот код:
if (isMyServiceRunning(MediaPlayerService.class)){
if (!Main.getInstance().mServiceIsBound) {
Main.getInstance().bindMusicService(true);
Log.i(TAG, "Service already running but not bound!");
}
Log.i(TAG, "Service is running!");
}
isMyServiceRunning метод
private boolean isMyServiceRunning(Class<?> serviceClass){
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
if (activityManager != null){
for (ActivityManager.RunningServiceInfo serviceInfo: activityManager.getRunningServices(Integer.MAX_VALUE)){
if (serviceClass.getName().equals(serviceInfo.service.getClassName())){
return true;
}
}
}
return false;
}