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
0
投稿
猜你喜欢
- Java基础编写猜数游戏,供大家参考,具体内容如下设计内容及要求产生一个100以内的随机数,游戏者进行猜数,猜中即胜,猜不中,提示是大了还是
- 使用场景:自己项目对接多个外部系统,各个外部系统使用的字段并没有统一,所以要根据不同系统动态的输出序列化数据,使适应各个系统的要求实现方式使
- 本文实例为大家分享了C#仿Windows XP自带的扫雷游戏的具体代码,供大家参考,具体内容如下1 题目描述:模仿Windows XP自带的
- 前言在SpringIOC中,我们熟知的BeanScope有单例(singleton)、原型(prototype), Bean的Scope影响
- state:比较常用,各种状态都可以用它,但是它更着重于一种心理状态或者物理状态。Status:用在人的身上一般是其身份和地位,作“状态,情
- 今天给大家介绍下用Java swing开发一款音乐播放器, * 酷狗音乐播放器,完整源码地址在最下方,本文只列出部分源码,因为源码很多,全部贴
- 1、什么是反射?在java开发中有一个非常重要的概念就是java反射机制,也是java的重要特征之一。反射的概念是由Smith在1982年首
- 前情提要:本demo是基于springboot+mybatis-plus实现加密,加密为主,全局异常处理,日志处理为辅,而登录密码加密是每个
- 前言最近发现公司的微服务项目中没有统一的批量新增方法,公司用的是MP插件,遇到批量新增都是单独去去编写xml实现,费时费力,而MP自带的批插
- C#判断数据类型的简单示例代码:int i = 5; Console
- 本文实例为大家分享了C# Winform选项卡集成窗体的具体代码,供大家参考,具体内容如下知识要点:利用反射动态的加载窗体到对应的TabPa
- 前段时间,有个同事说“30000000000000000000000000000000000000000000000000000000000
- System.Web.Caching.Cache Insert和Add方法的区别Add()object Add(string key, ob
- Springcloud Config什么是springcloud Config  简单来说,Spring
- 异常的英文单词是exception,字面翻译就是“意外、例外”的意思,也就是非正常情况。事实上,异常本质上是程序上的错误,包括程序逻辑错误和
- 1. 引入当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象, 只有通过new关键字才会产生出对象,这时系统才会
- 本文实例讲述了java旋转二维数组的操作,分享给大家供大家参考。具体实现方法如下:package test;/* * &
- 表单代码<!DOCTYPE html><html lang="en" xmlns="http
- 直接用javaw.exe想打开aspectj-1.9.4.jar安装aspectJ选Java™ Platform SE binary提示JV
- 环境:SpringBoot 2.0.4.RELEASE需求:很多Controller方法,刚进来要先获取当前登录用户的信息,以便做后续的用户