Android使用AIDL方式实现播放音乐案例

 更新时间:2018年04月17日 11:56:49   作者:杨天福  
这篇文章主要介绍了Android使用AIDL方式实现播放音乐案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android使用AIDL方式实现播放音乐的具体代码,供大家参考,具体内容如下

思路:

① 新建两个APP项目或者Module,一个作为服务端,一个作为客户端,在服务端创建service  

② 在两个module的main文件中分别新建两个aidl文件(接口),里边定义处理音乐的方法

③ 在两个AIDL文件定义过方法后在任务栏给他们makeproject,编译成Java文件,才能在service和acvitity中使用
interface.Stub需要实例化,实现远程方法

④.Service中onbind方法,返回的是:interface.Stub。

sevice需要设置action,不然客户端service运行时会报空指针异常
先处理服务端:

Mainfest文件中,为intent隐式调用添加action 

 <service
   android:name=".MusicService"
   android:enabled="true"
   android:exported="true">
   <intent-filter>
   <action android:name="com.work.MusicService"></action>
 </intent-filter>

MusicService。Java

public class MusicService extends Service {

  private MediaPlayer player = null;

  public MusicService() {
  }

  //①实现已经makeproject过的adil接口,重写里边自定义定义的三个方法
  MusicAidlInterface.Stub stub = new MusicAidlInterface.Stub() {
    @Override
    public void paly() throws RemoteException {
      if (player == null) {
        player = MediaPlayer.create(MusicService.this, R.raw.hckz);
      }
      if (player != null && !player.isPlaying()){
        player.start();
      }

    }

    @Override
    public void paus() throws RemoteException {
      if(player!=null&&player.isPlaying()){
        player.pause();
      }

    }

    @Override
    public void stop() throws RemoteException {
      if(player!=null){
        player.stop();
      }
      try {
        player.prepare();//重新准备下次播放
      } catch (IOException e) {
        e.printStackTrace();
      }

    }
  };

  @Override
  public IBinder onBind(Intent intent) {
    return stub;
  }
  //② 重写service销毁时的方法

  @Override
  public void onDestroy() {
    super.onDestroy();
    if(player!=null){
      player.stop();
      player.release();//释放资源,防止失去依托溢出,发生异常
    }
  }

处理客户端

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  private Button btn_play, btn_pause, btn_stop, btn_stopservice, btn_stopacvitity;
   MusicAidlInterface service = null;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    intiView();
    connect();

  }

  private void intiView() {
    btn_play = (Button) findViewById(R.id.btn_play);
    btn_pause = (Button) findViewById(R.id.btn_pause);
    btn_stopservice = (Button) findViewById(R.id.btn_stopservice);
    btn_stopacvitity = (Button) findViewById(R.id.btn_exitacvitity);
    btn_stop = (Button) findViewById(R.id.btn_stop);

    btn_play.setOnClickListener(this);
    btn_pause.setOnClickListener(this);
    btn_stop.setOnClickListener(this);
    btn_stopservice.setOnClickListener(this);
    btn_stopacvitity.setOnClickListener(this);
  }

  @Override
  public void onClick(View v) {
    try {
      switch (v.getId()) {
        case R.id.btn_play:
          service.paly();
          break;
        case R.id.btn_pause:
          service.paus();
          break;
        case R.id.btn_stop:
          service.stop();
          break;
        case R.id.btn_stopservice:
          if (conn != null) {
            unbindService(conn);
          }
          break;
        case R.id.btn_exitacvitity:
          finish();
          break;
      }
    } catch (RemoteException e) {
      e.printStackTrace();
    }

  }

  //连接service
  ServiceConnection conn = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder iBinder) {
      service = MusicAidlInterface.Stub.asInterface(iBinder);
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
      service = null;
    }
  };

  //获取连接BindService的方法
  private void connect() {
    //使用intent的隐式调用方法
    Intent intent = new Intent("com.work.MusicService");
    //设置目标service的包名
    intent.setPackage("com.work.musicservice");
    bindService(intent, conn, BIND_AUTO_CREATE);
  }
  //重写acvitity销毁时候解除绑定的方法

  @Override
  protected void onDestroy() {
    super.onDestroy();
    if (conn != null) {//解除绑定
      unbindService(conn);
    }
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用RecyclerView实现瀑布流高度自适应

    使用RecyclerView实现瀑布流高度自适应

    这篇文章主要为大家详细介绍了使用RecyclerView实现瀑布流高度自适应,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Flutter质感设计之持久底部面板

    Flutter质感设计之持久底部面板

    这篇文章主要为大家详细介绍了Flutter质感设计之持久底部面板,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android 广播接收器BroadcastReceiver详解

    Android 广播接收器BroadcastReceiver详解

    Android开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库,本篇着重介绍广播组件
    2022-07-07
  • Android中Activity组件实例介绍

    Android中Activity组件实例介绍

    大家好,本篇文章主要讲的是Android中Activity组件实例介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Android 软件自动更新功能实现的方法

    Android 软件自动更新功能实现的方法

    本篇文章小编为大家介绍,Android 软件自动更新功能实现的方法。需要的朋友参考下
    2013-04-04
  • Android开发手册Button按钮实现点击音效

    Android开发手册Button按钮实现点击音效

    这篇文章主要为大家介绍了Android开发手册Button按钮实现点击音效示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Android 中SP与DP的区别实例详解

    Android 中SP与DP的区别实例详解

    这篇文章主要介绍了Android 中SP与DP的区别实例详解的相关资料,需要的朋友可以参考下
    2016-10-10
  • Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解

    Android性能优化之利用Rxlifecycle解决RxJava内存泄漏详解

    RxJava作为一种响应式编程框架,是目前编程界网红,可谓是家喻户晓,其简洁的编码风格、易用易读的链式方法调用、强大的异步支持等使得RxJava被广泛使用。
    2017-01-01
  • Android快速开发之定制BaseTemplate

    Android快速开发之定制BaseTemplate

    这篇文章主要为大家详细介绍了Android快速开发之定制BaseTemplate的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Android仿微信图片点击全屏效果

    Android仿微信图片点击全屏效果

    这篇文章主要为大家详细介绍了Android仿微信图片点击全屏效果的相关资料,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-04-04

最新评论