Android Serviceの思考(4)
Androidプラットフォームでは、1つのプロセスは通常、他のプロセスのメモリ領域にアクセスできません.しかし、IDL言語を使用して、オブジェクトをオペレーティングシステムが理解できる簡単な形式に偽装し、オブジェクトが境界を越えてアクセスするように偽装することができます.
アプリケーションで他のプロセスのサービスを呼び出す場合は、AIDLが必要です.AIDL(androidインタフェース記述言語)は、1つのandroidデバイス上で実行される2つのプロセスを内部通信プロセスでインタラクティブにするためのコードを生成するIDL言語です.1つのプロセス(たとえば、1つのActivity)で別のプロセス(たとえば、1つのService)のオブジェクトにアクセスする方法が必要な場合は、AIDLを使用してこのようなコードを生成して、さまざまなパラメータを偽装して渡すことができます.
AIDLを使用する方法は次のとおりです.
1.まずIMusicServicesを生成する.aidlのサービスインタフェース、Androidは自動的に1つのStubクラスを生成して、このクラスはBInderクラスを継承して、同時にIMusicServiceというインタフェースを継承して、その中に1つのProxyエージェントクラスを含んで、遠隔エージェントを実現することを見ることができます.(aidlとStubクラスは以下の通り)
?[Copy to clipboard]
Download zuiniuwang.java
2.MyRemoteBinderではこのStubクラスを継承し、プレーヤーの制御をこのBinderクラスに書く必要がある
?[Copy to clipboard]
Download zuiniuwang.java
3.ActivityでBinderを得る方式は、StubクラスのIMusicServicesによる.Stub.asInterface(binder)メソッド
?[Copy to clipboard]
Download zuiniuwang.java
アプリケーションで他のプロセスのサービスを呼び出す場合は、AIDLが必要です.AIDL(androidインタフェース記述言語)は、1つのandroidデバイス上で実行される2つのプロセスを内部通信プロセスでインタラクティブにするためのコードを生成するIDL言語です.1つのプロセス(たとえば、1つのActivity)で別のプロセス(たとえば、1つのService)のオブジェクトにアクセスする方法が必要な場合は、AIDLを使用してこのようなコードを生成して、さまざまなパラメータを偽装して渡すことができます.
AIDLを使用する方法は次のとおりです.
1.まずIMusicServicesを生成する.aidlのサービスインタフェース、Androidは自動的に1つのStubクラスを生成して、このクラスはBInderクラスを継承して、同時にIMusicServiceというインタフェースを継承して、その中に1つのProxyエージェントクラスを含んで、遠隔エージェントを実現することを見ることができます.(aidlとStubクラスは以下の通り)
?[Copy to clipboard]
Download zuiniuwang.java
- /**
- * IMusicService.aidl
- * com.androidtest.service.mediaplayer
- *
- * Function: TODO
- *
- * ver date author
- * ──────────────────────────────────
- * 2011-5-19 Leon
- *
- * Copyright (c) 2011, TNT All Rights Reserved.
- */
-
- package com.androidtest.service.mediaplayer;
- /**
- * ClassName:IMusicService
- * Function: TODO ADD FUNCTION
- * Reason: TODO ADD REASON
- *
- * @author Leon
- * @version
- * @since Ver 1.1
- * @Date 2011-5-19
- */
-
- interface IMusicService{
- void play();
- void pause();
- void stop();
- }
-
- /*
- * This file is auto-generated. DO NOT MODIFY.
- * Original file: D:\\Backup\\�ҵ��ĵ�\\Dropbox\\investment\\A8\\workspace\\androidtest\\src\\com\\androidtest\\service\\mediaplayer\\IMusicService.aidl
- */
- package com.androidtest.service.mediaplayer;
-
- /**
- * ClassName:IMusicService Function: TODO ADD FUNCTION Reason: TODO ADD REASON
- *
- * @author Leon
- * @version
- * @since Ver 1.1
- * @Date 2011-5-19
- */
- public interface IMusicService extends android.os.IInterface {
- /** Local-side IPC implementation stub class. */
- public static abstract class Stub extends android.os.Binder implements
- com.androidtest.service.mediaplayer.IMusicService {
- private static final java.lang.String DESCRIPTOR = "com.androidtest.service.mediaplayer.IMusicService";
-
- /** Construct the stub at attach it to the interface. */
- public Stub() {
- this.attachInterface(this, DESCRIPTOR);
- }
-
- /**
- * Cast an IBinder object into an
- * com.androidtest.service.mediaplayer.IMusicService interface,
- * generating a proxy if needed.
- */
- public static com.androidtest.service.mediaplayer.IMusicService asInterface(
- android.os.IBinder obj) {
- if ((obj == null)) {
- return null;
- }
- android.os.IInterface iin = (android.os.IInterface) obj
- .queryLocalInterface(DESCRIPTOR);
- if (((iin != null) && (iin instanceof com.androidtest.service.mediaplayer.IMusicService))) {
- return ((com.androidtest.service.mediaplayer.IMusicService) iin);
- }
- return new com.androidtest.service.mediaplayer.IMusicService.Stub.Proxy(
- obj);
- }
-
- public android.os.IBinder asBinder() {
- return this;
- }
-
- @Override
- public boolean onTransact(int code, android.os.Parcel data,
- android.os.Parcel reply, int flags)
- throws android.os.RemoteException {
- switch (code) {
- case INTERFACE_TRANSACTION: {
- reply.writeString(DESCRIPTOR);
- return true;
- }
- case TRANSACTION_play: {
- data.enforceInterface(DESCRIPTOR);
- this.play();
- reply.writeNoException();
- return true;
- }
- case TRANSACTION_pause: {
- data.enforceInterface(DESCRIPTOR);
- this.pause();
- reply.writeNoException();
- return true;
- }
- case TRANSACTION_stop: {
- data.enforceInterface(DESCRIPTOR);
- this.stop();
- reply.writeNoException();
- return true;
- }
- }
- return super.onTransact(code, data, reply, flags);
- }
-
- private static class Proxy implements
- com.androidtest.service.mediaplayer.IMusicService {
- private android.os.IBinder mRemote;
-
- Proxy(android.os.IBinder remote) {
- mRemote = remote;
- }
-
- public android.os.IBinder asBinder() {
- return mRemote;
- }
-
- public java.lang.String getInterfaceDescriptor() {
- return DESCRIPTOR;
- }
-
- public void play() throws android.os.RemoteException {
- android.os.Parcel _data = android.os.Parcel.obtain();
- android.os.Parcel _reply = android.os.Parcel.obtain();
- try {
- _data.writeInterfaceToken(DESCRIPTOR);
- mRemote.transact(Stub.TRANSACTION_play, _data, _reply, 0);
- _reply.readException();
- } finally {
- _reply.recycle();
- _data.recycle();
- }
- }
-
- public void pause() throws android.os.RemoteException {
- android.os.Parcel _data = android.os.Parcel.obtain();
- android.os.Parcel _reply = android.os.Parcel.obtain();
- try {
- _data.writeInterfaceToken(DESCRIPTOR);
- mRemote.transact(Stub.TRANSACTION_pause, _data, _reply, 0);
- _reply.readException();
- } finally {
- _reply.recycle();
- _data.recycle();
- }
- }
-
- public void stop() throws android.os.RemoteException {
- android.os.Parcel _data = android.os.Parcel.obtain();
- android.os.Parcel _reply = android.os.Parcel.obtain();
- try {
- _data.writeInterfaceToken(DESCRIPTOR);
- mRemote.transact(Stub.TRANSACTION_stop, _data, _reply, 0);
- _reply.readException();
- } finally {
- _reply.recycle();
- _data.recycle();
- }
- }
- }
-
- static final int TRANSACTION_play = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
- static final int TRANSACTION_pause = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
- static final int TRANSACTION_stop = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
- }
-
- public void play() throws android.os.RemoteException;
-
- public void pause() throws android.os.RemoteException;
-
- public void stop() throws android.os.RemoteException;
- }
2.MyRemoteBinderではこのStubクラスを継承し、プレーヤーの制御をこのBinderクラスに書く必要がある
?[Copy to clipboard]
Download zuiniuwang.java
- /**
- * MyRemoteBinder.java
- * com.androidtest.service.mediaplayer
- *
- * Function: TODO
- *
- * ver date author
- * ──────────────────────────────────
- * 2011-5-19 Leon
- *
- * Copyright (c) 2011, TNT All Rights Reserved.
- */
-
- package com.androidtest.service.mediaplayer;
-
- import android.media.MediaPlayer;
- import android.os.Binder;
- import android.os.RemoteException;
-
- /**
- * ClassName:MyRemoteBinder
- * Function: TODO ADD FUNCTION
- * Reason: TODO ADD REASON
- *
- * @author Leon
- * @version
- * @since Ver 1.1
- * @Date 2011-5-19
- */
- public class MyRemoteBinder extends IMusicService.Stub{
-
- public MyRemoteBinder(MediaPlayer mediaPlayer){
- MyMediaController.mediaPlayer=mediaPlayer ;
- };
-
- @Override
- public void play() throws RemoteException {
-
- // TODO Auto-generated method stub
- MyMediaController.play.execute();
-
- }
-
- @Override
- public void pause() throws RemoteException {
-
- // TODO Auto-generated method stub
- MyMediaController.pause.execute();
-
- }
-
- @Override
- public void stop() throws RemoteException {
-
- // TODO Auto-generated method stub
- MyMediaController.stop.execute();
-
- };
-
- }
3.ActivityでBinderを得る方式は、StubクラスのIMusicServicesによる.Stub.asInterface(binder)メソッド
?[Copy to clipboard]
Download zuiniuwang.java
- private ServiceConnection myServiceConnection = new ServiceConnection() {
-
- @Override
- public void onServiceConnected(ComponentName name, IBinder binder) {
- musicServiceInterface = IMusicService.Stub.asInterface(binder);
- Log.d(TAG, " onServiceConnected");
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- musicServiceInterface = null;
- Log.d(TAG, " onServiceDisconnected");
- }
-
- };