2011-01-11 17 views
3

AIDLインターフェイスで壁を張りました。私はサードパーティのアプリケーションを介して制御されなければならないアプリケーションを持っています(私は十分なコントロールを持っていますので、私は彼らの活動に必要なものを実装するように頼むことができます)2つのアプリケーション間のAIDLインターフェイス

私のアプリは、私はそれをバックグラウンドサービスに変更し、テストのために、バックグラウンドにサービスアプリを起動するダミーアプリを作成しました。

私はサービスからのメソッド呼び出し(主にstart、stop、sendData)を要求したいと思います。私は両方のアプリケーションの.aidlファイルを作成しました。他のAIDLがパッケージを除いて同じである一方、AIDLファイルは、唯一の方法(これはここではいくつかの他の質問の礼儀である。)

package foo.testapp; 
interface IScript 
{ 
    String executeScript(String script); 
} 

を実装「foo.otherapp」です。私が見つけた実装は、両方の補助ファイルで同じパッケージを持っていましたが、これはエラーの原因になります(これは私の名前空間とパッケージが嫌いなので、これはちょっとした問題です。

このメソッドを使用すると、サービスに文字列を送信し、正しいメソッドを呼び出すための定義済みの文字列を切り替えることができます(3つの異なるメソッドを実装することもできます)使い方)。

とにかく...私はAIDLを接続するために得ることができない、私はエラー「サービスの意図

{行為= foo.testapp.IScript}を開始できません取得:

が見つかりません

私はこの推測がすなわち私の誤解とは何かを持っているでしょう。パッケージ名程度)

これは私のテスト活動アプリ

で実装したものです
private final IScript.Stub mBinder = new IScript.Stub() 
{ 
    @Override 
    public String executeScript(String script) throws RemoteException 
    { 
     // TODO Auto-generated method stub 
    } 
}; 
IScript mService = null; 
private ServiceConnection mConnection = new ServiceConnection() 
{ 
    public void onServiceConnected(ComponentName className, IBinder service) 
    { 
     mService = IScript.Stub.asInterface(service); 
    } 
    public void onServiceDisconnected(ComponentName className) 
    { 
     mService = null; 
    } 
}; 

は、その後、私はこれをやるのOnCreate()メソッドで:サービスクラスで

bindService(new Intent(IScript.class.getName()), 
      mConnection, Context.BIND_AUTO_CREATE); 

私はこれを持っています。

@Override 
public IBinder onBind(Intent intent) 
{ 
    // Select the interface to return. If your service only implements 
    // a single interface, you can just return it here without checking 
    // the Intent. 
    if (IScript.class.getName().equals(intent.getAction())) 
    { 
     return mBinder; 
    } 
    return null; 
} 

/** 
* The IRemoteInterface is defined through IDL 
*/ 
private final IScript.Stub mBinder = new IScript.Stub() 
{ 
    @Override 
    public String executeScript(String script) throws RemoteException 
    { 
     if (script == "test") 
     { 
      return "foo"; 
     } 
     return "fail"; 
    } 
}; 

最後にマニフェストファイル。

実際、私は、助けを扱うときにマニフェストファイルに何かを追加しなければならないかどうか分かりません。一つの例で私はこれを見た。

<intent-filter> 
     <action android:name="foo.otherapp.IScript" /> 
    </intent-filter> 

<intent-filter> 
     <action android:name="foo.testapp.IScript" /> 
    </intent-filter> 

私はエラーがどこでもできることを推測します。私はチューインガムとバンドエイドでこれを設定しようとしていました。私はちょうどこれのいくつかの基本的な概念を誤解していると思います。

とにかく、どんな助けも歓迎します。

ありがとうございます!

答えて

3

私は厳密解を見つけたので、私は自分の質問に答えることにしました。

My Life With Android

すべては、クライアントのフォルダから

ソースがクライアントに行く(あなたがあなた自身のプロジェクトにこれを実装しようとしていると仮定した場合)のソースを貼り付け、正しくパッケージ名や関数名を変更するコピーによってだけで働いていました活動とserviceimplはサービスに行く。私は「サービス活動」は必要ないので、それをやめました(とにかく呼び出されていないようです)。

複数のリンクを投稿するほどの評判がないため、ページの上部からソースを取得できます。

「アップデート:Android SDK 1.5のアップデートされたサンプルプログラムをチェックしてください。」

1

私もこれで苦労しました。あなたはあなたの推測では、RemoteInterfaceが正しいです。aidlはサービスとテストアプリの両方で同じパッケージ名を持つ必要があります - あなたはどこに置くのですか?

Eclipseで開発している場合は、共通のソースフォルダ(両方のプロジェクト共通)を作成することです。このフォルダを両方のプロジェクトの外側とビルドプロパティ/ソースの外に作成し、[リンク元]をクリックして共通のソースの場所。 (あなたはそれを任意の名前で呼ぶことができます)これを両方のプロジェクトで行い、そこにinterface.aidlを配置します。両方のプロジェクトのパッケージエクスプローラに表示され、あるプロジェクトでそれを変更すると、もう一方が更新されます。

共通のソースフォルダには、サービスと同じ名前のパッケージにinterface.aidlを入れました。

ビルドにAntを使用している場合、デフォルトのant_rules.xmlは2つのaidlフォルダをサポートしていないため、少し面倒です。build.xmlをかなり修正して新しいターゲットを追加する必要がありますすべての依存関係私は私のプロジェクトは、サンプルを適応させることによって起こって得た

は、ここでは「ダウンロード元」から第17章を形成:

link text

+0

提案していただきありがとうございます。私は昨日これをすばやく試しましたが、まだそれを理解できませんでした。次に、パッケージ名をリファクタリングして、ユニークな.serviceと.clientと同じになるようにしました。したがって、foo.projectname.client&foo.projectname.service。これで私は厄介なバグに陥り、今では灰色の髪が多くなり、アプリケーションはエミュレータにインストールできません...エラーのある時間の70〜80%クラスが見つからず、時にはスムーズにインストールされます。開始する。だから私はあなたが投稿したソースに基づいてバインディングを書き直すと思います。結果を返し、今日はうまくいけば。 –

+0

昨日はちょっと忙しかったので、私はこのことに全く取り組みませんでした。とにかく...私は今、ワークスペースにAIDLというフォルダを作成しました。フォルダfoo.serviceを作成し、そこにinterface.aidlファイルを配置しました。また、aidlファイルのパッケージ名はfoo.serviceです。問題は、私は今これをインポートすることはできません。また、.aidlファイルをAIDLフォルダのルートに置いてみました。私は日食を使用しています。 –

+0

私はこれをかなり使い果たし、最終的にリンクしたソースからチュートリアルプロジェクトを構築しようと決めました。このチュートリアルは少なくとも直ぐには機能しませんでした(チュートリアルのようなものかどうかは、実際にリンクされている本で解決されていません)。私は現在のプロジェクトと同じ状態になっています。私は主題のビットをより多く探知し、金鉱山を打つ。別々のアプリケーション上でのコミュニケーションに関する非常に簡単で小さなチュートリアル。 http://mylifewithandroid.blogspot.com/2008/01/invoking-services.html –

関連する問題