Androidインタビュアー:これらの質問には答えられません。アクティビティの起動モードを本当に理解していますか?

前書き

インタビュアーがアクティビティのスタートアップモードを紹介するように頼んだとき、ほとんどの人はスタックトップの再利用とスタック内の再利用について2つの文を言うことができますが、スタートアップモードを本当に理解していると確信していますか?

次の質問に答えることができれば、現在のインターフェイスを直接終了できます。

次の4つのアクティビティがあるとします。

  1. A(標準)
  2. B(シングルトップ)
  3. C(singleTask)
  4. D(singleInstance)

それらの起動シーケンスはABCDABCDです。アクティビティスタックの変更について説明してください。

相互作用ベースの分析

例:
1。ユーザーがメイン画面のアプリケーションアイコンをクリックしてアプリケーションを起動すると、最初のアクティビティインターフェイスがポップアップします:A、次のインターフェイスA-> B-> C-> Dを順番に開きます 
2、次にホームキーを押してメイン画面に戻り、アイコンをクリックしてアプリケーションを再度起動すると 、画面Aの代わりにポップアップインターフェイスまたは Dが表示されます 3.戻るボタンを押し続けると、アプリケーションのインターフェースが起動順序に従って逆の順序で表示されます。つまり、D-> C-> B-> A->ホーム画面です。

この例から、Androidシステムがアプリケーションの一連のActivityスタートアップチェーンを一時的に保存し、スタートアップシーケンスを記録することがわかります。これにより、最初の概念であるタスクが作成されます。

仕事

最初にタスクの定義について説明します。Androidの担当者は、特定のタスクを完了するために連鎖した上記の一連のアクティビティをタスクと呼びます 

各アクティビティが独立したインターフェースであることは誰もが知っています。複数のアクティビティをリンクして完全なアプリケーションを形成できるのは、タスクの概念です。

複数のタスクが同時に存在できますか

もちろんできます!

例:私たちは通常、携帯電話を使用してWeiboチャットとWeChatチャットを切り替えます。切り替えるたびに、システムは最後に離れた時間を節約します。

タスクのアクティビティは同じアプリケーションからのものである必要があります

もちろん違います!

例:ソーシャルソフトウェアでユーザープロフィール写真を設定する場合、通常、写真とフォトアルバムの2つのオプションがあります。写真を撮る場合はカメラソフトウェアにジャンプし、アルバムを選択する場合はジャンプします。システムフォトアルバムソフトウェアに。これらのいくつかのソフトウェア間の共同協力を通じて、タスクが完了しました。

タスクのルートアクティビティ

通常の状況では、デバイスのホーム画面にあるアプリケーションアイコンをクリックしてアプリケーションを起動します。同様に、デバイスのホーム画面もほとんどのタスクの開始点であり、アプリケーションのエントリアクティビティはのルートアクティビティです。このタスク。ルートアクティビティを宣言する必要があります。特に次の知識があります。

<activity
       android:name=".HelloActivity"">
       <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>

ユーザーがホーム画面のアプリケーションアイコンをタップしてアプリケーションを開くと、アプリケーションが最近使用されていない場合、タスクが作成され、アプリケーションのエントリアクティビティがタスクのルートアクティビティとして開かれます。それ以外の場合は、アプリケーションのタスクを呼び出してフォアグラウンドに配置します。

タスクを理解した後、Androidシステムが上記の例でアクティビティ状態を保存する方法のルールをおそらく知っています。

リターンスタック

タスクは特に仮想的な概念であり、開発者の便宜のためにのみ利用可能であり、システム内のアクティビティの実際のストレージは、ファーストイン、ラストアウトの原則に従うデータ構造です:スタック。これは一般にリターンスタックと呼ばれます(タスクスタック、スタック、実際には何でも呼ばれます)。

リターンスタックはタスクの実際のキャリアであり、各タスクのすべてのアクティビティは、開始順序に従って対応するリターンスタックに格納されます。したがって、Androidシステムの表示インターフェースの順序は、最初にインターフェースが表示されるタスクを見つけ、次に対応するリターンスタックで表示されたアクティビティを見つけることです。

リターンスタックのストレージ構造の特殊性により、外部はスタックの最上位にあるアクティビティにのみアクセスできます。これは、最後にスタックにプッシュされたアクティビティです。したがって、アクティビティを画面に表示する場合は、スタックの一番上に存在する必要があります。

プッシュアンドポップ

現在のアクティビティが別のアクティビティを開始すると、新しいアクティビティがスタックの一番上にプッシュされ、フォーカスとして画面に表示されます。前のアクティビティはスタックに残りますが、停止状態です。

