注意!onStartは表示されているがインタラクティブではないことを理解する方法に関して、プログラマーはこの問題を過小評価してはなりません。これには多くのことが関係します。

序文

今日、私の友人は面接の質問に遭遇し、それをあなたと共有しました:

onStartライフサイクルは、アクティビティが表示されていることを示していますが、なぜ相互作用できないのですか?

この質問は単純に思えるかもしれませんが、アクティビティのライフサイクルの理解、プロセスの理解、ビューの描画のタイミングなど、多くの側面が関係しています。

見てみましょう。

onStartの概要

まず第一に、それはonStartライフサイクルの理解についてです。

公式サイトはこんな感じです:

アクティビティが「開始」状態になると、システムはこのコールバックを呼び出します。onStart()呼び出しは、アプリケーションがアクティビティをフォアグラウンドに入力してインタラクションをサポートする準備をするため、アクティビティをユーザーに表示します。

ユーザーに表示されますか?

それは奇妙です。ユーザーに表示されている場合、それは私たちが見ることができるのではありませんか?なぜ私たちは対話できないのですか?

さらに、onStartの時点ではインターフェイスが描画されていませんが、この可視性をどのように理解する必要がありますか?

少し実験してください

まず、ポピュラーサイエンスによって公式に定義された2つの州があります。

  • onStartとonStopの間の状態は“已开始”状態と呼ばれます。
  • onResumeとonPauseの間の状態は、“已恢复”状態と呼ばれます。

その後、我々は、小さな実験を行う定義するActivityA と ActivityBActivityBダイアログのテーマとして、ActivityAミドルクリックはBにジャンプすることができます。

image.setOnClickListener {
        startActivity(Intent(this, ActivityB::class.java))
    }

    <activity android:name=".activity.ActivityB"
        android:theme="@style/Theme.AppCompat.Light.Dialog"
        android:launchMode="standard">
    </activity>

ActivityAに入った後、ボタンをクリックしてBにジャンプします。この時点で、Aのライフサイクルが終了しましたonPause。つまり、已开始状態に戻ります。

現時点では、インターフェースは次のようになっています。

ActivityAは開始状態にあり、ユーザーに表示されます。

ここでの可視性が実際に私たちに見えるかどうかは簡単に理解できますが 、フォアグラウンドではなく、と対話することはできません

したがって、通常の範囲Activity拡張すると、この可視性は、ユーザーが肉眼でそれを見ることができることを意味するのではなく、次のことを表現したいと考えています。

Activity表示されていますが、まだ表示されていない前台ため可见、インタラクティブではありません

この表示状態は、onStartで始まり、onStopで終わります。これは、次の2つの段階に分けることができます。

  • onStartからonResumeへ。この段階で、アクティビティが作成され、レイアウトがロードされていますが、インターフェイスはまだ描画されていません。インターフェイスは存在しないと言えます。
  • onPauseからonStopへ。この段階は、先ほど行った実験です。アクティビティにはインターフェイスがありますが、新しいインターフェイスによって隠されています。つまり、フォアグラウンドにはありません。

したがって、2つの段階を組み合わせて、作成または表示されるがフォアグラウンドではないこの種のアクティビティを呼び出し、その間の可见 状態を状態と呼び ます。

onStart和onResume

これまでのところ、目に見える意味を知っています。実際、別の問題も知っています。そのため、onStartとonResumeの2つの状態が設計されています。

  • onStart和onStop、アクティビティが表示されるかどうかの観点から設計されています。
  • onResume和onPause、アクティビティがフォアグラウンドにあるかどうかの観点から設計されています。

したがってActivity、ライフサイクルは次のように説明できます。

作成されました(onCreate)->表示(onStart)->フォアグラウンドで(onResume)->表示されますがフォアグラウンドでは表示されません(onPause)

目に見えるプロセス

別の観点から、この可視性は可視プロセスを参照 できますこれには、プロセスの分類が含まれます。

メモリが不足しているときにどのプロセスを終了する必要があるかを判断するために、Androidは、各プロセスで実行されているコンポーネントとこれらのコンポーネントの状態に基づいて、プロセスを「重要度階層」に配置します。これらのプロセスタイプには、(重要度の順に)次のものが含まれます:フォアグラウンドプロセス、可視プロセス、サービスプロセス、キャッシュプロセス

