質問: startServiceで起動したサービスがActivityと同一プロセスで動作する前提であれば、 サービスとActivityのデータのやりとりはバインド等の煩雑な方法を利用せずに、 android.app.Applicationインスタンスをグローバル変数的に利用して良いのでしょうか? 言い換えると、サービスが実行中であれば必ずそのベースとなるApplicationインスタンスが存在するのでしょうか? Androidの一般的な作法が判っていないので見当違いなことを言っているかもしれませんが、 回答いただけると大変助かります。 よろしくお願いいたします。
回答: > > アプリケーション コンポーネントが開始し、アプリケーションに他に実行中のコンポーネントがない場合、Android システムは実行用のシングル スレッドを持つアプリケーション用の新しい Linux プロセスを開始します。 > > > プロセスとスレッド > > > Androidのコンポーネント、 * `Activity` * `BroadcastReceiver` * `ContentProvider` * `Service` のいずれかが動作すると、Androidシステムはアプリケーションプロセスを開始します。このとき、`android.app.Application`インスタンスの`onCreate()`が呼び出されます。 ですので、 > > サービスが実行中であれば必ずそのベースとなるApplicationインスタンスが存在するのでしょうか? > > > という問いに対しては、「必ず存在する」が答えとなります。 ただしプロセスはOSによって殺されるため、`Application`は短命なデータストアとして、スレッドセーフな設計で作る必要があると思います。また、同じデータを読み取ることはできますが、通信的なことはできません。 `Activity`が書き込んだ値を`Service`で読み取るというような単純なことは実現できますが、それであれば`Intent`に`data`を持たせてもいいわけです。 逆に`Service`が書き込んだ値を`Activity`が読み取るには、いつ`Service`の処理が終わったのかを`Activity`が判断できない(それであれば、`BroadcastReceiver`でデータの受け渡しを行った方が良い)ですし、先に述べた通り`Application`プロセスがOSに殺されて、`Service`がセットした値が失われている可能性があります。