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>
私はエラーがどこでもできることを推測します。私はチューインガムとバンドエイドでこれを設定しようとしていました。私はちょうどこれのいくつかの基本的な概念を誤解していると思います。
とにかく、どんな助けも歓迎します。
ありがとうございます!
提案していただきありがとうございます。私は昨日これをすばやく試しましたが、まだそれを理解できませんでした。次に、パッケージ名をリファクタリングして、ユニークな.serviceと.clientと同じになるようにしました。したがって、foo.projectname.client&foo.projectname.service。これで私は厄介なバグに陥り、今では灰色の髪が多くなり、アプリケーションはエミュレータにインストールできません...エラーのある時間の70〜80%クラスが見つからず、時にはスムーズにインストールされます。開始する。だから私はあなたが投稿したソースに基づいてバインディングを書き直すと思います。結果を返し、今日はうまくいけば。 –
昨日はちょっと忙しかったので、私はこのことに全く取り組みませんでした。とにかく...私は今、ワークスペースにAIDLというフォルダを作成しました。フォルダfoo.serviceを作成し、そこにinterface.aidlファイルを配置しました。また、aidlファイルのパッケージ名はfoo.serviceです。問題は、私は今これをインポートすることはできません。また、.aidlファイルをAIDLフォルダのルートに置いてみました。私は日食を使用しています。 –
私はこれをかなり使い果たし、最終的にリンクしたソースからチュートリアルプロジェクトを構築しようと決めました。このチュートリアルは少なくとも直ぐには機能しませんでした(チュートリアルのようなものかどうかは、実際にリンクされている本で解決されていません)。私は現在のプロジェクトと同じ状態になっています。私は主題のビットをより多く探知し、金鉱山を打つ。別々のアプリケーション上でのコミュニケーションに関する非常に簡単で小さなチュートリアル。 http://mylifewithandroid.blogspot.com/2008/01/invoking-services.html –