これらのプロセスはどういう意味ですか?

  • 前台进程これは、ユーザーが現在操作を実行するために必要なプロセスです。たとえば、アクティビティがユーザーのインタラクティブ画面で実行されている(そのonResume()メソッドが呼び出されている)
  • 可见进程これは、ユーザーが現在実行中であることを知っているタスクです。たとえば、実行中のアクティビティは画面上では表示されますが、フォアグラウンドでは表示されません(onPause()メソッドが呼び出されています)
  • 服务流程startService()メソッドを使用して開始されたサービスが含まれます。
  • 缓存进程これは、現在必要とされていないプロセスです。たとえば、現在表示されていない1つ以上のActivityインスタンス(onStop()メソッドが呼び出されて返されました)

したがって、アクティビティのライフサイクルは次のプロセスに分割できます。

可視プロセス(onStart)->フォアグラウンドプロセス(onResume)->可視プロセス(onPause)->キャッシュプロセス(onStop)

これらのプロセスの用途は何ですか?

Androidシステムには、さまざまなプロセスを表す多くの実行中のアプリがあることは誰もが知っています。

メモリが十分でない場合(特定のしきい値に達すると)、システムは最初にonTrimMemory()コールバックメソッドを介してアプリケーションに通知し、アプリケーションがメモリ不足の条件下でメモリ削減操作を処理できるようにします。この後、メモリがまだ非常にタイトな場合は、メモリを解放するために一部のプロセスが強制終了されます。ここでは、プロセスの優先度を決定し、優先度の低いものから順にプロセスを終了する必要があります。

したがって、プロセスの分類機能はここにあります。優先度レベルは、実際にはプロセスの終了順序を表し、ユーザーへの影響の程度も表します。

もちろん、実際のコードでは、プロセスの優先度は番号、つまりADJで表され、上記のプロセスタイプには対応するプロセスの優先度番号の範囲があります。といった:

public final class ProcessList {
    //可见进程
    static final int VISIBLE_APP_ADJ = 100;

    // 前台进程
    static final int FOREGROUND_APP_ADJ = 0;

    // 服务进程
    static final int SERVICE_ADJ = 500;

    // 缓存进程
    static final int CACHED_APP_MIN_ADJ = 900;

    //...
}

質問に戻る:

それらの中で、プロセスはここで見ることができます、概念に見えました、与えられた説明は次のとおり用户知晓です

ページをクリックすると、このページが表示されようとしていることがわかります。また、前のページがこのページの後ろにあることもわかります。したがって、これらのページとプロセスはすべて私たちに知られていますが、フォアグラウンドではありません。

したがってonStart、可視性は、可见进程このアクティビティが配置されているプロセスタスクが作成および表示されていることを意味すると理解することもできます。これはわかっていますが、フォアグラウンドではありません。

インタラクティブ

では、相互作用はどの段階で発生しますか?

前に述べたように、handleResumeActivityメソッドはアクティビティの起動プロセス中に呼び出されます。このメソッドでは、onResumeメソッドとaddViewメソッドが呼び出され、ビューの最初の描画が完了し、インターフェイスに表示されます。

@Override
    public void handleResumeActivity() {
        //onResume
        final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
        //addView
        if (r.window == null && !a.mFinished && willBeVisible) {
            wm.addView(decor, l);
        }
    }

したがって、onResumeでは、ビューが描画され、前面に表示されます。

公式サイトでは次のonResumeように説明しています。

アクティビティは「再開」状態になるとフォアグラウンドになり、システムはonResume()コールバックを呼び出します。これは、アプリとユーザーの間の相互作用の状態です。アプリケーションは、何らかのイベントが発生するまでこの状態のままであるため、フォーカスはアプリケーションから遠く離れています。このようなイベントには、通話の受信、ユーザーが別のアクティビティに移動する、デバイスの画面がオフになるなどがあります。

したがって、インタラクティブな状態はonResume後で、つまりActivity表示され、フォアグラウンドにある必要があります。

概要

要約する:

onStartステータスはActivity表示Activityされいることを意味し、表示されいるとは、作成されてユーザーに認識されいるが、フォアグラウンドになく、インターフェイスがまだ描画されていないため、操作できないことを意味します。また、それが含まれているプロセスが目に見えるプロセスであることを意味する場合もあります。

その意味は見てする必要がありonStop、あること、一緒に使用onStartonStop、この段階で呼ばれている 目に見える 段階。

実際の表示onResumeは、後で操作できます。つまり、ビューが描画されて前景にあるときに操作できます

面接前に面接の準備を!

次に、面接のレビュールートを紹介します。面接の準備もしているのに、効率的にレビューする方法がわからない場合は、私のレビュールートを参考にしてください。ご不明な点がございましたら、お気軽にご連絡ください。さあ!

