当前位置: 首页 > 知识库问答 >
问题:

如何在不同流程中运行音乐服务

越高峻
2023-03-14

我写了一个流媒体音乐应用程序,我工作正常,直到我尝试在不同的进程中运行音乐服务。在Android Developer的服务之后,我在清单中添加了服务流程,如下所示:

<service android:name=".MyPlayer"
            android:process=":myPlayer"
            android:enabled="true"/>

然后在MainActivity中,我调用启动服务:

if(_playIntent == null) {
            _playIntent = new Intent(getApplicationContext(), MyPlayer.class);
            startService(_playIntent);
            bindService(_playIntent, musicConnection, Context.BIND_AUTO_CREATE);
        }

bindService将调用ServiceConnection:

MyPlayer _player;
private ServiceConnection musicConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            MyPlayer.MusicBinder binder = (MyPlayer.MusicBinder)service; 
            _player = binder.getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            isConnection = false;
        }
    };

然后应用程序在这一行之后停止工作:

MyPlayer.MusicBinder binder = (MyPlayer.MusicBinder)service;

该应用程序显示消息“不幸的是,Mx舞曲已经停止”,堆栈跟踪:“致命例外:主android.os.类异常:ooper.loopBinderProxy无法转换为ooper.java:137Kandroid.app.音乐。hread.mainKhread.java:4823音乐的MyPlayer$MusicBinder。主活动$java.lang.reflect.服务连接(MainAethod.invoke)在LoadedApk$ServiceDethod.invoke连接(LoadedAethod.java:511)在com.android.internal.os.LoadedApk$ServiceDispatcher$RunCaller.run(LoadedApk.java:1114)在android.os.Handler.handle回调(Handler.java:615)在android.os.Handler.dispatch消息(Handler.java:92)在java.lang.Landroid.os.(Lcom.xi)在y.mxActivityTcom.xi(ActivityTy.mx)在3.onMctivity.java:356Native(Native Method)在android.app.Mispatcher.do(Mpk.java:1097)在android.app.ZygoteInit$MEodAndArgsConnection.run(ZygoteInit. java: 789)在dalvikos. com. android. international(ZygoteInit. java: 556)

线程返回的类加载器。对于承载多个应用程序的进程,getContextClassLoader()可能会失败。您应该显式指定上下文类加载器。例如:Thread。setContextClassLoader(getClass()。getClassLoader());

然后如果我去掉这条线:

bindService(_playIntent, musicConnection, Context.BIND_AUTO_CREATE);

应用程序没有崩溃。如何修复这个错误?我感谢大家的任何帮助。

共有1个答案

龚迪
2023-03-14
MyPlayer.MusicBinder binder = (MyPlayer.MusicBinder)service;

这仅适用于本地绑定服务。切换到远程服务后:

  • 您需要在AIDL中定义API
  • 您的服务需要将其绑定器实现为的子类。从该AIDL生成的存根
  • 客户端需要使用asInterface()将IBinder转换为从该AIDL生成的客户端代理

所有这些都包含在AIDL的文档中。

 类似资料:
  • 我有一个情况,我需要启动两个线程一个接一个。我尝试了以下代码片段,在这里我可以启动Thread12,但不能启动Thread2。我怎样才能开始两个......?如何启动两个线程一个接一个...? 代码片段

  • 如何在将GUI保持为活动状态而不是Hibernate/等待状态的同时延迟进程或创建队列?

  • 1.1. 酷狗音乐 Skill 接入流程 1.1.1. 酷狗音乐skill介绍 1.1.2. 酷狗音乐skill接入通用流程介绍 1.1. 酷狗音乐 Skill 接入流程 本文旨在介绍酷狗音乐技能的接入流程,方便B端厂商快速接入酷狗音乐优质的资源内容。 一、酷狗音乐skill介绍 二、酷狗音乐skill通用流程 1.1.1. 酷狗音乐skill介绍 酷狗音乐skill内容介绍 技能名称 介绍 价格

  • 1.1. 叮当音乐 Skill 接入流程 1.1.1. 叮当音乐skill介绍 1.1.2. 叮当音乐skill接入通用流程介绍 1.1.3. 叮当音乐skill接入流程 1.1. 叮当音乐 Skill 接入流程 本文旨在介绍叮当音乐技能的接入流程,方便B端厂商快速接入叮当音乐优质的资源内容。 一、叮当音乐skill介绍 二、叮当音乐skill通用流程 三、叮当音乐skill接入流程 1.1.1.

  • 问题内容: 我正在使用使用node_redis的kue,但是我已经在会话中使用了,所以我想在特定端口上创建一个服务器,说默认值,然后在port上侦听。 我将如何做到这一点?我发现这篇文章讨论的是类似的内容,但是我并不是真的想要创建一个初始化脚本来执行此操作。 问题答案: 启动redis-server并为“ port”提供一个不同的参数,可以在命令行中完成: 例如,您也可以这样做,以便在启动时进行。