2011-02-03 14 views
1

私は、アクティビティ(UI)とサービス(バックグラウンドポーリング)を持つアンドロイドアプリを持っています。 2つはAIDLを使って複雑に接続されています(コールバックを含むので、デュプレックス通信、IPCなど)。AIDL - 何がポイントですか?

私はいつも2つの話をしています。

しかし、2つの共通データオブジェクトを共有できるように、Applicationクラスも拡張しました。したがって、アプリケーションは、サービスが常に使用しているUserオブジェクトを保持しています。また、アクティビティは実行中にアクセスすることもできます。

このアプリケーションはUI更新をトリガすることがあるため、(コンテキストリークを避けるために)アクティビティに対する弱い参照もあります。

だから、

Activity (UI) ---> Application <--- Service

ように私は、だから私はそれを得ることはありません

_app = (FooApplication)this.getApplication(); 
FooActivity uiRef = _app.getUIReference().get(); 
if (uiRef != null) { 
    uiRef.updateSomeDisplay(); 
} 

を行うことによって、サービス内UIイベントをトリガすることができます見えます。 UIを弱く参照し、存在するかどうかを確認し、そのメソッドを呼び出すときに、複雑なAIDL呼び出しを行うのはどうしてかと思います。

答えて

0

AIDLのポイントは、プロセス間通信を可能にすることです。サービスのポイントは、バックグラウンド操作をUIスレッドとは別のプロセスで実行できるようにすることで、アプリケーションを終了しても実行を継続できるようにすることです。サービスはUIとはまったく異なるプロセスで実行されるため、AIDLが必要になるため、サービスプロセスのUIプロセスでメモリにアクセスすることはできません。

+0

です。私はちょっと同じ考えを結びつけていて、自分自身を編集するために戻ってきました。別のプロセスがある場合、スタンドアロンのサービスプロセスはAdvanced Task Killerに表示されませんか?これはリスティングアクティビティに限定されていますか? – paulpooch

+0

私は、昨年、Android 2.1から4.1.2までのあらゆる種類のデバイスで複数のアプリケーションでバックグラウンドサービスを使用していましたが、これまで定義されていたユーザーインターフェイスとは別のプロセスでサービスを実行したことは一度もありませんでした。 apkファイル。ドキュメントには、「アプリケーションコンポーネントが起動し、そのアプリケーションのプロセスが存在する場合(アプリケーションの別のコンポーネントが存在するため)、そのプロセス内でコンポーネントが起動され、同じ実行スレッドが使用されます。はい、あなたはこれをしないように伝えることはできますが、あなたはなぜそうなるのでしょうか? – Jules

+0

これを行う理由の1つの例は、バックグラウンドオーディオサービス用です。プレーヤを別のプロセスで実行させると、オーディオ再生中にUIスタック全体がメモリに残る必要がないため、メディアプレーヤーアプリのメモリ効率が向上します。しかし、それはAIDLを使用するためにかなり複雑になります。したがって、ほとんどの場合、それは価値がありません。 –

関連する問題