私はAIDLインターフェースで壁全体を突き刺しました。サードパーティのアプリケーションを介して制御する必要のあるアプリがあります(これを十分に制御できるので、必要なものをアクティビティに実装するように依頼できます)
もともと私のアプリはインターフェースとすべてを備えたアクティビティでしたが、バックグラウンドサービスに変更し、テストのために、サービスアプリをバックグラウンドで開始するためのダミーアプリを作成しました。
ここで、サービスからのメソッド呼び出しを要求する方法が必要です(主に、start、stop、sendData)。両方のアプリの.aidlファイルを作成しました。aidlファイルは1つのメソッドのみを実装します(これは、ここでの他の質問の礼儀です)。
package foo.testapp;
interface IScript
{
String executeScript(String script);
}
パッケージが「foo.otherapp」であることを除いて、他の援助は同じです。私がオンラインで見つけた実装には、両方のaidlファイルに対して同じパッケージがありましたが、これはエラーを引き起こします(名前空間とパッケージが嫌いなので、これは私の側の問題だと思います。それらを変更します、私はそれを行うことができます)
計画では、このメソッドを使用して文字列をサービスに送信し、事前定義された文字列を切り替えて正しいメソッドを呼び出すだけでした(使用法が改善されれば、3つの異なるメソッドを実装することもできます)。
とにかく...エイドルを接続できません。「サービスインテントを開始できません」というエラーが表示されます。
{act = 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>
エラーはどこにでもあると思います。私はこれをチューインガムとバンドエイドでセットアップしようとしてきました。私はこれのいくつかの基本的な概念を誤解したと思います。
とにかく、どんな助けでも大歓迎です。
前もって感謝します!