21

情報: 私のデバイスは 2.2 の Nexus One で、1.5 と 2.1 の 2 つのプロジェクトをテストしました。

問題: 画面をオフにしてからオンにしたときのアプリケーションのライフサイクルを理解するのに苦労しています。

ここに私の出力があります

// activity starts
08-04 17:24:17.643: ERROR/PlayActivity(6215): onStart executes ...
08-04 17:24:17.643: ERROR/PlayActivity(6215): onResume executes ...
// screen goes off
08-04 17:24:28.943: ERROR/PlayActivity(6215): onPause executes ...
08-04 17:24:32.113: ERROR/PlayActivity(6215): onStop executes ...
08-04 17:24:32.113: ERROR/PlayActivity(6215): onDestroy executes ...
08-04 17:24:32.983: ERROR/PlayActivity(6215): onStart executes ...
08-04 17:24:32.983: ERROR/PlayActivity(6215): onResume executes ...
08-04 17:24:32.983: ERROR/PlayActivity(6215): onPause executes ...
// screen goes on
08-04 17:24:47.683: ERROR/PlayActivity(6215): onResume executes ...
// lock removed
08-04 17:24:56.943: ERROR/PlayActivity(6215): onPause executes ...
08-04 17:24:59.663: ERROR/PlayActivity(6215): onStop executes ...
08-04 17:24:59.663: ERROR/PlayActivity(6215): onDestroy executes ...
08-04 17:25:00.943: ERROR/PlayActivity(6215): onStart executes ...
08-04 17:25:00.943: ERROR/PlayActivity(6215): onResume executes ...

私は完全に混乱しています。画面が消えたときにアクティビティを再開するのはなぜですか? そして、画面がすでにオンになっていて、ロックだけが削除されたときに、なぜ停止して再起動するのですか?

間違ったことをしていないことを確認するために、このアクティビティのみを含む新しいプロジェクトを作成しました。出力は同じです...

public class LifeCycleTest extends Activity {

    private final static String DEBUG_TAG = "FirstLifeLog";

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e(DEBUG_TAG, "onCreate executes ...");
        setContentView(R.layout.main);
    }

    protected void onRestart() {
        super.onRestart();
        Log.e(DEBUG_TAG, "onRestart executes ...");
    }

    protected void onStart() {
        super.onStart();
        Log.e(DEBUG_TAG, "onStart executes ...");
    }

    protected void onResume() {
        super.onResume();
        Log.e(DEBUG_TAG, "onResume executes ...");
    }

    protected void onPause() {
        super.onPause();
        Log.e(DEBUG_TAG, "onPause executes ...");
    }

    protected void onStop() {
        super.onStop();
        Log.e(DEBUG_TAG, "onStop executes ...");
    }

    protected void onDestroy() {
        super.onDestroy();
        Log.e(DEBUG_TAG, "onDestroy executes ...");
    }
}

誰かがアイデアを持っていますか?

今日からの更新 (なぜ前回のように動作しないのか理解できません。おそらく、より多くの無料リソースがありますか?)

// activity starts
08-09 12:14:03.122: ERROR/FirstLifeLog(15406): onCreate executes ...
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onStart executes ...
08-09 12:14:03.132: ERROR/FirstLifeLog(15406): onResume executes ...
// screen off
08-09 12:14:07.412: ERROR/FirstLifeLog(15406): onPause executes ...
// screen on
08-09 12:14:11.722: ERROR/FirstLifeLog(15406): onResume executes ...
// no log for removed screen lock
4

4 に答える 4

31

自分のゲームでも同じ問題がありました。私のゲームは横向きでのみ動作し、画面をオフにすると、Android スクリーンセーバーが (縦向きモードで) コントロールを取得し、アクティビティを破棄して再作成する orientationChange を送信します。

簡単な解決策は、画面の向きの変更を自分で管理することを宣言することです。

<activity ... android:configChanges="orientation" ... >

これは、アクティビティが横向きのみであると宣言されている場合 (何もする必要がない場合) は非常に簡単ですが、アクティビティが回転できる場合はさらに難しくなる可能性があります...

于 2010-11-14T18:51:30.767 に答える
5

ルーベンの答えは完全に正しいですが、アプリケーションが API レベル 12 以下をターゲットにしている場合に限られます

ただし、オプションに加えてAPIレベル13以降、デバイスが縦向きと横向きの間で切り替わったときにもトリガーされるため、オプションorientationを宣言する必要があります。screenSize

<activity ... android:configChanges="orientation|screenSize" ... >

そうしないと、API 13 以降のプラットフォームで画面がオフになったときに、アクティビティがさらに再作成されます。

参照については、API ドキュメントandroid:configChangesセクション ノートを参照してください。

于 2015-06-26T11:57:20.947 に答える
0

そうです。アクティビティのライフサイクルを読むと、ステップがほぼそのように順序付けられていることがわかります。画面がオン/オフするときだけでなく、電話の向きを変更するときも同様です。Androidは、上記の手順を正確に実行してアクティビティを再作成しました。画面を回転させてみてください。そうすれば表示されます。=)

于 2010-08-04T17:37:20.417 に答える
-2

図によるライフサイクルの適切な説明については、アクティビティのライフサイクルのドキュメントを参照してください。

ほとんどの場合、リソース (バッテリー電力) を節約するために画面がオフになり、アクティビティが強制終了されます。ドキュメントに記載されているように、基本的に Android がリソースを解放したいときはいつでも殺される可能性があります。そのため、いつでもアクティビティを停止および再開できるように常に設計する必要があります。

于 2010-08-04T15:45:05.890 に答える