본문

[2017.10.30] 58. Android 음악 플레이어 프로젝트 [음악 재생 - Service 사용 O]

도입

이번 포스팅에서는 지난 포스팅(http://heepie.tistory.com/157)에 이어 음악을 Android의 Service를 사용해 재생할 예정이다.


Android 음악 플레이어 프로젝트 [음악 재생 - Service 사용 O]의 데이터 흐름

이번 포스팅에서는 지난 포스팅에서 문제점이었던 App이 종료된 후에도 음악이 가능하도록 Service를 사용할 예정이다. 

데이터의 흐름은

1) 리스트에서 선택된 음악(Model)을 Service에서 전달

2) Service에서는 해당 음악(Model)을 Sub Thread로 백그라운드에서 실행

한다. Service를 사용하므로 App이 종료되더라도 음악이 재생되도록 할 예정이다.


문제점 및 해결

PlayMainViewActivity에서 Service로 Model(Music)를 전달한다는 것은 객체를 전달한다는 것이고 Serializable이 필요하다.

(왜 Serializable을 사용할까? - http://heepie.tistory.com/85)

그래서 

1
2
3
4
// 음악 데이터
public class Music implements Serializable {
    // ...
}
cs

Serializable을 했건만...... 다음과 같이 Serializable 객체를 쓰는 중에 Parcelable 오류와 충돌한다는 오류가 발생했다.

Parcelable은 사용하지도 않았는데 왜 오류가 발생할까..

1
2
3
4
5
6
7
// 음악 데이터
public class Music implements Serializable {
    // ...
    private Uri musicUri;
    private Uri albumUri;
    // ...
}
cs

원인은 Uri 객체였다. 

그래서 Serializable을 Parcelable로 변경해 문제해결!(사실 Parcelable이 성능 상대적으로 좋다. 그러나 Serializable이 단순히 코드 양이 적어 사용하려고 했다. 이런 습관은 버려야겠다. 그래도 덕분에 객체화에 대해 공부했다.)

1
2
3
4
// 음악 데이터
public class Music implements Parcelable {
    // ...
}
cs


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class PlayMainViewActivity extends BaseActivity 
                                  implements MusicInfoAdapter.IConnActivityAndService {
     // ...
    public void initData() {
        currentPosition = getIntent().getIntExtra("position"0);
        currentMusic = musicDataController.getList()
                                          .get(currentPosition);
 
        serviceIntent = new Intent(this, PlayerService.class);
        serviceIntent.putExtra("currentMusic", currentMusic);
 
        // 음악 플레이어 상태 설정
        currentStatus = Const.ACTION_MUSIC_SET;
        // 음악 상태를 service의 Action으로 설정
        serviceIntent.setAction(currentStatus);
        // 서비스 시작
        startService(serviceIntent);
 
    }
 
    public void initViewPager() {
        MusicInfoAdapter musicInfoAdapter = new MusicInfoAdapter(this);
        playerViewPager.setAdapter(musicInfoAdapter);
        playerViewPager.setCurrentItem(currentPosition);
 
        playerViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled
                        (int position, float positionOffset, int positionOffsetPixels) {
 
            }
 
            // Viewpager에서 다른 음악이 선택되면 실행되는 메소드 
            @Override
            public void onPageSelected(int position) {
                currentMusic = musicDataController.getList()
                        .get(position);
                serviceIntent.putExtra("currentMusic", currentMusic);
                serviceIntent.setAction(currentStatus);
                startService(serviceIntent);
            }
 
            @Override
            public void onPageScrollStateChanged(int state) {
 
            }
        });
    }
    // ...
}
cs

 

 


스크린 샷

영상이 아니라 확인할 수는 없지만 Service를 통해 실행하므로 App이 죽더라도 음악이 죽지 않는다. 

 

 

#안드로이드 음악 플레이어 #안드로이드 mp3 #안드로이드 프로젝트  #앱개발 #모바일앱개발 #어플개발

공유

댓글