Android使用AIDL方式实现播放音乐案例
作者:杨天福 发布时间:2022-01-04 23:58:40
标签: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);
}
}
来源:https://blog.csdn.net/ytfunnysite/article/details/60875455


猜你喜欢
- 不同的加锁顺序我们来看一个不同加锁顺序的例子:public class DiffLockOrder {private int amount;
- 一、分布式压测原理如下图(这个图说明的是要一台控制机,然后由这台控制机发压测脚本到每台远程执行机,然后由控制机收集执行机结果)二、修改 Jm
- SpringBoot web项目启动后立即关闭我们在写spring boot web项目时,有时会遇到启动后立即关闭的情况,或者是无法加载某
- 当需要将一个对象输出到显示器时,通常要调用他的toString()方法,将对象的内容转换为字符串.java中的所有类默认都有一个toStri
- 本文实例讲述了C#移除所有事件绑定的方法。分享给大家供大家参考。具体分析如下:private delegate int DEL_TEST_E
- 本文实例为大家分享了Android实现手势密码功能的具体代码,供大家参考,具体内容如下首先声明一下,九宫格布局是从网上扒了一个大神写好的,大
- Swing包的介绍Java基础类数据库(Java Foundation Class)给java应用程序增加了图形界面、丰富的功能性以及与用户
- 核心代码迁移相对顺利,大致流程如下:一、创建项目 1) cd cocos2d-x-3.0rc0;&nbs
- 前言:Zygote 是 Android 的核心,每打开一个 app,Zygote 就会 fork 一个虚拟机实例来运行 app,基于Xpos
- 混合事务在ORM框架的事务管理器的事务内,使用JdbcTemplate执行SQL是不会纳入事务管理的。下面进行源码分析,看为什么必须要在Da
- Web基础和HTTP协议┌─────────┐┌─────────┐
- Android 应用启动欢迎界面广告0.写在前面在这篇教程中来实现一个类似于微信的的延迟3秒再进入主界面的效果。1.项目准备先新建一个空的a
- 1.以G71列车为例,首先对车次站台进行占位编码(从1开始到最后一站递加)对以上占位简单描述以下:G71总共18个站点那么我们的单个座位的座
- 一、为什么要有泛型?我们在写一些方法时可能会方法名相同,参数类型不同的方法,这种叫做重载。如果只是因为参数类型不同里面做的业务逻辑都是相同的
- 1.汉诺塔介绍汉诺塔规则1.有三根杆子A,B,C。A杆上有若干碟子2.每次移动一块碟子,小的只能叠在大的上面3.把所有碟子从A杆全部移到C杆
- ByteArrayInputStream介绍ByteArrayInputStream 是字节数组输入流。它继承于 InputStream。I
- 在Android程序中很多客户端软件和浏览器软件都喜欢用Tab分页标签来搭建界面框架。读者也许会马上想到使用TabHost 与 TabAct
- 前言 Windows下实现摄像视频捕捉有多种实现方式;各种方式的优劣,本文不做对比。但是,opencv是一款老牌开发库,在图像处理
- 前言前面文章我们介绍了Broker是如何将消息全量存储到CommitLog文件中,并异步生成dispatchRequest任务更新Consu
- 前言一般情况下,多数移动开发者使用的是数据线连接电脑,进行各种移动设备的调试,更有胜者,非常迷恋模拟器,模拟器它好不好,答案是好,因为直接运