2011-11-13 10 views
5

私は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はスティッキーサービスを殺す可能性があります。サービスを終了すると、アプリケーションが誤動作する原因となり、そのことができません。

答えて

7

私はSTARTSERVICEを呼び出すと、それに結合していても、何もサービスインスタンスがすることを保証しませんアプリケーションが実行されている間は存在します。

正しいです。

リソースが少ない場合、Androidはスティッキサービスを強制終了できます。

も正しく入力してください。 「固定」とは、Androidがサービスを再起動する可能性があることを意味します。

サービスを強制終了すると、アプリケーションが誤動作する可能性があります。そのサービスは無効です。

永遠に動作することが保証されたサービスを作成することは不可能です。初心者のために、ユーザーは無意味なサービスを永遠に実行する開発者を嫌うので、いつでもいつでもサービスを取り除くことができます。永遠のサービスを書くことはごくわずかな場合にのみ必要です。それ以外の場合は、ちょっとしたプログラミングです。

私が見ることができる唯一の解決策は、サービスにシングルトンを使用することです。そしてそれは本当にAndroidサービスである必要はなく、誰もがアクセスできるインスタンスです。それはAndroidでぶつかるのですか?

シングルトン(a.k.a.、静的データメンバー)は、処理が終了すると消え去ります。最終的にプロセスは終了します。特に、アクティブなサービスがなく、あなたの活動のどれもが前景にない場合には...

+0

ありがとう、Commonware。アプリケーションのプロセスが起動して実行されている間にコンポーネントを実行する必要があります(ユーザーが使用しています)。ユーザーがアプリケーションを終了すると、コンポーネントはシャットダウンすることもできます。その唯一の目的は、プロセス内で非同期的なUI関連のタスクを調整することです。 定期的にサーバのアップデートをチェックするサービスが必要です(私はまだC2DMを決めていません)。ポーリング後にシャットダウンする短命のサービスとして実装します。 – zmbq

0

永続的なサービスを作成する必要があります。 this manualを参照してください。

bindServiceに電話しないでください。startServiceに電話してください。

1

startServiceを呼び出し、onStartCommandでSTART_STICKYを返します。それはサービスを続けるべきです。

あなたはまた、フォアグラウンドサービスを検討することもできます。

http://developer.android.com/reference/android/app/Service.html#startForeground(int、android.app.Notification)

+0

編集されたテキストを参照してください。 – zmbq

+0

私は同じようにしましたが、アプリがバックグラウンドで殺されたときは動作しませんでしたか? –

関連する問題