17

onPause()アクティビティの メソッドとメソッドをオーバーライドする場合、andonResume()を呼び出す適切な場所はどこですか? メソッドの最初か最後か?super.onPause()super.onResume()

4

6 に答える 6

17

更新:これは受け入れられた答えであり、有用な図を含む多くの優れた情報が1か所にまとめられています。ただし、少なくとも、ポスターが指摘しているように、SDKに関する情報の最終的な情報源である現在のAndroidのドキュメントによると、これは正しくないようです。おそらく、この回答が投稿された後、ドキュメントが明確になりました。しかし、いずれにせよ、この答えで読むのをやめないでください、以下のespinchiの答えをチェックしてください。側面にドキュメントがあります。


メソッドの配置は、super好みによってのみ異なります。これらのメソッドがパラメーターを取得している場合、または並行作業を行っている場合にのみ問題になります。たとえば、これを行う場合:

    @Override
    protected void onPause() {
        try {
            someOtherThread.join();
        } catch (InterruptedException e) {
            LOG.e(e);
        }
        super.onPause();
    }

superスレッドをブロックし、呼び出されない可能性があります。

利用可能なすべてのドキュメントを読むことをお勧めします。それらは非常に役立つからです。たとえば、これはonPausejavadocで見つけることができるものです。重要な部分を太字にしました。

アクティビティがバックグラウンドに入るときにアクティビティライフサイクルの一部として呼び出されますが、(まだ)強制終了されていません。onResume()に対応します。

アクティビティBがアクティビティAの前に起動されると、このコールバックはAで呼び出されます。BはAのonPause()が戻るまで作成されないため、ここでは長いことをしないでください。

このコールバックは主に、アクティビティが編集している永続的な状態を保存し、「インプレース編集」モデルをユーザーに提示し、最初にこのアクティビティを強制終了せずに新しいアクティビティを開始するのに十分なリソースがない場合に何も失われないようにするために使用されます。これは、次のアクティビティへの切り替えをできるだけ速くしたり、カメラなどの排他的アクセスであるリソースを閉じたりするために、アニメーションの停止やCPUをかなり消費するその他のことを行うのにも適しています。

システムがより多くのメモリを必要とする状況では、リソースを再利用するために一時停止したプロセスを強制終了する場合があります。このため、この関数から戻るまでに、すべての状態が保存されていることを確認する必要があります。一般に、onSaveInstanceState(Bundle)は、アクティビティのインスタンスごとの状態を保存するために使用され、このメソッドは、グローバルな永続データ(コンテンツプロバイダー、ファイルなど)を格納するために使用されます。

この呼び出しを受信した後、通常はonStop()への次の呼び出しを受信します(次のアクティビティが再開されて表示された後)が、場合によっては、停止状態を経由せずにonResume()への直接呼び出しがあります。

派生クラスは、このメソッドのスーパークラスの実装を呼び出す必要があります。そうでない場合は、例外がスローされます。

このフローチャートをお勧めします。これは、開発に非常に役立ちます。

Androidアクティビティフローチャート

于 2012-10-19T12:52:30.710 に答える
17

http://developer.android.com/guide/components/activities.html#ImplementingLifecycleCallbacksから:

上記の例に示すように、これらのライフサイクル メソッドの実装では、作業を行う前に常にスーパークラスの実装を呼び出す必要があります。

onPause()そのため、やのようなライフサイクル コールバックでは、最初にoronResume()を実行する必要があります。他のメソッドについては、すべてスーパー クラスのセマンティクスに依存します。super.onPause()super.onResume()

于 2013-12-27T18:03:43.483 に答える
4

おそらく問題ではありませんが、確実に知るには、スーパー メソッドが何を行っているかを知る必要があり、通常、その情報は利用できません。

私のスタイルは、たとえば super.onCreate() や super.onResume() などを自分のメソッドの本体の前に呼び出し、たとえば super.onPause() や super.onDestroy() を自分のメソッドの本体の後に呼び出すことです。

この背後にある理論は、スーパークラスが最初に設定したものに依存する場合に備えて、何かを構築している間はスーパーメソッドを最初に実行するのが好きで、何かを分解するときは自分自身のものを分解するのが好きだということです。スーパークラスがその内容を破棄する前の内容。

于 2012-10-19T17:49:04.183 に答える
3

正しいことも悪いこともありません。これは、これらのメソッドの実装で何をするかによって異なります。superコードの前に置きたい場合もあれば、後にしたい場合もあります。

于 2012-10-19T12:49:26.390 に答える
2

どこにでも置けます。まず、アクティビティのライフサイクルを理解する必要があります。こちらのリンクを確認してください

デモをダウンロードして実行すると、明確になります

于 2012-10-19T12:51:34.647 に答える
2

Android コードを詳しく調べると、super.onPause() を呼び出すと、フレームワークが mcalled というフラグを設定することがわかります。このフラグは、後でフレームワークによって再開時にチェックされます。

if (!mCalled) {
            throw new SuperNotCalledException(
                "Activity " + mComponent.toShortString() +
                " did not call through to super.onResume()");
        }

あなたがする必要があるのは、呼び出しがスーパーに行われ、あなたが良いことを確認することだけです. 他の予防策は必要ありません。

于 2012-10-19T13:13:00.803 に答える