音楽再生-利用サービスO


これは私が書いた組織文章の移植です.

導入する


今回の位置づけでは、前回の位置づけに続き、Androidのサービスで音楽を再生する.

データ・フロー



今回のリリースでは、前回リリース中に問題が発生したアプリが終了した後も、サービスを利用して音楽が可能になります.
データ・フロー
  • リストから選択する音楽(モデル)は、
  • をサービスに転送する.
  • サービスは、その音楽(モデル)をSub Threadとしてバックグラウンドで
  • 実行する.
    始まりました.サービスを利用しているので、アプリが終わっても音楽が流れます.

    問題と解決


    PlayMainViewActivityでは、サービスからオブジェクトにモデル(Music)を渡すためにシーケンス化が必要です.
    だから.
    // 음악 데이터
    public class Music implements Serializable {
        // ...
    }
    Serializableを作ったけど...シリアルオブジェクトの書き込み中にParcelableエラーと競合するエラーが発生しました.次のようになります.

    Parcelableを使用していないのになぜエラーが発生したのか...
    // 음악 데이터
    public class Music implements Serializable {
        // ...
        private Uri musicUri;
        private Uri albumUri;
        // ...
    }
    理由はUriオブジェクトです.

    だからSerializableをParcelableに変えて問題を解決します!
    △実は、Parcelableのほうが性能がいいです.しかし、Serializableはコード量が少ないだけなので、使いたいです.私はこの習慣を捨てるべきです.そのおかげでオブジェクト化を学びました.
    // 음악 데이터
    public class Music implements Parcelable {
        // ...
    }

    コード#コード#

    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) { }
            });
        }
        // ...
    }

    スクリーンショット


    動画ではなく、確認はできませんが、サービス実行でアプリが死んでも音楽は死んでしまいません.