마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

리시버1 를 동적으로 등록하는 서비스를 생성 한후 바로 리시버를 호출 할 수 있나요?

0 추천

mp3 플레이어 앱을 만들고 있습니다.

PlayMusicActivity.java  에서는 플레이어 액티비티 화면단 이구요.

PlayMusicService.java  에서는 음악을 재생하는 서비스 단 입니다.

액티비티 와 서비스 사이에 데이터 공유하는 방법은 브로드캐스트 리시버로 했습니다.

그래서 액티비티 와 서비스 양쪽 모두 브로드캐스트 리시버를 동적으로 만들었습니다.

문제는 액티비티에서 서비스를 생성한 후 바로 리시버 호출이 않되는것 같습니다.

그러니까...  플레이어를 실행시키자 마자 음악을 자동으로 플레이 하고 싶은데요.

다음 코드를 봐주세요.

PlayMusicActivity.java  입니다.

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_play_music);

	registerReceiver(receiver, new IntentFilter("kr.co.seungmin.PLAY_TO_ACTIVITY"));

	Intent service_intent = new Intent(this, PlayMusicService.class);
	service_intent.putExtra("playSelectedList", playSelectedListParcel);
	service_intent.putExtra("isSelected", isSelected);
	startService(service_intent);

	Intent pintent = new Intent("kr.co.seungmin.PLAY_TO_SERVICE");
	pintent.putExtra("mode", "start");
	sendBroadcast(pintent);

    }

BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String mode = intent.getStringExtra("mode");

            if( mode != null ) {
                if( mode.equals("start") ) {
                    int current_pos = intent.getIntExtra("current_pos", 0);
                    int duration = intent.getIntExtra("duration", 0);
                    progressBar.setMax(duration);
                    progressBar.setProgress(0);

                    runThread = true;
                    ProgressThread thread = new ProgressThread();
                    thread.start();

                } else if( mode.equals("stop") ) {
                    runThread = false;

                } 
            }
        }
    };

다음은 PlayMusicService.java 입니다.

public void onCreate() {
        super.onCreate();

        registerReceiver(receiver, new IntentFilter("kr.co.seungmin.PLAY_TO_SERVICE"));

        mMusicPlayer = new MediaPlayer();
    }

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


        playSelectedListParcel = intent.getParcelableExtra("playSelectedList");
        boolean isSelected = intent.getBooleanExtra("isSelected", true);
        current_pos = playSelectedListParcel.getPos();

        if (mMusicPlayer.isPlaying() == true && isSelected == false) {
           ...
        }


        return super.onStartCommand(intent, flags, startId);
    }

    BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String mode = intent.getStringExtra("mode");

            if (mode != null) {
                if (mode.equals("start")) {
                    try {

                        filePath = playSelectedListParcel.getMusicInfoParcels().get(current_pos).getPath();

                        mMusicPlayer.setDataSource(filePath);
                        mMusicPlayer.prepare();
                        mMusicPlayer.start();

                        Intent aIntent = new Intent("kr.co.seungmin.PLAY_TO_ACTIVITY");
                        aIntent.putExtra("mode", "start");
                        aIntent.putExtra("current_pos", current_pos);  // to print album image
                        aIntent.putExtra("duration", mMusicPlayer.getDuration());
                        sendBroadcast(aIntent);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                } else if (mode.equals("stop")) {

                }
            }
        }
    };

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mMusicPlayer != null) {
            mMusicPlayer.stop();
            mMusicPlayer.release();
            mMusicPlayer = null;
        }

        unregisterReceiver(receiver);
    }

액티비티의 onCreate() 에서 서비스 (service_intent ) 를 생성하였고 곧바로 서비스의 리시버를 호출했는데

Intent pintent = new Intent("kr.co.seungmin.PLAY_TO_SERVICE");

    pintent.putExtra("mode", "start");

    sendBroadcast(pintent);

호출이 안됩니다.   어떻게 해야 하는지 모르겠습니다.  고수님들 도와주세요.

 

 

 

quantumy (350 포인트) 님이 2019년 4월 2일 질문

1개의 답변

+1 추천
 
채택된 답변

뮤직 플레이어는 Service를 Bind Service로 구현해야 합니다.

액티비티에서 서비스를 연결 후 서비스에서 연결이 완료됐다는 콜백을 호출하면 거기서 리시버를 호출해야합니다.

ServiceConnection 의 onServiceConnected를 Activity에서 구현하고 서비스가 연결되면 리시버를 호출하시면 될듯합니다.

private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

            Intent pintent = new Intent("kr.co.seungmin.PLAY_TO_SERVICE");

            pintent.putExtra("mode", "start");

             sendBroadcast(pintent);

}

그리고 같은 앱 내에선 Receiver 보단 보통 LocalBroadcastReceiver나 EventBus를 사용합니다.

 

참고할 만한 깃허브 주소입니다.

https://github.com/alexdantas/kure-music-player

franny (1,760 포인트) 님이 2019년 4월 2일 답변
quantumy님이 2019년 4월 3일 채택됨
답변 정말 감사드립니다.
그런데 bindService() 로 서비스를 생성하면 액티비티를 종료했을때 서비스도 자동으로 종료 되지 않나요?
서비스는 액티비티의 생명주기와 무관하고요.
액티비티가 종료되어 홈화면으로 나갔을 경우 서비스는 포어그라운드 서비스면 살아있습니다. 포어그라운드 서비스는 노티피케이션을 띄어줘야 합니다.
액티비티 onStart()에서 bindService()호출하고
액티비티 onStop()에서 unBindService()호출하시면 될거에요.
...