백그라운드 서비스로 음악을 스트리밍하고 있습니다. 최근 앱 목록에서 서비스가 삭제 된 경우를 제외하고는 모든 것이 올바르게 작동합니다. Mediaplayer가 없을 때 서비스를 끈적 거리는 작업으로 실행하는 데 사용했던 접근 방식은 괜찮습니다. 다음은 서비스가 서비스 태그에 속성 android:process=":whatever"
을 추가하여 앱 매니페스트에 자신의 프로세스에서 실행되도록 지정해야 내 코드응용 프로그램이 widow에서 분리 될 때 mediaplayer가있는 Android 서비스가 삭제되었습니다.
public class StreamListenerService extends Service implements MediaPlayer.OnPreparedListener,
MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener {
public static MediaPlayer mMediaPlayer;
private String streamUrl;
public static boolean isPlaying = false;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
streamUrl = intent.getStringExtra("streamUrl");
mMediaPlayer = new MediaPlayer();
mMediaPlayer.reset();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mMediaPlayer.setDataSource(streamUrl);
} catch (IOException e) {
e.printStackTrace();
}
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.prepareAsync();
mMediaPlayer.setOnCompletionListener(this);
isPlaying = true;
return Service.START_STICKY_COMPATIBILITY;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
Log.d("StreamListenerService", "onDestroy");
if (mMediaPlayer != null && mMediaPlayer.isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.reset();
isPlaying = false;
}
super.onDestroy();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mMediaPlayer.start();
isPlaying = true;
}
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
Toast.makeText(this, R.string.text_problem_in_playing_audio_stream, Toast.LENGTH_SHORT).show();
mMediaPlayer.stop();
mMediaPlayer.reset();
//Toast.makeText(this, R.string.text_problem_in_playing_stream,Toast.LENGTH_SHORT).show();
this.onDestroy();
return false;
}
@Override
public void onCompletion(MediaPlayer mp) {
Toast.makeText(this, R.string.text_stream_finished, Toast.LENGTH_SHORT).show();
mMediaPlayer = mp;
mMediaPlayer.stop();
mMediaPlayer.reset();
this.onDestroy();
}
}
내가 아는 한 recents 목록에서 앱을 스 와이프하여 앱과 관련된 모든 것을 종료 할 수 있습니다. 여기에는 모든 서비스가 포함됩니다. 여기를 참조하십시오 : http://stackoverflow.com/questions/30936888/differentiate-between-android-killing-the-app-and-user-swiping-it-off-on-the-rec – FrankR