ユーザーが「戻る」ボタンを押すと、現在のアクティビティがスタックの一番上からポップアップし(アクティビティは破棄されます)、前のアクティビティが実行を再開します。ユーザーが「戻る」を押し続けると、スタック内の対応するアクティビティがポップアップ表示され、ユーザーがホーム画面に戻るまで(またはタスクの開始時に実行されていたアクティビティに戻るまで)前のアクティビティが表示されます。すべてのアクティビティがスタックから削除されると、タスクは存在しなくなります。スタックもリサイクルされます。

特別なタスク

これまでの理解により、新しいインターフェイスを開く場合は、現在のタスクに対応するリターンスタックの一番上にActivityインスタンスを配置する必要があることがわかりました。この操作は、アクティビティが以前にインスタンス化されているかどうか、またはスタックにすでに存在しているかどうかに関係ありません。

ただし、特別な状況では、いくつかの「例外」があります。

例1:複数の異なるタスクのアプリケーションがシステムブラウザーを使用してWebページにアクセスすることを選択した場合、ブラウザーアプリケーションは各タスクのリターンスタックにアクティビティを作成せず、すべてのWebページをタブの形式で配置します。同じインターフェース。

この例では、ブラウザアプリケーションのアクティビティは、インスタンス化されている場合は再作成されません。

例2:Xiao MingがWeChatでWeiboコンテンツの一部を共有しました。開いた後、Weibo APPのWeibo詳細ページにジャンプしました。コンテンツの読み取りが終了したら、リターンキーを押してインターフェイスを終了し、検索します。 WeChatチャットインターフェイスに到達したとき、Weiboのホームページにアクセスしました(または最後にWeiboに滞在したとき)。

この例では、Weibo詳細ページのアクティビティはWeChatアプリケーションのタスクによって開始されますが、WeChatアプリケーションのタスクには追加されず、Weiboのタスクスタックに追加されます。

管理タスク

明らかに、上記の2つの例は実際の使用では珍しいことではありません。この特別な状況では、対象を絞った管理タスクが必要であり、よく知られている起動モードはそのうちの1つにすぎません。

開始モードを定義する

アクティビティの起動モードを定義することは、実際には、アクティビティの新しいインスタンスが現在のタスクにどのように関連付けられるか(かどうか)を定義することです。現在の(または他の)タスクを入力する方法。

アクティビティには4つの起動モードがあるとだけ言った場合、2つの方法で異なる起動モードを定義できるため、実際には不正確です。

  • AndroidManifest.xmlの定義を使用します
    在AndroidManifest.xml中<activity>标签下使用lauchMode属性来指定当前这个activity的启动模式。

  • インテントフラグ定義を使用する
    在调用startActivity(Intent intent)前,通过调用intent.addFlags()或者intent.setFlags()方法为Intent添加一个标志,用于为将要启动的Activity声明启动模式。

2つの違いは何ですか?

上記の2つの方法はどちらも、アクティビティの起動モードを宣言できますが、使用シナリオは異なります。

  1. アクティビティで特別な起動モードを実行する必要がある場合は、AndroidManifest.xmlのメソッド宣言を使用できます。

  2. ほとんどの場合、アクティビティを正常に開始したいが、特別な起動モードを実行する場合もある場合は、特別な起動モードを実行する必要があるときに、インテントにフラグステートメントを追加できます。

  3. アクティビティが両方の方法で宣言されている場合、インテントフラグを使用する方法はAndroidManifest.xmlよりも優先されます。

  4. 2つの方法で定義された起動モードの一部は異なります。インテントフラグで定義された起動モードの一部はAndroidManifest.xmlにありません。その逆も同様です。

  5. 私たちがよく話す4つの起動モードは、実際にはAndroidManifest.xmlで定義されているものです。

AndroidManifest.xmlを使用して起動モードを宣言します

