1

クラスMLocationで次のように宣言されているAndroidウィジェットにロケーションリスナーがあります。

プライベート静的MyLocationListenerlocationListener;

ウィジェットはサービスを開始し、サービスはMLocationクラスを作成します。MLocationクラスは、作成時にロケーションリスナーを作成して登録します。

電話がスリープするまで、すべてが正常に機能します。電話がスリープ状態になると(スリープ状態からしばらくすると)、Androidはサービスとそれによって作成されたすべてのクラス(MLocationも)を強制終了します。電話のロックを解除すると、Androidはサービスを再作成し、MLocationクラスなどを作成します。電話のスリープ中、場所は変更をリッスンしなくなります(強制終了されたため)。電話がスリープしている場合でも、ロケーションリスナーを存続させる方法はありますか?

4

3 に答える 3

0

電話がスリープしている間、位置を追跡したい場合は、部分的なウェイクロックが必要です。ユーザーが電源ボタンを押しても、基本的に電話がスリープ状態にならないようにしているため、バッテリーがすぐに消耗します(ただし、画面はオフのままです)。

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();

マニフェストを介してその許可をリクエストする必要があります。マニフェストはGooglePlayに表示されるため(アプリを配置する場所であると想定)、上級ユーザーはその影響を知っておく必要があります。

ここで、どこでも読む内容を説明します。部分的なウェイクロックの使用は避けてください。バッテリーが切れて、人々はそれを嫌うからです。

OTOH、あなたのアプリケーションが絶対にそれを必要とするならば、これはそれがどうあるべきかということになるでしょう。

于 2012-10-12T14:09:05.377 に答える
0

いいえ。電話がスリープ状態になると、基本的にCPUをシャットダウンしないため、アプリケーションは実行されません。電話がスリープしているときに位置の変更をリッスンする必要がある場合は、ウェイクロックを取得して、電話がスリープしないようにする必要があります。これを行うと、バッテリーがすぐに使い果たされ、ユーザーがアプリケーションをアンインストールすることに注意してください。

于 2012-10-12T14:05:01.140 に答える
0

あなたはあなただけに頼るべきですLocationListener、あなたはあなたのアプリケーションのすべての構造を「再考」する必要があります。おそらくLocationChangedReceiver、実際の場所の他のソースと一緒に、を登録することは良い選択でしょう。

詳細については、@ Reto Meierによるこのすばらしい記事をご覧ください:Androidのロケーションを深く掘り下げます。

于 2012-10-12T14:11:51.133 に答える