私はAndroidアプリを持っています。アクティビティでは、バックグラウンドで実行される長時間実行される操作が発生します。これらの操作は、実行されるとアクティビティと相互作用します。私は、Activity/Long-Running-Taskカップリングを処理するコンポーネントを開発しており、破壊され再作成されたアクティビティを処理しています。長持ちのAndroid 'service'
今、そのコンポーネントはAndroidサービスとして実装されています。アクティビティはbindServiceを呼び出し、結果のIBinderを使用してタスクを開始および追跡します。私はstartServiceを使用しないことに決めました。なぜなら、私はJavaインターフェイスを通してより豊かなAPIを可能にしたいからです。
今問題です。アクティビティAが起動し、サービスにバインドし、serviceApi.runTask(...)を呼び出します。次に、アクティビティAは破棄され(たとえば、ユーザが電話を反転させるため)、アクティビティA 'として再作成されます。 A 'はサービスに再度バインドし、その存在を宣言し、すべてがうまく動作するはずです。
私のサービスが破壊されることを除いて。アクティビティAが破棄されると、アクティビティAはサービスからバインド解除されます。 Androidはこれ以上クライアントが存在しないと判断し、サービスを停止します。アクティビティA 'が作成されると、サービスが再び作成され、古いサービスのすべてが失われます。
私が見ることができる唯一の解決策は、サービスにシングルトンを使用することです。そしてそれは本当にAndroidサービスである必要はなく、誰もがアクセスできるインスタンスです。それはAndroidでぶつかるのですか?この問題に適合するより良いデザインがありますか?
Editted:私はSTARTSERVICEを呼び出すと、それに結合していても、何もサービスインスタンスがある限り、アプリケーションが実行されているとして存在することを保証しません。リソースが少ない場合、Androidはスティッキーサービスを殺す可能性があります。サービスを終了すると、アプリケーションが誤動作する原因となり、そのことができません。
ありがとう、Commonware。アプリケーションのプロセスが起動して実行されている間にコンポーネントを実行する必要があります(ユーザーが使用しています)。ユーザーがアプリケーションを終了すると、コンポーネントはシャットダウンすることもできます。その唯一の目的は、プロセス内で非同期的なUI関連のタスクを調整することです。 定期的にサーバのアップデートをチェックするサービスが必要です(私はまだC2DMを決めていません)。ポーリング後にシャットダウンする短命のサービスとして実装します。 – zmbq