2016-10-22 11 views
0

私はストリーミングミュージックアプリケーションを作成しますが、音楽サービスを別のプロセスで実行しようとするまでは問題ありません。 Androidデベロッパーのservice次、私はここのようにマニフェストにサービスのプロセスを追加しました:音楽サービスを別のプロセスで実行する方法

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

bindServiceがに呼び出します:

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

はその後MainActivityに私は、開始サービスを呼び出します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 Dance Musicは停止しました」、スタックトレース:「致命的な例外:メインjava.lang.ClassCastException:android.os.BinderProxyをcom.xiKy.mxMusic.MyPlayerにキャストできません。 android.app.LoadedApk $ ServiceDispatcher.doConnected(LoadedApk.java:1097) android.app.LoadedApk $ ServiceDispatcher $ RunConnection.runの$ MusicBinderをcom.xiKy.mxMusic.MainActivity $ 3.onServiceConnected(MainActivity.java:356)に追加しました。 (LoadedApk.java:1114) android.os.Handler.handleCallback(Handler.java:615) (android.os.Handler.dispatchMessage(Handler.java:92)) (android.os.Looper.loop .java:137) android.app.ActivityThread.ma (ActivityThread.java:4823) at java.lang.reflect.Method.invokeNative(ネイティブメソッド) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os .ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:789) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) at dalvik.system.NativeStart.main(ネイティブメソッド) ClassLoader.loadClass :

Thread.getContextClassLoader()が返すクラスローダーは、複数のアプリケーションをホストするプロセスで失敗することがあります。コンテキストクラスローダを明示的に指定する必要があります。次に例を示します。Thread.setContextClassLoader(getClass()。getClassLoader());

そして私は、行削除する場合:アプリケーションがクラッシュしていない

bindService(_playIntent, musicConnection, Context.BIND_AUTO_CREATE); 

を。このバグを修正するには?みんなから助けてくれてありがとう。

+0

「logcatで検索してください。エラーが表示されます」 - これはエラーであることはわかりません。 "その後、この行の後でアプリケーションが機能しなくなる" - 「停止する」という意味を説明してください。あなたのアプリがクラッシュしている場合、LogCatにJavaスタックトレースがあります:https://stackoverflow.com/questions/23353173/unfortunately-myapp-has-stopped-how-can-i-solve-thisスタックトレース、あなたの質問を編集し、スタックトレース全体を投稿します。 – CommonsWare

+0

編集ありがとう、ありがとうCommonsWare – Xiky

答えて

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

これは、ローカルバインドサービスでのみ機能します。あなたがリモートサービスに切り替えたら:

  • あなたはAIDL
  • であなたのAPIを定義する必要があなたのサービスは、クライアントがする必要が
  • そのAIDLから生成.StubクラスのサブクラスとしてそのBinderを実装する必要がありますこのすべてがthe documentation on AIDLで覆われているAIDL

から生成されたクライアント側のプロキシにIBinderを変換するasInterface()を使用しています。

+0

ありがとうCommonsWare、あなたは素晴らしいです。 – Xiky

関連する問題