4

だから、私はアンドロイドAIDLのドキュメントを読み、RPCがアクティビティとサービスの間でどのように機能するかについての一般的な考えを持っています。ただし、私のアプリケーションでは、そのような機能を実装するのはやり過ぎのようです。基本的に、サービスに優れたハンドラーを渡して、そのスレッドがデータをアクティビティに渡すことができるようにします。現在、静的パブリックメンバー(ハック)を使用してこれを回避していますが、サービスの開始インテントでHandlerオブジェクトを渡すことをお勧めします。たとえば、作成時にintをサービスに簡単に渡すことができます。

int x = 0;
Intent svc = new Intent(this, MyService.class);
svc.putExtra("x",x);
startService(svc);

ただし、ハンドラーはシリアル化できないため、単純な静的メンバーハックなしでハンドラーをサービスに渡す方法を見つけられませんでした。何か洞察はありますか?または、それを吸い上げてサービスに対して正式なRPCを実行する必要がありますか?

4

2 に答える 2

4

Service と Activity が同じプロセスにある場合、複雑な RPC 処理を行うことなく Service から Binder を渡すことができます。

public class MyEasyButNotGoodPracticesBinder {
    public void gimmeHandler(Handler handler) {
        // you got it!
    }
}

IBinder mBinder = new MyEasyButNotGoodPracticesBinder();

public IBinder onBind(Intent intent) {
    return mBinder;
}

その後、Activity で IBinder オブジェクトを取得したら、それを a にキャストしてメソッドMyEasyButNotGoodPracticesBinderを呼び出しますgimmeHandler(Handler)。サービスがクラッシュした場合にプロセス全体がクラッシュしないように、サービスを別のプロセスに配置したい場合、これは壊れてしまうため、これは悪い習慣だと思います。それも将来性があるとは思えません。しかし、それは機能します。

AIDL インターフェースはそれほど難しくありません。代わりに AIDL インターフェースを使用したいだけかもしれません。

于 2009-08-09T22:38:17.147 に答える
2

Android のドキュメントでは、リモート メッセンジャー サービスのサンプル: リモート メッセンジャー サービスのサンプルでクライアント インターフェイスとしてメッセンジャーを使用することを提案しています。

コード例は上記のリンクにあります。ここに再投稿する必要はありません...

よろしく、マイケル

于 2010-12-03T09:13:36.360 に答える