アクティビティは、電話をかける、写真を撮る、電子メールを送信する、地図を表示するなどのアクションを実行するためにユーザーが操作する画面を提供するアプリケーション コンポーネントです。すべてのアクティビティには、ユーザー インターフェイスを描画するためのウィンドウが表示されます。ウィンドウは通常、画面全体に表示されますが、画面よりも小さく、他のウィンドウの上に浮く場合もあります。
活動
1. アクティビティの利用
私たちの新しいプロジェクトには基本的なアクティビティがあります。
新しいプロジェクトでは、3 つのファイルに注意する必要があります。
- MainActivity.java は、対応するパッケージ名ディレクトリの下の src/main/java にあります。
- activity_main.xmlは res/layout にあります。
- AndroidManifest.xmlは src/main にあります。これを「マニフェストファイル」といいます。
これら 3 つのファイルは別の場所に配布されます。簡単に言うと、Java ファイルはインターフェイス ロジックを制御できます。レイアウト ファイル (ここではactivity_main.xmlを参照) は、UI の配置方法を事前に設定します。マニフェスト ファイルは、アプリにどのコンポーネントがあり、どのような権限を申請したかをシステムに伝えます。
2. レイアウト - インターフェースのレイアウト
新しく作成されたレイアウトでは、通常、デフォルトで 1 つが与えられますConstraintLayout
。たとえば、activity_main.xmlです。
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- 省略默认的TextView -->
</androidx.constraintlayout.widget.ConstraintLayout>
ここでは使いやすいように、LinearLayout に置き換えます。友人の中には、2021 年になったので、なぜ ConstraintLayout を直接使用しないのかと尋ねる人もいるでしょう。
ここでは関数を実行せず、便宜上、最初に LinearLayout を使用してください。LinearLayoutに変更後のレイアウトファイルは次のようになります。
LinearLayoutに変更後の activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- 省略默认的TextView -->
</LinearLayout>
ご覧のとおり、ラベルの先頭と末尾が置き換えられていますLinearLayout
。他の場所は当面変更されません。
強力で非常に便利です。マウスを使用してラベルの先頭を選択しandroidx...Layout
、LinearLayout
キーボードの最初の数文字を直接入力できます。
選択ボックスが自動的にポップアップするので、ダブルクリックして選択するLinearLayout
か、Enter キーを押して選択すると、ラベルが置き換えられます。
3. Java - 制御インターフェース
レイアウト ファイルのデザインは、インターフェイスの初期レイアウトです。これにより、どの UI コンポーネントが初期インターフェイスに配置されるか、およびコンポーネントがどのように編成されるかが決まります。
ここでは「初期インターフェイス」または「初期レイアウト」について話します。つまり、インターフェイス上の UI 要素を制御できます。
まずデフォルトのMainActivity.javaを見てください。onCreate
メソッド内ではactivity_main.xmlR.layout.activity_main
を参照します。
これで、レイアウトに TextView が追加され、テキストを表示するために使用できます。それを制御したいのですMainActivity
が、どうすればよいでしょうか?
次に、この TextView を変更します。元の ConstraintLayout で使用されている属性を削除します。
ID を付けます。この ID は、このレイアウト ファイル内で一意である必要があります。以下のように、という ID を割り当てますtv1
。
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
TextView に ID が設定されたので、アクティビティ内で ID を見つけることができます。という方法が使われていますfindViewById
。
TextView tv1 = findViewById(R.id.tv1);
これで、インターフェイスに TextView オブジェクトができました。操作する準備ができています。表示されるテキストを変更するなど。
TextView tv1 = findViewById(R.id.tv1); // 拿到textView的对象
tv1.setText("Today is a good day."); // 改变文字
4. AndroidManifest.xml - マニフェスト ファイル
略して「マニフェストファイル」とも呼ばれます。マニフェスト ファイルは非常に重要で、アプリにどのようなアクティビティがあるか、どのような権限が使用されているかなどをシステムに伝えます。
新しいアクティビティを作成する場合は、リストに登録する必要があります。
AndroidManifest.xml
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
このデフォルトのマニフェスト ファイルから、アクティビティがアプリケーションに属していることがわかります。アプリケーションは当社のアプリケーションです。
application タグには、アプリケーションのアイコン、名前、テーマなどのさまざまな要素も指定されます。
MainActivity は、アプリケーションによって開始される最初のアクティビティです。アクションとカテゴリのプロパティが設定されていることがわかります。
android.intent.action.MAIN
アプリケーションが最初に開始するアクティビティを決定します。android.intent.category.LAUNCHER
アプリのアイコンが携帯電話の「デスクトップ」に表示されることを示します。
これら 2 つのタグが設定されており、これにより、このアクティビティが、ユーザーがアプリケーション アイコンをクリックしたときに開始される最初のインターフェイスであることが決定されます。
概要アクティビティは、アプリケーションの重要なコンポーネントの 1 つです。複雑なコンテンツはアクティビティによって実行する必要があります。
その後、アクティビティ内のさまざまな UI コンポーネントを制御し、ユーザー操作を処理し、権限を申請します。アクティビティのライフサイクル、開始方法、ジャンプ方法についても理解します。
アクティビティのライフサイクル
ライフサイクル図
1. ライフサイクルの変化
いくつかの一般的な操作を実行し、ライフサイクルの変化を確認するためにログを作成します。テストモデル: RedMi。
開始と終了
onCreate
onStart
onResume
onWindowFocusChanged: hasFocus: true
onWindowFocusChanged: hasFocus: false
onPause
onStop
onDestroy
起動後にホームボタンを押す
Act1: onCreate
Act1: onStart
Act1: onResume
Act1: onWindowFocusChanged: hasFocus: true
// 按home键
Act1: onWindowFocusChanged: hasFocus: false
Act1: onPause
Act1: onStop
// 再回来
Act1: onRestart
Act1: onStart
Act1: onResume
Act1: onWindowFocusChanged: hasFocus: true
// 按返回键退出act
Act1: onWindowFocusChanged: hasFocus: false
Act1: onPause
Act1: onStop
Act1: onDestroy
水平画面と垂直画面を切り替えるときに、携帯電話アクティビティのライフサイクルを回転させます。
[Life]: onCreate
[Life]: onStart
[Life]: onResume
[Life]: onWindowFocusChanged: hasFocus: true
// 横屏
[Life]: onPause
[Life]: onStop
[Life]: onDestroy
[Life]: onCreate
[Life]: onStart
[Life]: onResume
[Life]: onWindowFocusChanged: hasFocus: true
// 竖屏
[Life]: onPause
[Life]: onStop
[Life]: onDestroy
[Life]: onCreate
[Life]: onStart
[Life]: onResume
[Life]: onWindowFocusChanged: hasFocus: true
// 返回
[Life]: onWindowFocusChanged: hasFocus: false
[Life]: onPause
[Life]: onStop
[Life]: onDestroy
前後の切り替えによるライフ サイクルの変化2 つのアクティビティの開始を例として考えてみましょう。
Act1: onCreate
Act1: onStart
Act1: onResume
Act1: onWindowFocusChanged: hasFocus: true
Act1: onPause
Act1: onWindowFocusChanged: hasFocus: false
Act2: onCreate
Act2: onStart
Act2: onResume
Act2: onWindowFocusChanged: hasFocus: true
Act1: onStop
Act2: onWindowFocusChanged: hasFocus: false
Act2: onPause
Act1: onRestart
Act1: onStart
Act1: onResume
Act1: onWindowFocusChanged: hasFocus: true
Act2: onStop
Act2: onDestroy
Act1: onWindowFocusChanged: hasFocus: false
Act1: onPause
Act1: onStop
Act1: onDestroy
Pop up AlertDialogボタンをクリックしてポップアップを表示しますAlertDialog
。ディスカバリー呼び出しを観察しますonWindowFocusChanged
。
onWindowFocusChanged: hasFocus: false
onWindowFocusChanged: hasFocus: true
DialogFragment はここでのテストにも使用できます。
再作成はrecreate()メソッドを呼び出します
[Life]: onCreate
[Life]: onStart
[Life]: onResume
[Life]: onWindowFocusChanged: hasFocus: true
[Life]: click [recreate]
[Life]: onPause
[Life]: onStop
[Life]: onDestroy
[Life]: onCreate
[Life]: onStart
[Life]: onResume
ご覧のとおり、recreate()
メソッドの呼び出し後にコールバックはありませんonWindowFocusChanged
。
2. onCreate と onStart の違い
アクティビティの状態の違い
onCreate
システムが最初にアクティビティを作成するときに発生します。アクティビティは作成後、作成された状態になります。- アクティビティが「開始」状態になると、システムはこのコールバックを呼び出します。
onStart()
アプリケーションがアクティビティをフォアグラウンドにして対話をサポートする準備をしているときに、アクティビティをユーザーに表示するために呼び出します。
onStart()
このメソッドは非常に迅速に完了し、「作成済み」状態と同様に、アクティビティは永久に「開始済み」状態に留まりません。このコールバックが完了すると、アクティビティは再開状態になり、システムがonResume()
メソッドを呼び出します。
3. onPause と onStop の違い
onPause()
実行は非常に簡単で、保存操作の実行に必ずしも十分な時間がかかるわけではありません。onPause()
したがって、アプリケーションやユーザー データの保存、ネットワーク呼び出し、データベーストランザクションの実行には使用しないでください。そのような作業は、メソッドが完了するまで完了しない可能性があるためです。
は停止状態に入ったので、コールバックが呼び出されますonStop()
。これは、たとえば、新しく開始されたアクティビティが画面全体をカバーする場合に発生する可能性があります。
このメソッドではonStop()
、アプリケーションはユーザーに表示されないときに使用されないリソースを解放または調整する必要があります。たとえば、アプリはアニメーションを一時停止したり、位置情報の更新を粒度の細かいものから粗いものに切り替えることができます。onStop()
の代わりにを使用するonPause()
と、ユーザーがマルチウィンドウ モードでアクティビティを表示している場合でも、UI 関連の作業が続行されます。比較的 CPU に負荷がかかるシャットダウン操作を実行する場合にも使用する必要がありますonStop()
。
アクティビティの開始、パラメータから開始
Activity はユーザーにインターフェイスを提供できるアプリケーション コンポーネントであることを大まかに理解しました。そしてアクティビティを追加する方法。アプリには通常、複数のインターフェイスがあります。各インターフェースがアクティビティに対応すると仮定すると、異なるインターフェース間をどのようにジャンプするのでしょうか?
1. 意図
通常、アクティビティ間のジャンプは Intent クラスから切り離すことができません。インテント、直訳すると「意図」。情報をインテントオブジェクトにラップして実行します。たとえば、RelativeLayoutGuideAct
このアクティビティを開始します。
startActivity(new Intent(getApplicationContext(), RelativeLayoutGuideAct.class));
ここでは非常に一般的な方法が使用されていますstartActivity (Intent intent)
。startActivity
Context クラスに属し、Activity は Context のサブクラスです。
java.lang.Object
android.content.Context
android.content.ContextWrapper
android.view.ContextThemeWrapper
android.app.Activity
これで、アクティビティを開始するには、startActivity
メソッドを呼び出すインテントが必要であることがわかりました。
2.パラメータを指定してジャンプする
次のページにジャンプするとき、いくつかの情報を次のインターフェースに伝えたい場合があります。テキストや数字などを運ぶなど。またはオブジェクト。この情報を Intent に与えて、次のアクティビティに渡すことができます。次のアクティビティで渡した Intent を取得します。
プリミティブ型と文字列を運ぶ
インテントメソッドを直接見てみましょう。
Intent intent = new Intent(getApplicationContext(), SendParamsDemo.class);
intent.putExtra(SendParamsDemo.K_INT, 100);
intent.putExtra(SendParamsDemo.K_BOOL, true);
intent.putExtra(SendParamsDemo.K_STR, "Input string");
startActivity(intent);
インテントputExtra
メソッドはパラメータを渡すことができます。文字列をキーとして受け入れ、次に特定のパラメータを受け入れます。この例では、SendParamsDemo にジャンプします。
public class SendParamsDemo extends AbsActivity {
public static final String K_INT = "k_int";
public static final String K_BOOL = "k_bool";
public static final String K_STR = "k_str";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gotInput();
}
private void gotInput() {
Intent intent = getIntent();
if (intent != null) {
int i = intent.getIntExtra(K_INT, -1);
boolean b = intent.getBooleanExtra(K_BOOL, false);
String str = intent.getStringExtra(K_STR);
Log.d(TAG, "gotInput: i:" + i + ", b: " + b + ", str: " + str);
} else {
Log.d(TAG, "gotInput: input null.");
}
}
}
// log:
// com.rustfisher.tutorial2020 D/rustAppSendParamsDemo: gotInput: i:100, b: true, str: Input string
このアクティビティでは、受信パラメータを受け取ります。
putExtra
インテントのメソッドを観察すると、多くの種類のパラメーターの受け渡しをサポートしていることがわかりました。
int、byte、char、float、double、long、boolean、string、CharSequence、またはそれらの配列。Parcelable、Serializable オブジェクト、またはオブジェクトの配列を渡すこともできます。
シリアル化可能なオブジェクトを渡します
プリミティブ型とString以外にオブジェクトも転送できますか? 答えは「はい」です。インテントはオブジェクトを運ぶことができますSerializable
。Serializable
これはインターフェースそのものであり、カスタム オブジェクトがこのインターフェースを実装した後、インテントによって実行できます。たとえば、Serializable
インターフェイスを実装するように DataTest クラスを変換してみましょう。
public class DataTest implements Serializable {
// 实现接口
次に、オブジェクトをインテントに送信し、アクティビティを開始します。
Intent intent = new Intent(getApplicationContext(), RecyclerViewDemo2Act.class);
DataTest out = new DataTest("input time", 233, 666, 999);
Log.d(TAG, "startInputData: sending object: " + out);
intent.putExtra(RecyclerViewDemo2Act.K_INPUT_DATA, out);
startActivity(intent);
開始されたアクティビティは受信インテントを受け入れ、オブジェクトを取得します。
Intent intent = getIntent();
if (intent != null) {
DataTest d = (DataTest) intent.getSerializableExtra(K_INPUT_DATA);
// 取出了对象,拿去显示
}
Serializable
インターフェイスにはメソッドが含まれません。このインターフェイスを実装するクラスは、システムによって自動的にシリアル化されます。
送受信されたオブジェクトを印刷します。
startInputData: sending object: com.rustfisher.tutorial2020.recycler.data.DataTest@fb43df5
getInputData: input data object: com.rustfisher.tutorial2020.recycler.data.DataTest@a588b5c
これら 2 つのオブジェクトは同じ参照ではないことがわかります。しかし、その「内容」は同じです。オブジェクトはシリアル化と逆シリアル化のプロセスを経ます。
インテントが保持できるオブジェクトのサイズは無制限ではないことに注意してください。実際の開発では、送信されるデータのサイズを開発者自身で見積もる必要があります。
Parcelable オブジェクトの転送は、Serializable オブジェクトの転送と似ており、同じデポジット操作と取得操作を使用します。
活動に関する面接の質問
1. リターンスタックについて話す
まず、Android がアクティビティを管理するために Task を使用することを理解してください。Task は、スタックに保存されているアクティビティのコレクションです。このスタックはリターン スタックと呼ばれます。新しいアクティビティが開始されるたびに、それはスタックの一番上に配置されます。をクリックします。バックバックするか、アクティビティの終了関数を呼び出すときに、スタックの一番上にあるアクティビティがスタックからポップアウトされ、スタックにプッシュされた前のアクティビティがスタックの一番上に移動します。システムは常にスタックの最上位にアクティビティを表示します。
2. アクティビティのライフサイクルについて話しますか?
- onCreate() メソッド: アクティビティが初めて作成されるときに呼び出され、レイアウトの読み込み (setContentView) やイベントのバインド (findViewById) などの初期化操作を実行することがよくあります。アクティビティが作成中であることを示します。
- onStart() メソッド: アクティビティが非表示および表示されるときに呼び出され、アクティビティが開始されていることを示します。このとき、アクティビティは表示されていますが、フォアグラウンドにはありません。
- onResume() メソッド: アクティビティがユーザーと対話する準備ができたときに呼び出されます。アクティビティがフォーカスを取得したことを示し、この時点でアクティビティが表示され、フォアグラウンドに表示されます。
- onPause() メソッド: システムが別のアクティビティを開始または再開する準備ができたときに呼び出されます。アクティビティが停止中であることを示し、データの保存やアニメーションの停止などの操作が可能です。
- onStop() メソッド: アクティビティが完全に非表示になったときに呼び出されます。アクティビティが停止しようとしていることを示します。
- onDestory() メソッド: アクティビティが破棄される前に呼び出され、アクティビティが破棄されようとしていることを示し、多くの場合、リサイクル作業とリソースの解放が行われます。
- onRestart() メソッド: アクティビティが停止状態から実行状態に変化する前に呼び出されます。アクティビティがまもなく再起動されることを示します。
3. アクティビティの存続期間について話す
アクティビティのライフサイクルは、次の 3 つの部分に分かれています。
- 一生
- 目に見える寿命
- フォアグラウンドの寿命
完全なライフタイム: onCreate() メソッドと onDestory() の両方が完全なライフタイム内にあります。一般に、アクティビティは onCreate() メソッドでさまざまな初期化操作を完了し、onDestory() メソッドでメモリ解放操作を完了します。
**可視の有効期間: **onStart() メソッドと onStop() メソッドは可視の有効期間であり、アクティビティはユーザーに表示されますが、ユーザーと対話することはできません。リソースは onStart() メソッドでロードされ、リソースは onStop() メソッドで解放されます。
**フォアグラウンドの有効期間: **onResume メソッドと onPause メソッドはフォアグラウンドの有効期間です。フォアグラウンドの有効期間中、アクティビティは実行されており、ユーザーと対話できます。
4. アクティビティが onPasue() 内にある場合、どのような操作を実行できますか?
- ユーザーはアクティビティに戻り、onResume() メソッドを呼び出し、再度実行します。
- ユーザーが他のアクティビティを開くと、onStop() メソッドが呼び出されます。
- システム メモリが不足しており、より高い権限を持つアプリケーションにはメモリが必要です。アクティビティはシステムによってリサイクルされます。
- ユーザーが onStop() アクティビティに戻り、再びフォアグラウンドに表示されると、システムは呼び出します。
onRestart() -> onStart() -> onResume() 然后重新running
アクティビティが終了すると (finish() メソッドを呼び出して)、onDestory() メソッドが呼び出されて、占有されているすべてのリソースが解放されます。
ライフサイクル切り替えプロセス
- アクティビティの開始 onCreate->onStart->onResume
- アクティビティが別のアクティビティを開いたとき、どのメソッドがコールバックされますか? ActivityB が完全に透過的である場合はどうなりますか? ダイアログ アクティビティが開始された場合はどうなりますか? A:onPause->B:onCreate->B:onStart->B:onResume->A:onStop ActivityB が完全に透過的またはダイアログ アクティビティの場合、onStop は呼び出されません。
- 新しいアクティビティを開始した後、古いアクティビティに戻ります。 B:onPause->A:onRestart->A:onStart->A:onResume->B:onStop->B:onDestory
- 画面をオフにする/ホームボタンを押します: onPause->onStop
- アクティビティがホーム キーを押してデスクトップに切り替えた後、アクティビティに戻ってどのメソッドをコールバックするか。onPause ->onStop ->onRestart ->onStart ->onResume
- アクティビティが戻るキーを押して onPause->onStop->onDestory に戻るときにコールバックされるメソッドはどれですか
アクティビティの優先順位
- 可視かつインタラクティブ (フォアグラウンドのアクティビティ): 最優先でユーザーと対話します。
- 表示可能だがインタラクティブではない (表示可能だがフォアグラウンドアクティビティではない): たとえば、現在のアクティビティがダイアログアクティビティを開始する場合、現在のアクティビティは表示されますがインタラクティブではありません。
- バックグラウンド アクティビティ: onStop など、一時停止されているアクティビティの優先度は最も低くなります。システムメモリが不足すると、対象アクティビティが存在するプロセスを優先度の低いものから高いものへと強制終了します。
5. メモリ不足によりリサイクルされた後、優先度の低いアクティビティを破棄される前の状態に戻すにはどうすればよいですか?
優先度の低いアクティビティは、メモリ不足のため (水平画面と垂直画面の切り替え処理中) リサイクルされた後に再度開かれ、アクティビティが再構築されます。
異常な状況によりアクティビティが終了すると、システムはonSaveInstanceState
現在のアクティビティの状態を保存するメソッドを呼び出します。このメソッドは onStop の前に呼び出され、onPause メソッドとはタイミング関係がありません。
異常終了したアクティビティが再構築されるとonRestoreInstanceState
メソッドが呼び出され(このメソッドはonStartの後にあります)、アクティビティの破棄時に保存されたBundleオブジェクトのパラメータがメソッドとメソッドに同時にonSaveInstanceState
渡されます。このメソッドは、の前に呼び出されます。onCreate
onRestoreInstanceState
onStart
onRestoreInstanceState(Bundle savedInstanceState)
したがって、再構築されているかどうかを判断し、リカバリのためにデータを取り出すためonCreate((Bundle savedInstanceState)
に使用できます。ただし、からデータを取得するActivity
場合は、最初にそれが空かどうかを判断する必要があることに注意してください。onCreate
savedInstanceState
onRestoreInstanceState
補足:onCreateとActivityの状態を復元するメソッドの違いonRestoreInstanceState
:メソッドのコールバックはバンドルオブジェクトが空ではないことを示しており、空でない判定を加える必要はないが、onCreateは非null判定が必要である。
6.onSaveInstanceState()
話しかけるonRestoreIntanceState()
2 つのメソッドonSaveInstanceState() はライフサイクル メソッドではないため、必ずしもトリガーされるわけではありません。アプリケーションが予期しない状況 (メモリ不足、ユーザーがホーム ボタンを直接押したなど) に遭遇し、システムがアクティビティを破棄すると、onSaveInstanceState() が呼び出されます。このメソッドは onStop の前に呼び出され、onPause とのタイミング関係はありません。ただし、アプリケーションでリターン キーを押すなど、ユーザーがアクティブにアクティビティを破棄すると、onSaveInstanceState() は呼び出されません。この場合、ユーザーの動作によってアクティビティの状態を保存する必要がないと判断されるためです。
onSaveInstanceState()
タイミング: (1) ユーザーがホームボタンを押す (2) 水平画面と垂直画面を切り替える (3) 電源ボタンを押す (画面表示をオフにする) (4) メモリ不足により優先アクティビティが強制終了される
onRestoreInstanceState()システム例外によって破棄されたアクティビティが再構築されると、onRestoreInstanceState または onCreate メソッドが呼び出されて復元され、onRestoreInstance メソッドと Oncreate メソッドに渡された Bundle オブジェクトは破棄時に onSaveInstanceState によって保存され、onRestoreInstanceState は onStart の後にあります。 。
7. onSaveInstanceState() と onPause() の違いは何ですか?
onSaveInstanceState()
一時的な状態を保存する場合にのみ適していますが、onPause()
データの永続的な保存には適しています。
8. 水平画面と垂直画面を切り替える過程で呼び出される関数について説明します。
ここでの活動は破壊されたことを忘れないでください。onPause ->onSaveInstanceState ->onStop ->onDestory() ->onCreate ->onStart ->onRestoreInstanceState ->onResume
9. 縦横画面切り替え時にアクティビティが破壊されて切り替わらないようにする方法(設定変更)
AndroidManifest ファイルのアクティビティで (configChanges) 属性を指定することにより、次のようになります。
android:configChanges = “orientation| screensize”
水平画面と垂直画面が切り替わったときにアクティビティの破棄と再構築を回避しますが、onConfigurationChanged() メソッドをコールバックします。
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
Android configChanges のすべての属性の説明は次のとおりです。
“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。(这不应该常发生。)
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。(这不应该常发生。)
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变
10. Activity の 4 つの起動モードについて教えてください。
- 標準モード (標準モード): 通常の起動モード。アクティビティが起動されるたびにインスタンスが作成されます。
- シングルトップモード(スタックトップモード):アクティビティ起動時にタスクスタックの先頭がアクティビティであるかどうかを判定し、アクティビティの場合はインスタンスを作成せず、onNewIntent(インテント)メソッドを実行します。コールバックされない場合、インスタンスが作成されます
- シングルタスク モード (スタック内モード): アクティビティが開始されると、アクティビティが指定されたスタック内にある限り、インスタンスは作成されず、onNewIntent(intent)** メソッドがコールバックされます。存在しない場合は指定したスタックが存在しないかを判断し、スタックを作成してActivityのインスタンスをプッシュし、指定したスタックが存在する場合はスタックに直接プッシュします。
- singleInstance モード (シングル インスタンス モード): このモードでは、Activity インスタンスを作成するときにスタックが直接作成され、スタック内には Activity インスタンスのみが存在します。その後、どのアプリケーションがアクティビティを開始しても、スタック内のインスタンスのみが呼び出されます。
11.singleTop と singleTask の違いとそのアプリケーション シナリオについて話す
singleTop モードの意味は (上記の質問を参照)、singleTask モードの意味は (上記の質問を参照)
したがって、この 2 つの違いは次のとおりです。
- singleTop モード: このモードでは、現在開始されているアクティビティがスタックの最上位にあるかどうかのみが判断されるため、タスク スタック内に同じアクティビティの複数のインスタンスが存在する可能性があります。このモードのアクティビティは、デフォルトで属するタスク スタックに入り、開始します。タスク スタックの変換は必要ありません。一般的に、急速な連続クリックを防止し、複数のアクティビティ インスタンスを作成するために使用されます。
- シングルタスク モード: このモードでは、現在開始されているアクティビティが現在指定されているスタックにあるかどうかが判断されるため、タスク スタックにはアクティビティ インスタンスが 1 つだけ存在します。このモードでは、アクティビティは taskAffinity を通じて必要なタスク スタックを指定できます。これには、ホームページやログイン ページでよく使用されるタスク スタックの変換が含まれる場合があります。それは、ホームページに入った後にどれだけ多くのアクティビティを入力しても、ホームページに戻ったときに、やはりホームページを終了してアプリケーションを直接終了する必要があるからです。このモードでは、スタック内で開始されるアクティビティより上のすべてのアクティビティがスタックからポップアウトされます。
12. onNewIntent() をいつ呼び出すか?
呼び出しの機会は 2 つあります。つまり、singleTop モードでアクティビティを開始する場合と、singleTask モードでアクティビティを開始する場合です。singleTop モード: 開始されたアクティビティがタスク スタックの最上位にある場合、onNewIntent メソッドがコールバックされます。singleTask モード: 開始されたアクティビティがタスク スタックに存在する場合、onNewIntent メソッドがコールバックされます。
13. アクティビティ起動モードのフラグ ビットは何ですか?
- FLAG_ACTIVITY_SINGLE_TOP: singleTop 起動モードに対応
- FLAG_ACTIVITY_NEW_TASK: シングルタスク モードに対応します
QR コードをスキャンすると、Android のゼロベースの入門から習熟まで、より完全な情報を無料で入手できます。!!
[Tencent 技術チーム制作] Android ゼロベース入門、Android Studio インストール チュートリアル + Android 基本チュートリアルのフルセット
Android プログラミング チュートリアル
入門から慣れるまでの Java 言語の基礎
Kotlin 言語の基礎から入門まで
初心者から使い慣れたものまでの Android テクノロジースタック
Android Jetpack ファミリー バケットの包括的な学習
初心者にとって Android Studio のインストールは難しいかもしれません。次のビデオを見て、インストールと実行を段階的に学習してください。
Android Studioのインストールチュートリアル
Java 段階の学習では、この段階ではビデオ学習に重点を置き、抜け漏れがないか確認するために書籍で補うことをお勧めします。書籍に焦点を当てている場合は、書籍の説明に基づいてコードを入力し、指導ビデオで補足して抜け漏れがないか確認することができます。問題が発生した場合は、Baidu にアクセスしてください。通常、多くの人は使い始めるときに問題に遭遇しますが、その方がより良い回答が得られます。
4大コンポーネントの使い方、Serviceの作成方法、レイアウト方法、簡単なカスタムView、アニメーション、ネットワーク通信などの共通技術などの基礎知識を習得する必要があります。
ゼロベースのチュートリアルの完全なセットが用意されています。必要な場合は、以下の QR コードを追加して無料で入手できます。
Android の基本チュートリアルの完全なセット