2017-01-18 1 views
0

백그라운드 서비스로 음악을 스트리밍하고 있습니다. 최근 앱 목록에서 서비스가 삭제 된 경우를 제외하고는 모든 것이 올바르게 작동합니다. 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(); 
    } 
} 
+1

내가 아는 한 recents 목록에서 앱을 스 와이프하여 앱과 관련된 모든 것을 종료 할 수 있습니다. 여기에는 모든 서비스가 포함됩니다. 여기를 참조하십시오 : http://stackoverflow.com/questions/30936888/differentiate-between-android-killing-the-app-and-user-swiping-it-off-on-the-rec – FrankR

답변

2

입니다. 이렇게하면 앱의 기본 프로세스 인 앱이 앱 목록에서 삭제 될 때 서비스가 종료되지 않습니다.

사용자가 중지 할 때까지 서비스를 실행하려면 해당 서비스를 포 그라운드 서비스로 시작하십시오. 어떤 점에서 서비스에 startForeground을 호출하면됩니다. 자신이 선택한 정수의 알림 ID와 startForeground에 대한 알림을 전달해야합니다. 알림은 사용자가 서비스를 중지 할 때까지 작업 표시 줄에 남아 있습니다. 물론 알림 또는 알림 작업 중 하나에서 서비스를 중지하려면 PendingIntent를 제공해야합니다.

1

응용 프로그램이 파괴되면 서비스도 중단됩니다. 문제는 아마도 startService으로 만 서비스를 시작하고 stopService으로 그 서비스를 중단해야합니다. 서비스 클래스에 메서드 onStartCommand 내부로 서비스를 시작해야합니다.

@Override 
    public int onStartCommand(Intent i, int flags, int startId) { 

     Intent resultIntent = new Intent(SOME_INTENT_ACTION); 
     PendingIntent resultPendingIntent = PendingIntent.getBroadcast(this, 0, resultIntent, 0); 

     Notification noti = new Notification.Builder(getApplicationContext()) 
       .setContentTitle(TITLE) 
       .setContentText(CONTENT_TEXT) 
       .setSmallIcon(R.mipmap.ic_launcher) 
       .setContentIntent(resultPendingIntent) 
       .build(); 

     startForeground(12345, noti); 

     return Service.START_STICKY; 
    } 

서비스가 다른 스레드에서 실행되며 응용 프로그램이 종료 되더라도 작동합니다. 일부 백그라운드 서비스가 실행 중임을 사용자가 알 수 있도록 로컬 알림을 표시하는 것이 중요합니다.

관련 문제