0

サービスから更新されているウィジェットがあります。その後、ユーザーが画面をオフにすると、サービスが停止し、ユーザーがデバイスを起動してもウィジェットの更新が再開されません。私の質問に続きますが、ユーザーがデバイスを起動したときにサービスを「再起動」する方法はありますか? 画面がロックされているときにサービスを継続できることはわかっていますが、その場合、バッテリーが大量に消耗すると思います...たくさんグーグルで検索しましたが、何も見つかりませんでした...

前もって感謝します!

編集:わかりました、これは奇妙です!どういうわけかそれが自動的に行われるようになったので、現在は機能しています! とにかくありがとう!

編集 2: または、サービスを停止するのは画面ロックではないと思います。電話を使用すると、クラッシュ ダイアログが表示されずにランダムに停止することがあります。それを修正する方法を知っている人はいますか?

4

2 に答える 2

1

はい、これは可能です!

ユーザーが画面をオフにすると、あなたが処理する必要がありますBroadCast Receiverhttp://developer.android.com/reference/android/content/BroadcastReceiver.html

  • サービスを停止するためのそのハンドル & サービスが停止し、ウィジェットを更新するために停止し、

  • ユーザーがデバイスを起動すると、ブロードキャストの受信を開始してウィジェットを更新する必要があります。

より多くのバッテリーを節約するのが最善のアイデアだと思います。

詳細については、このリンクを参照してください

于 2013-01-12T10:14:30.140 に答える
1

通常、ウィジェットの場合、サービスを常に実行し続けることは意味がありません。通常、ウィジェットは定期的に更新されます。

これを行い、バッテリー効率を高める最も簡単な方法は、 setAlarmInexactRepeating を使用してインテントをスケジュールするAlarmManagerことです

トリガー時間の要件が不正確な繰り返しアラームをスケジュールします。たとえば、1 時間ごとに繰り返されるアラームですが、毎正時になるとは限りません。これらのアラームは、setRepeating(int, long, long, PendingIntent) によって提供される厳密な繰り返しよりも電力効率が高くなります。これは、システムがアラームのフェーズを調整してアラームを同時に発生させ、デバイスが必要以上にスリープ状態から復帰するのを回避できるためです。

インテントは、BroadcastReceiver をトリガーする必要があり、これがサービスをトリガーしてウィジェットを更新する必要があります。を使用するIntentServiceことは、通常、そのための良い選択です。

インテント スケジューリングをさらに制御する必要がある場合は、サービスがウィジェットの更新を終了したときにアラームを自分で設定し、RTCまたはELAPSED_REALTIMEアラームのタイプとして提供することもできます。デバイスがスリープ状態の場合、どちらのタイプもデバイスを起動しません。デバイスがスリープ状態ではない (ただしロックされている) 場合、デバイスを目覚めさせた他のイベントに効果的にピギー バックします。

デバイスのロックが解除されたらすぐに更新する必要がある場合は、ACTION_USER_PRESENTブロードキャストが必要かもしれませんが、定期的な更新のスケジュールに追加して実装することをお勧めします。

于 2013-01-12T11:08:24.220 に答える