9

Android での開発中にこのやや奇妙な動作に遭遇し、グーグル検索中に見つけた唯一の答えは、これは設計によるものであり、気にする必要はないということでした。

私のアプリケーションはアクティブなときに位置データをフェッチします。onPause イベントが呼び出されたときに位置情報の更新を停止し、後で onResume イベントが呼び出されたときにフェッチを再開することでバッテリーを節約する方法を実装しようとしていました。

デバッグ中に、電話をロックすると、onPause->onResume が 3 回以上次々に呼び出され、onStop イベントで終了するという奇妙な動作に気付きました。私が見つけることができた唯一の答えは次のようなものでした:それがアンドロイドの仕組みです、気にしないでください。

単純なサブアクティビティを数回停止して再開する必要があることを誰かが説明してくれますか? 特に onResume に深刻なコードを含む大規模なアクティビティの場合、バッテリーの消費量が増えませんか? これを防ぐ方法はありますか?不要な CPU サイクルを防止する if{} ブロックを使用して、少なくともこれらのイベントでコードが呼び出されないことを知っていれば幸いです。

どんな洞察も大歓迎です!

4

2 に答える 2

1

「スクリーン タイムアウト」および「スクリーン ロック」イベントを処理するには、ブロードキャスト レシーバーを登録する必要があります。

データの取得を停止するだけです。サンプルコード:

public class ScreenReceiver extends BroadcastReceiver {     

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
                //screen locked, do here 
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                //screen unlocked, do something here
            }
        }

}

この ScreenReceiver クラスのブロードキャスト レシーバを androidMenifest.xml に登録する必要があります。

于 2012-07-05T18:02:42.917 に答える
0

最近同じ問題が発生し、マニフェストファイルのアクティビティの構成変更を操作することで問題の発生を防ぐことができました。ユーザーがデバイスをロックすると、向きが変わったり、画面サイズが変わったり(ナビゲーションバーや通知バーが消えた場合)など、Androidがすべてのアクティビティとフラグメントを再構築する可能性があると思います。Configの変更で多くのオプションを選択することになり、onPauseの後にonResumeの呼び出しを停止しました。

于 2013-02-07T04:10:51.880 に答える