マニフェストファイルでアクティビティを宣言する場合<activity>要素の] [launchMode属性を使用し、アクティビティをタスクに関連付ける方法指定できます。

launchMode 属性に割り当てることができる 起動モードは4つあります。

  • standard
  • singleTop
  • singleTask
  • singleInstance

特定の操作に関係なく、最初に、これらの4つの起動モードが2つのカテゴリに分類できることを知っておく必要があります。

  • standardまたsingleTop
    、このタイプの起動モードのアクティビティは複数回インスタンス化でき、それらのインスタンスは任意のタスクに配置でき、リターンスタックのどこにでも配置できます。
  • singleTaskまた、singleInstance
    このタイプのスタートアップモードのアクティビティの場合、インスタンスは1つだけ持つことができ、インスタンスは1つのタスクにのみ存在できます。

標準:標準モード

デフォルトの起動モードでは、アクティビティを開始するときに、新しいインスタンスを直接作成し、それを開始したタスクスタックの一番上にプッシュします。

singleTop:スタックトップ多重化モード

このモードの唯一のstandard違いは、モードsingleTopのアクティビティが開始されたときに、このアクティビティのインスタンスが現在のタスクのスタックの最上位にすでに存在する場合、新しいインスタンスは作成されませんが、インスタンスのメソッドが作成されることです。と呼ばれonNewIntent()ます。その他は標準モードと同じです。

singleTask:スタック内再利用モード

このモードは少し特別です。最初に使用シナリオに従って導入します。このモードのアクティビティを開始しようとすると、システムは現在必要なタスクスタックがあるかどうかを判断します。

  1. 必要なタスクスタックはありません
    系统会新创建一个任务,并将该activity实例化作为该任务的根activity。

  2. 必要なタスクスタックがあります
    这时候系统会找到该任务栈,如果任务栈里只有它自己则直接调用该activity实例的onNewIntent()方法。如果任务栈中它的上方还存在别的activity,那么这些activity会被全部弹出栈。

「必要なタスクスタック」とは、以下で個別に分析します。

singleInstance:シングルトンモード
は基本的にsingleTask同じで、アクティビティ用に個別のタスクを作成し、再利用できます。ただし、このモードのアクティビティでは、他のアクティビティがそれ自体と同じタスクに存在することはできず、このアクティビティによって開始されたアクティビティは他のタスクで開かれます。

インテントフラグを使用して、起動モードを宣言します

このように、intent.addFlags(int flags)またはintent.setFlags(int flags)メソッドを呼び出すことにより、インテントにフラグを追加できます。これは、開始するアクティビティの起動モードを宣言するために使用されます。

導入を開始する前に、いくつかのリテラシー科学を行う必要があります。

  1. インテントは複数のサインを設定できます。そのためaddflags()setFlags()2つの方法があります。
  2. Intentのフラグを設定するパラメーターは、Intentクラスの静的定数です。
  3. インテントフラグの設定は、アクティビティの起動モードを設定する機能だけでなく、さまざまなパラメータやその他の機能を設定する機能でもあります。
  4. インテントロゴには、アクティビティ起動モードを操作できるロゴがたくさんありますが、代表的なものを3つだけ紹介します。

Intent.FLAG_ACTIVITY_SINGLE_TOP起動モード
同じAndroidManifest.xml方法singleTop

Intent.FLAG_ACTIVITY_NEW_TASKは、
同じAndroidManifest.xmlようにsingleTask起動モードです。

Intent.FLAG_ACTIVITY_CLEAR_TOP
開始するアクティビティが現在のタスクスタックにすでに存在する場合、ポップアップしてその上のすべてのアクティビティを破棄し、アクティビティonNewIntent()の新しいインスタンスを開始する代わりに、アクティビティインスタンスのメソッドを呼び出します。

これはsingleTask少し似ていますが同じでAndroidManifest.xmlはありません。メソッドに対応する値はありません。

singleTaskデフォルトで含まれているFLAG_ACTIVITY_CLEAR_TOP関数。

関連タスク

分析singleTaskでは、このモードでアクティビティを開始する前に、「必要なタスクスタック」を探すと述べられていましたが、それを見つける方法は?これにより、AndroidManifest.xml中央の<activity>タグの下にtaskAffinity属性が表示さます。

taskAffinity属性

taskAffinity属性の学名タスクの関連性。率直に言って、このパラメーターは、現在のアクティビティが属するタスクスタックの名前を指定でき、この属性の値は文字列です。

例:android:taskAffinity="com.test.demo.task1"

<activity>タグでこの属性指定しない場合は、タグ<application>taskAffinity属性が使用<application>されますタグの下で指定されていない場合は、デフォルト値としてパッケージ名が使用されます。

taskAffinity与singleTask

taskAffinityプロパティを理解した後singleTask起動モードを再編成します。

  • taskAffinity属性を指定すると、前の分析と同じように、新しいタスクを作成するなど...
  • taskAffinity属性の値を指定しない場合、新しいアクティビティは現在のタスクのtaskAffinity属性値と同じであるため、新しいアクティビティのインスタンスは現在のタスクスタックに配置されます。

singleTaskを除いて?属性がアクティビティが属するタスクスタックを強制的に指定できることが
わかったので、taskAffinityこの属性は他のスタートアップモードではどのように見えますか?インターネット上の多くの人が効果はないと言っていました。私はそれを信じていなかったので、私はそれを個人的にテストし、次の結論に達しました。

  1. 最初に紹介SingleInstanceしたときは singleTask同じような新しいタスクが作成されるとのことでしたが、新しいタスクを作成するかどうかsingleTasktaskAffinity属性に基づいているのでsingleInstanceこの属性も指定する必要がありますか?
    答えはいいえだ!起動モードがsingleInstanceそれのためである限り、タスクは別に開かれます。

  2. SingleTopモードtaskAffinityで属性値が指定された後、彼は以前と同じであることを除いて、指定されたタスクスタックに魔法のように切り替わります。

  3. 最も驚くべきことはStandardtaskAffinityプロパティの影響も受け、指定されたタスクスタックに切り替わるということですが、このアクティビティを複数回開始すると、インスタンスは複数回作成されませんが、前のインスタンスがプルアップされます。さらに特別なのは、他の3つの起動モードは、前のインスタンスが再利用されるときにonNewIntent()メソッドを呼び出すが、メソッドを呼び出さないことです。

taskAffinityの他の機能

taskAffinityのもう1つの機能は、タスクをリダイレクトできることです。つまり、このアクティビティは元々タスクAに属していました。アクティビティのtaskAffinity属性と同じ値を持つタスクBが作成されると、アクティビティはタスクAから転送されます。タスクBに進みます。

この機能を実現するにallowTaskReparentingは、属性の協力も必要です。

  1. マニフェストファイルで指定さtaskAffinity="A"れたアクティビティタグの下に属性追加しますandroid:allowTaskReparenting=true
  2. taskAffinity="B"次のタスク・アクティビティを開始し、この活性は、それぞれ、タスクBに存在します。
  3. ときにtaskAffinity="A"タスクが作成またはフォアグラウンドに置かれ、活動がスタックの最上部にそのタスクのスタックに転送されます。

クリーンアップタスク

ユーザーがタスクを長時間離れると、システムはルートアクティビティを除くすべてのアクティビティタスクをクリアします。ユーザーが再びタスクに戻ると、ルートアクティビティのみが復元されます。システムがこれを行う理由は、長い時間が経過した後、ユーザーが以前に実行した操作をあきらめて、タスクに戻って新しい操作を開始した可能性があるためです。

この動作は、次のアクティビティプロパティを使用して変更できます。

alwaysRetainTaskState
このプロパティがタスクのルートアクティビティで「true」に設定されている場合、今説明したデフォルトの動作は発生しません。長期間経過した後でも、タスクはすべてのアクティビティをスタックに保持します。

clearTaskOnLaunch
タスクのルートアクティビティでこのプロパティが「true」に設定されている場合、ユーザーがタスクを離れて戻るたびに、システムはスタックをクリアしてルートアクティビティのみにします。タスクを短時間だけ離れた場合でも、ユーザーは常にタスクの初期状態に戻ります。

finishOnTaskLaunchはclearTaskOnLaunchに
似ていますが、より冷酷です。ユーザーがタスクを離れて戻ってくると、ルートアクティビティも含めて、タスク全体のアクティビティがクリアされます。これは、タスクを初めて開始するのと同じです。

スタートアップモードの実用化

個人的には、4つの一般的な起動モードがsingleTopよく理解されおらず、他のモードは問題ないと感じています

singleTop

singleTopこのモードのアクティビティ機能は、情報を表示するために外部から起動するだけでなく、同じ方法で表示情報を更新するために自身を起動できることです。これにより、冗長なコードが削減され、メンテナンスコストが削減されます。

例:検索アプリケーションを使用してAPPを設計するように求められた場合、ホームページには検索ボックスがあり、情報を入力し、検索ボタンをクリックして結果ページに入り、結果を表示します。ユーザーの便宜のために、結果ページにもホームページの検索ボックスと同じ機能を持つ検索ボックス、どのようにデザインしますか?

singleTask

この起動モードは、次の2つの状況に分けることができます。

  1. TaskAffinityは指定されていません。
    この時点で、アクティビティはアプリケーションのモジュールの入り口として使用できます。

起動プロセスは次のとおりです。WeChatホームページ>>チャットページ>>チャット設定ページ>>ユーザープロファイルページ>>チャットページこのとき、戻るボタンを押すと、WeChatホームページに直接戻ります。

  1. taskAffinity
    指定されている場合、このスタートアップモードを使用して新しいタスクを開くと、ユーザーの観点から2つのアプリケーションが開かれます(最近の2つのアプリケーションはタスクマネージャーに表示されます)ので、注意して使用してください。使用法が考えられます。 Wordアプリケーションだけで2つのドキュメントが開かれました。

singleInstance

この場合、開始するタスクの数に関係なく、単一のタスクとして存在します。このモードは非常に特殊であるため、注意して使用する必要があります。

例:ダイヤルインターフェイス、目覚まし時計インターフェイス。

面接レビュールート

余計な言葉はお話ししませんが、次に面接のレビュールートをご紹介します。面接の準備もしているのに効率よくレビューする方法がわからない場合は、私のレビュールートを参考にしてください。ご不明な点がございましたら、お気軽にお問い合わせください。

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

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.ソースコードを読み、実際の戦闘ノートを読み、神の考えを学びます

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

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

4.インタビューの前夜に、スプリントの質問

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

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

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

おすすめ

転載: blog.csdn.net/weixin_44339238/article/details/111396988