誰もが体系的に学ぶための方向性は次のとおりです。

1.体系的な学習のためのビデオを見る

過去数年間のCrudの経験から、私は本当に新人の戦闘機であることがわかりました。また、Crudのおかげで、私の技術は比較的断片化されており、体系化するのに十分な深さではないため、必要です。もう一度勉強します。私に欠けているのは、システムの知識、貧弱な構造フレームワーク、そして思考です。そのため、ビデオを通じて学ぶことは、より良く、より包括的です。ビデオ学習に関しては、個人がステーションBでの学習を推奨できます。ステーションBには多くの学習ビデオがあります。唯一の欠点は、無料で簡単に古くなることです。

さらに、私は自分でいくつかのビデオのセットを収集しました、そして私がそれらを必要とするならば、私はあなたとそれらを共有することができます。

2.知識を体系的に整理し、埋蔵量を改善する

クライアント開発には非常に多くの知識ポイントがあり、インタビューにはまだほとんど何もありません。したがって、面接のための他のトリックはありません。これらの知識ポイントにどれだけ準備しているかを見てください。ですから、面接に出かけるときは、どの段階をレビューしたかを確認するのは良いことです。

システム学習の方向性:

  • アーキテクトが基盤を構築するために不可欠なスキル:詳細なJavaジェネリック+単純な言語でのアノテーション+並行プログラミング+データ送信とシリアル化+ Java仮想マシンの原則+リフレクションとクラスの読み込み+動的プロキシ+効率的なIO

  • Androidの高度なUIとFrameWorkのソースコード:高度なUIプロモーション+フレームワークカーネル分析+ Androidコンポーネントカーネル+データの永続性

  • 360°の全体的なパフォーマンスチューニング:設計アイデアとコード品質の最適化+プログラムパフォーマンスの最適化+開発効率の最適化

  • オープンソースフレームワーク設計アイデアの解釈:ホットリペア設計+プラグインフレームワーク解釈+コンポーネントフレームワーク設計+画像読み込みフレームワーク+ネットワークアクセスフレームワーク設計+ RXJavaレスポンシブプログラミングフレームワーク設計+ IOCアーキテクチャ設計+ AndroidアーキテクチャコンポーネントJetpack

  • NDKモジュール開発: NDK基本知識システム+基礎となる画像処理+オーディオおよびビデオ開発

  • WeChatミニプログラム:ミニプログラムの紹介+ UI開発+ API操作+ WeChatドッキング

  • ハイブリッド開発とFlutter: Html5プロジェクトの戦闘+ Flutter Advanced

知識が整理されたら、空席を確認して記入する必要があるので、これらの知識ポイントについては、手元にたくさんの電子書籍やメモを用意しました。これらのメモは、各知識ポイントの完全な要約を提供します。

3.ソースコードを読み、実際の戦闘ノートを読み、神の考えを学びます

「プログラミング言語はプログラマーが表現する方法であり、アーキテクチャーはプログラマーの世界の認識です」。したがって、プログラマーがアーキテクチャーをすばやく理解して学習したい場合は、ソースコードを読むことが不可欠です。ソースコードを読むことは、問題を解決し、物事を理解することであり、さらに重要なことは、ソースコードの背後にあるアイデアを確認することです。プログラマーは、1万行のソースコードを読み、1万種類の練習をします。

主にWeChatMMKVソースコード、AsyncTaskソースコード、Volleyソースコード、Retrofitソースコード、OkHttpソースコードなどが含まれています。

4.面接の前夜にスプリントをします

面接前1週間以内に全力疾走を開始できます。質問をブラッシングするときは、テクノロジーが最優先であり、アルゴリズムは並べ替えなどの基本であり、知的質問は通常、学校の新入生でない限り質問されないことに注意してください。

面接の質問に関して、私はあなたがお互いから学ぶのを助けるために一連の体系的な面接の質問を個人的に準備しました:

整理に1年以上かかった一連のAndroid学習リソースもありますAndroid源码解析、Android第三方库源码笔记、Android进阶架构师七大专题学习、历年BAT面试题解析包、Android大佬学习笔记。待つ。

上記のコンテンツは、フルバージョンが必要なすべての人、友人と無料で共有できますすべてのコンテンツを表示するにはここをクリックしてくださいまたは、[ここをクリック]をクリックして、入手方法を確認してください。

おすすめ

転載: blog.csdn.net/YoungOne2333/article/details/115337047