2016-06-13 13 views
1

の2つのサービス間の通信状況:アンドロイド:二つの別々のAPK

私はすべての時間を実行することになってServiceとAndroidのシステムアプリケーション(永続的な)を持っています。

Serviceという別のアプリケーション(システムアプリケーションではない通常のアプリケーション)があります。しかし、このServiceは、リソースが必要な場合、Android OSがそれを強制終了するため、実行されるか実行されない可能性があります。

簡潔に言えば、同じ証明書で署名できる2つのアプリケーション(したがって2つのAPK)があります。 (だから彼らは、同じプロセスを右に実行できる?)

私はサービスAがイベントをlisten

を達成しようとするどのような。それがイベントを受信したとき、私はサービスAが戻ってサービスAに2つのサービスは、私が聞かせでき

を伝えてみましょうする

アプローチを応答を与える必要があり、通常のアプリケーション(サービスB)を呼び出したいですそれらは、使用して通信:

(複雑なオブジェクトを渡すことは必須であるため、最適ではない)
  • メッセージング(AIDLを使用して)結合します

    問題

    • 通信する方法は説明した場合のために、「最高」ですか?
    • サービスAがサービスBにメッセージを委任/送信し、サービスBが実行されない場合はどうなりますか?それはサービスBからの応答を得なければなりません。サービスAがそれを呼び出そうとしているときにサービスBが起動していないと、私はいつもサービスBを起動する必要がありますか?

    ありがとうございます!

  • +0

    からの応答をしたいので、良いオプションになります[この](http://stackoverflow.com/a/33688843/2252830) – pskink

    答えて

    2

    どのように通信するかは、説明されたケースの「最高」ですか?

    "Aidl"と "Binding"は同じものなので、2つのオプションだけを挙げます。 AIDLを使用して、クロスプロセス・サービス・バインディングのためのクライアント・サイド・プロキシおよびサーバー・サイド・スタブを記述および実装します。

    コールアンドレスポンスが必要な場合は、おそらくバインディングが適しています。ただし、Parcelable,Serializableを使用したり、オブジェクトグラフをJSONなどに変換したりすることを除いて、 "複雑なオブジェクト"をサポートするIPCアプローチはありません。

    サービスAがサービスBにメッセージを委任/送信したい場合、サービスBが実行されていない場合はどうなりますか?あなたが方法(そのonCreate()呼び出す)をアプリケーションBのためのプロセスstartService()またはbindService()、Androidのフォークを呼び出し、サービスのインスタンスを作成します

    。この時点で、プロセスとサービスがすでに実行されていた場合と同じ動作になります。

    +0

    有益なお返事ありがとうございます - 私はそれを感謝します!したがって、サービスをバインドし、APIを記述するためにAIDLを使用しますか? – sjkm

    +0

    @sjkm:はい。通常のメソッド呼び出しのような同期応答が必要な場合は、AIDLインターフェイスにメソッドの戻り値を定義させます。非同期応答が必要な場合は、サービスBとAから渡されるコールバックオブジェクトの両方にAIDLを定義し、AIDL定義のメソッドでコールバックオブジェクトのインスタンスを渡します.Bはそれを使用してメソッドを呼び出しますonのAコールバックを使用して非同期の結果を提供します。コールバックアプローチの例については、[このサンプルアプリケーション](https://github.com/commonsguy/cw-omnibus/tree/master/Binding/Callback)を参照してください。 – CommonsWare

    +0

    ありがとうございました!それは素晴らしいようです。私は明日それをもっと深く見ていきます。素敵な夜をお過ごしください。 – sjkm

    0

    サービスAを含むアプリケーションがシステムアプリケーションの場合、これら2つのアプリケーションを同じ証明書でどのように署名することができますか?

    プラットフォーム証明書にアクセスできますか?

    とにかくAIDLあなたがそれに高速かつ複雑なデータ参照を渡すことにしたい場合は、サービスB

    +0

    プラットフォームアプリケーションをシステムアプリケーションにするために、プラットフォーム証明書でアプリケーションに署名する必要はありません。単に "/ system/app"/"system/priv-app"フォルダにインストールする必要があります... – sjkm

    関連する問題