天天看點

Android之小試AIDL

ps:首先來寫這個部落客要也是因為在朋友的項目中要用這個技術,是以再好奇的心理下,我也對此來進行了小小的一個試驗純純的試驗【播放一短音樂的功能】。

因為我對這塊的理論知識也是一知半解,是以也就不在這賣弄了,有想補充的同鞋可以自行查閱官網API。

好了 不再多廢話了說下步驟吧!

  1. 第一步:建立作為服務端的應用
  2. 第二步:建立.aidl檔案(檔案支援格式同java基本資料類型一樣,檔案名同接口名要一樣不然會報錯),并寫接口方法。儲存自動在gen目錄下生成同名的.java檔案,因為我的服務端是在原有的DEMO中寫的是以看到其它的類 大家可以略過
    Android之小試AIDL
    aidl檔案中的内容很簡單就兩個方法 播放和停止,也沒有其它太多的内容
    Android之小試AIDL
  3. 第三步:自定義類繼承Servicer重寫其中的onCreat(),onBind(),onStart()方法;實作音樂的播放停止方法

    `public class playMusicService extends Service {

    private MediaPlayer mp;

    @Override

    public IBinder onBind(Intent intent) {

    // TODO Auto-generated method stub

    return bulider;

    }

    @Override

    public void onCreate() {

    // TODO Auto-generated method stub

    mp = new MediaPlayer();

    mp = MediaPlayer.create(playMusicService.this, R.raw.s001);

    super.onCreate();

    }

    @Override

    public void onStart(Intent intent, int startId) {

    // TODO Auto-generated method stub

    // 當播放發生錯誤時的處理事件
    mp.setOnErrorListener(new OnErrorListener() {
    
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            // TODO Auto-generated method stub
            // 釋放音樂資源
            mp.release();
            return false;
        }
    });
    super.onStart(intent, startId);
               

    }

    public play.Stub bulider = new play.Stub() {

    @Override
    public void stop() throws RemoteException {
        // TODO Auto-generated method stub
        System.out.println("停止播放");
        stopMusic();
    }
    
    @Override
    public void playing() throws RemoteException {
        // TODO Auto-generated method stub
        System.out.println("開始播放");
        playMusic();
    }
               

    };

    public void playMusic() {

    // 開始播放音樂

    mp.start();

    // 音樂播放完畢的處理事件

    mp.setOnCompletionListener(new OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {
        // TODO Auto-generated method stub
        // 循環播放
        mp.start();
    }
               

    });

    if(mp.isPlaying()){

    mp.reset();

    mp.start();

    }

    }

  4. public void stopMusic() {

    mp.stop();

    mp.release();

    }

    @Override

    public void onDestroy() {

    // TODO Auto-generated method stub

    // 服務停止時停止播放音樂并釋放資源

    mp.stop();

    mp.release();

    super.onDestroy();

    }

    }`

    到這裡關于服務端的内容也就搞定了 ,當然别忘了在AndroidManifest.xml中注冊service

  5. 第四步:建立用戶端應用 内容其實也很簡單,複制過來服務端的.aidl檔案【路徑名要一樣】,然後通過ServiceConnection接口接收service傳回的IBinder對象,`public class MainActivity extends Activity {

    private play mPlay;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    Intent intent = new Intent(“com.example.service.playMusicService.aidl”);

    bindService(intent, connection, BIND_AUTO_CREATE);

    }

    public void playing(View v) {

    try {

    mPlay.playing();

    } catch (RemoteException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

  6. public void stop(View v) throws RemoteException {

    mPlay.stop();

    }

    ServiceConnection connection = new ServiceConnection() {

    @Override
    public void onServiceDisconnected(ComponentName name) {
        // TODO Auto-generated method stub
        mPlay = null;
    }
    
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // TODO Auto-generated method stub
        mPlay = play.Stub.asInterface(service);
    
    }
               

    };

    }`

    至此這個小小的DEMO也就完成了 ,親測可用 不過音樂播放會有小小問題沒解決,不過大概流程也就是這樣的!

    Android之小試AIDL