2017-03-17 9 views
1

ここで私はiamがコードを書いている間に答えが見つからないという基本的な質問をしたいと思います。Android:Singleton Instance vsサービス

私が理解しているように、アプリケーションonCreate()でシングルトンインスタンスを作成することは、アンドロイドサービスよりも脆弱です。私のアプリケーションでは、私は破壊される可能性が低いはずの位置更新を聞きたい。私がサービスを維持すると、メモリが足りなくなっても殺されるかもしれませんが、アプリケーションはバックグラウンドで実行され、インスタンスを保持します。だから私はサービスよりむしろシングルトンのインスタンスに行きたいと思っています。

正しいアプローチですか?

+0

シングルトンがあなたの活動が破壊された直後、私はむしろサービスにとどまる – mayosk

+0

@mayoskが、それはそうで殺されます?を参照してください。私は、たとえ私が単一のインスタンスを作成しても、それが殺されるとは思わない。しかし、とにかく私はアプリケーションonCreate()のみを作成したいと思います。 – sd33din90

+0

あなたのシングルトンの作成方法でテストを行います。毎分のログを作成し、あなたのアプリが見えるときに試してみてから、アプリの外に出てチェックしてください。 – mayosk

答えて

0

あなたが私の意見を聞いたら、私はお勧めしません。両方ともバックグラウンドでユーザーのバッテリーを吸うからです。

私が行うことは、主なアクティビティのフォアグラウンドでのみ位置更新を取得することです。また、アンドロイドデフォルトの実装ではなく、GoogleのプレイサービスFusedLocationProviderを使用するようにしてください。

アプリがバックグラウンドになると、場所の更新を削除します。すべてのガイドラインはアンドロイドデベロッパーサイトにあります。

https://developer.android.com/training/location/receive-location-updates.html

+0

しかし、私のアプリケーションでは、アプリがバックグラウンドであっても位置更新を聞きたいです。私は電池が主な関心事だと知っていますが、私のアプリにとってはごくわずかです。 – sd33din90

0

ベストプラクティスはApplicationクラスのシングルトンインスタンスを作成しています。

ServiceまたはActivityが存在するため利用可能になります。

Foreground Serviceも使用できますが、メモリが不足している場合は無効になります。

また、アプリケーションクラスのメモリ不足イベントやサービスのonDestroyを処理し、データをSharedPreferencesにシリアル化することができます。 START_STICKYサービスはできるだけ早く再開されます。

0

あなたの問題は、コンポーネントを24 x 7で365に管理して場所を管理することにあります。

サービスは、onStartCommandから返されたフラグを管理することによって破棄された場合に備えて、再開するように保守することができます。 START_STICKYなど。

はもっとここを読む:あなたの説明に基づいて https://developer.android.com/reference/android/app/Service.html#START_STICKY

+0

アプリが低メモリで実行されていてもアプリケーションが実行中である可能性がある場合、スティッキサービスも破棄されます。 – sd33din90

+0

これはAndroidによって再起動されるものとします。また、再配信の意図を使用してデータを戻すこともできます... – Ishant

0

を私はフォアグラウンド・サービスを取ることを示唆しています。ユーザーの場所を追跡するには、たくさんのバッテリーを使います。だからあなたのユーザーは、あなたのアプリがまだ稼働しているという事実を常に意識しているべきです。

また、システムがあなたのアプリをそのように殺すのを防ぐこともできます。

フォアグラウンドサービスは Source

3

Androidができます(とします)背景を殺すメモリ上のユーザーが の積極的認識しており、低殺すためにシステムの候補ではないサービスです低リソース状況でのプロセス、(特に、バッテリやメモリリソースを節約するためにローエンドのデバイスで)必要とする場合があるためです。それはあなたのアプリケーションをホストしているOSプロセスを殺すことによってこれを行います。この場合、アプリはバックグラウンドで実行されなくなるため、Application.onCreate()に作成したシングルトンはなくなります。

Androidはあなたのシングルトンについて何も知らないので、それを復元する理由はありません。

あなたはonStartCommand()からServiceとそのService戻りSTART_STICKYを作成する場合は、これはあなたのServiceはすべての時間(可能な場合)を実行したままに望んでいることのAndroidに伝えます。この場合、AndroidがServiceをホストしているOSプロセスを強制終了した場合(リソースの制約や理由だけで)、Androidは自動的にServiceを再起動します(AndroidはあなたのServiceを知っていて、時間)。これを行う正しい方法です。

注:0120-一部のデバイス(特にXiaomi、Huawei、LG、Lenovoなどの中国語デバイス)は、STICKYサービスを自動的に再起動しません。これらのデバイスはバックグラウンドで実行できる「保護されたアプリ」または「特権付きアプリ」のリストを維持し、AndroidはこのリストにあるアプリケーションのSTICKYサービスのみを再起動します。あなたは、このリストにあなたのアプリを追加する手をで手に入れる必要があります。これらのデバイスのこのリストにプログラムをプログラムで追加する方法はありません。

https://stackoverflow.com/a/42120277/769265https://stackoverflow.com/a/41369032/769265

関連する問題