2011-10-28 4 views
7

오키, 이것이 내 문제입니다. 저는 Ive가 모든 시간 배경 음악을 재생할 수있는 미디어 플레이어를 만들 수있는 서비스 클래스 하나를 가지고 있습니다. 여기에 코드입니다 :배경 음악 Android

package com.test.brzoracunanje; 
import android.app.Service; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.os.IBinder; 

public class BackgroundSoundService extends Service { 
private static final String TAG = null; 
MediaPlayer player; 
public IBinder onBind(Intent arg0) { 

    return null; 
} 
@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 
     player = MediaPlayer.create(this, R.raw.test_cbr); 
     player.setLooping(true); // Set looping 
     player.setVolume(100,100); 
     player.start(); 
} 
@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId); 
} 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 
} 

protected void onNewIntent() { 
    player.pause(); 
} 
} 

하지만 HOME, 또는 BACK 버튼을 클릭하면 지금은 문제가 있습니다. 그것은 여전히 ​​음악을 연주합니다. 아무도 그 문제를 해결하는 방법을 알고 있습니까?

그리고 내가 음악을 연주하고자하는 클래스에서이 서비스를 호출하는 방법은 다음과 같습니다.

Intent svc=new Intent(this, BackgroundSoundService.class); 
    startService(svc); 
+0

문제가있는 곳을 볼 수 없습니다 ... 항상 배경 음악을 듣고 싶지 않았습니까? – m0skit0

+0

응용 프로그램이 실행되는 동안 계속 재생하려고하지만 홈 버튼을 누르면 음악이 계속 재생됩니다. – Zookey

답변

22

앱용 배경 음악 만 재생하려는 경우 앱에서 시작한 스레드에서 재생/AsyncTask 클래스를 사용하여 음악을 재생합니다.

서비스의 개념은 백그라운드에서 실행하는 것입니다. 배경에 따라 앱의 UI가 이 아닌 경우는으로 표시됩니다. 사실, 당신이 가진 것처럼 사용할 수 있지만 (당신이 그것을 멈추는 것을 기억한다면), 그게 옳지 않아서, 사용해서는 안되는 자원을 소비합니다.

활동이 인 백그라운드에서 작업을 수행하려면 AsyncTask를 사용하십시오.

그런데 onStart은 더 이상 사용되지 않습니다. 서비스를 이용할 때는 onStartCommand을 구현하십시오.

UPDATE :

는이 코드가 당신을 위해 일 것이라 생각합니다. 이 클래스를 추가하십시오 (활동 클래스에 동봉 됨).

public class BackgroundSound extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     MediaPlayer player = MediaPlayer.create(YourActivity.this, R.raw.test_cbr); 
     player.setLooping(true); // Set looping 
     player.setVolume(1.0f, 1.0f); 
     player.start(); 

     return null; 
    } 

} 

이제 음악을 제어하려면 익명으로 만들지 말고 BackgroundSound 개체를 저장하십시오. 활동의 필드로 선언 : 활동의 onResume 방법에

BackgroundSound mBackgroundSound = new BackgroundSound(); 

을, 그것을 시작합니다

public void onResume() { 
    super.onResume(); 
    mBackgroundSound.execute(null); 
} 

그리고 활동의 onPause 방법에

가, 그만 :

public void onPause() { 
    super.onPause(); 
    mBackgroundSound.cancel(true); 
} 

이를 작동합니다.

+0

당신이 말한대로 제 코드를 고칠 수 있습니까? – Zookey

+0

몇 분 후 편집 할 것입니다. – Jong

+0

한 가지 질문입니다. 새로운 클래스 BackgroundSound를 만들어야합니까? 또는 이것을 BackgroundSoundService 클래스에 두거나, 이것을 주 활동 클래스에 넣으시겠습니까? – Zookey

0

물론 서비스는 백그라운드에서 실행되며 백그라운드로 이동할 때 수동으로 중지해야합니다.

+2

수동으로 중지하는 방법? – Zookey

0

예, 홈 버튼을 누르면 서비스가 중지됩니다. OnPause() {} 재정의 메서드에서 음악 서비스를 중지해야합니다. 그리고 OnDestroy() 메소드의 서비스 내부에서 미디어 플레이어를 중지하십시오. 이제는 집 전화 onPause 및 onPause() ->를 누르면 서비스가 중지되고 OnDestroy가 서비스에서 실행되고 odestroy()에서 미디어 플레이어가 중지되고 문제가 해결됩니다.

0

아래 코드를 작성하시면됩니다 :

시스템.출구 (0); 다시/홈 버튼 또는 가까운 응용 프로그램이

0

홈페이지 또는 BACK 프레스에서 배경 음악을 중지하려면 다음을 시도 누를 때

이 미디어 플레이어를 종료합니다.

@Override 
protected void onStop() { 
    super.onStop(); 
    ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    List<RunningTaskInfo> services = activityManager 
      .getRunningTasks(Integer.MAX_VALUE); 
    boolean isActivityFound = false; 

    if (services.get(0).topActivity.getPackageName().toString() 
      .equalsIgnoreCase(getPackageName().toString())) { 
     isActivityFound = true; // Activity belongs to your app is in foreground. 
    } 

    if (!isActivityFound) { 
     if (player != null && player.isPlaying()) { 
      player.release(); 
     } 
    } 
} 
1

AsyncTasks은 매우 짧은 클립에 좋다, 그러나 음악 파일 인 경우에는 같은 문제에 직면하게 될 것이다 : 당신은/중지 중간에 음악을 일시 정지 할 수 없습니다

  • 합니다. 내게 그것은 진짜 문제입니다. 여기

는 AsyncTasks에 대한 안드로이드 개발자 페이지에서 몇 라인

AsyncTasks 이상적으로 짧은 작업에 사용되어야한다 (에서 몇 초 을 가장.) 당신이 오랜 기간 동안 실행 스레드를 유지해야하는 경우 시간이면 에서 제공하는 다양한 API (Executor, ThreadPoolExecutor 및 FutureTask)와 같은 java.util.concurrent 패키지를 사용하는 것이 좋습니다.

그래서 현재 다른 옵션을 찾고 해결책을 찾으면 대답을 업데이트합니다.

0

onDestroy() 메서드에서 player.stop()을 삽입 해보십시오. 도움이 될 것입니다.