ホームページ  >  記事  >  Java  >  Android——アクティビティクラス

Android——アクティビティクラス

高洛峰
高洛峰オリジナル
2016-11-17 14:26:582567ブラウズ

まずアクティビティを紹介します

1.アクティビティとは:

アクティビティは原則として、ユーザーにインタラクティブなインターフェース機能を提供します。 Android アプリケーションの基本的な機能単位です。アクティビティ自体にはインターフェイスがありません。したがって、アクティビティ クラスはウィンドウを作成し、開発者は setContentView(View) インターフェイスを介してアクティビティによって作成されたウィンドウに UI を配置できます。アクティビティが全画面ウィンドウを指している場合は、次のような他の方法でも実装できます。フローティング ウィンドウ ( windowIsFloating のテーマ コレクションを通じて)、または他のアクティビティに埋め込まれます (ActivityGroup を使用)。このアクティビティは別個のアクティビティであり、ユーザー操作を処理するために使用されます。ほぼすべてのアクティビティはユーザーを処理する必要があります

2. アクティビティのライフサイクル

Android——アクティビティクラス

public class Activity extends ApplicationContext {

protected void onCreate(Bundle savedInstanceState);
 
protected void onStart();
 
protected void onRestart();
 
protected void onResume();
 
protected void onPause();
 
protected void onStop();
 
protected void onDestroy();

}

写真からわかるように:

アクティビティの通常の起動プロセス中、これらのメソッドを呼び出す順序は onCreate -> です。 ; onStart -> onResume; アクティビティが終了すると、メソッド シーケンスは onPause -> onStop -> onDestroy になります。次に、割り込み処理 (電話の着信など) の場合は onPause -> onStop、現在のアプリケーションが半透明またはダイアログのテーマの場合は onStart -> onResume になります。 、その後、回復中に割り込みは onPause、onResume になります。

そのため、「他のアプリにはメモリが必要です」については、携帯電話がアプリケーションを実行しているときに、電話やテキストメッセージの着信があるか、電源が供給されていない可能性があり、この時点ではプログラムが中断され、優先されます。さらに、システムは、少なくとも一部の機能 (通話など) を保証する必要があるため、リソースが不足すると強制終了される可能性があります。

システムにおけるメソッドの役割とやるべきこと:

onCreate: ここでインターフェースを作成し、データの初期化作業を行います。

onStart: このステップでは、「ユーザーには表示されますが、対話型ではありません」になります。 ;

onResume: ユーザーと対話型になります (アクティビティ スタック システムはスタックを通じてこれらのアクティビティを管理します。つまり、現在のアクティビティはスタックの最上位にあり、実行後にスタックがポップされると、アクティビティは元のアクティビティに戻ります)前のアクティビティ);

onPause: to このステップは表示されますが対話的ではなく、システムはアニメーションやその他の CPU を消費するものを停止します。上記の説明から、データの一部をここに保存する必要があることはすでにわかっています。これは、現時点ではプログラムの優先度が低下し、システムによって取り戻される可能性があるためです。ここで保存したデータはonResumeで読み出す必要があります。

onStop: 非表示になり、次のアクティビティでカバーされます

onDestroy: これは、他のクラスが終了メソッドを呼び出すか、スペースを節約するために一時的に作成される可能性があります。それを終了するには、 isFinishing() を使用して判断できます。スレッド内で進行状況ダイアログを実行している場合は、onDestroy でキャンセルしてください。それ以外の場合、スレッドの終了時にダイアログの cancel メソッドを呼び出すと例外がスローされます。

OnPause、onstop、onDestroy の 3 つの状態では、アクティビティがシステムによって強制終了される可能性があります。

3. アクティビティ間の通信

Android では、異なるアクティビティ インスタンスが 1 つのプロセスで実行される場合もあれば、異なるプロセスで実行される場合もあります。したがって、アクティビティ間でメッセージを渡すための特別なメカニズムが必要です。 Android では、Intent オブジェクトを使用してメッセージを表します。Intent オブジェクトには、メッセージの宛先だけでなく、メッセージの内容も含まれます。これは、受信者のアドレスだけでなく、特定の内容も含める必要がある電子メールと似ています。 。 Intent オブジェクトの場合、メッセージ「宛先」は必須ですが、内容はオプションです。

インテントは、操作のアクション、アクションに関係するデータ、および追加データを記述する責任を負い、このインテントの記述に基づいて対応するコンポーネントを見つけ、そのインテントを呼び出し側コンポーネントに渡します。コンポーネントの呼び出しを完了します。したがって、ここでは Intent がメディア仲介者の役割を果たし、具体的には相互に呼び出しているコンポーネントに関連する情報を提供し、呼び出し元と呼び出し先の間の分離を実現します。

アプリケーションでは、次の 2 つの形式でインテントを使用できます:

直接インテント: コンポーネントの属性を指定するインテント (setComponent(ComponentName) または setClass(Context, Class) を呼び出して指定します)。特定のコンポーネント クラスを指定すると、アプリケーションは対応するコンポーネントを開始するように通知されます。

間接インテント: cocoment 属性を指定しないインテント。これらのインテントには、システムがこの情報に基づいて、利用可能なすべてのコンポーネントの中からこのインテントを満たすコンポーネントを決定できるように、十分な情報が含まれている必要があります。
直接インテントの場合、ターゲット コンポーネントがすでに明確であるため、Android は解析する必要がありません。

Android が解析する必要があるのは、これらの間接的なインテントです。解析を通じて、インテントは、インテントを処理できるアクティビティ、IntentReceiver、またはサービスにマッピングされます。インテント解析メカニズムは主に、AndroidManifest.xml に登録されているすべての IntentFilter とその中で定義されているインテントを検索し、最終的に一致するインテントを見つけます。

4. アクティビティのインテント フィルター

インテント フィルターは、コンポーネントが受信するインテント オブジェクトの種類を android.content.IntentFilter クラスに抽象化します。 Android の AndroidManifest.xml 設定ファイルでは、 ノードを介してアクティビティのインテント フィルタを指定し、アクティビティが応答できるインテントのタイプをシステムに伝えることができます。

startActivity(intent)を使って別のActivityを開始する際、インテントオブジェクトのComponentプロパティを直接指定すると、Activity ManagerはそのComponentプロパティで指定されたActivityを開始しようとします。それ以外の場合、Android はインテントの他のプロパティを使用して、システムにインストールされているすべてのアクティビティから最も一致するものを見つけます。適切なアクティビティが見つからない場合、アプリケーションはシステムによって例外がスローされます。マッチングプロセスは次のとおりです:

Android——アクティビティクラス

5. アクティビティスタック管理

Android はアクティビティ管理にスタックを使用します。これは、このアクティビティが存在するとき、スタックの最上位にあるアクティビティは 1 つだけであることを意味します。破棄された場合、次のアクティビティのみがスタックの一番上にフロートされる可能性があります。または、新しいアクティビティが作成された場合、古いアクティビティはスタックにプッシュされてシンクされます。アクティビティは Android プログラムのプレゼンテーション層です。プログラムの各表示画面がアクティビティになります。実行中のアクティビティはスタックの最上位にあり、実行状態にあります。

Android——アクティビティクラス

プログラム内で Activity.finish() メソッドが呼び出されるとき、結果はユーザーが BACK キーを押したときと同じになります。つまり、Activity インスタンスが「リサイクル」できることがアクティビティ マネージャーに伝えられます。次に、アクティビティ マネージャーはスタックの 2 番目の層でアクティビティをアクティブ化し、元のアクティビティをスタックの 2 番目の層にプッシュして、実行状態から一時停止状態に移行します。

6. アクティビティ読み込みモード

standard、singleTop、singleTask、singleInstance (最初の 2 つはグループ、最後の 2 つはグループ)、デフォルトは standard

standard: つまり、インテントは新しいインスタンスなので、ジャンプするたびに新しいアクティビティが生成されます。

singleTop: も新しいインスタンスを送信しますが、標準との違いは、要求されたアクティビティがまさにスタックの最上位にある場合 (アクティビティが singleTop として構成されている場合)、新しいインスタンスは構築されないことです。

singleTask: および次の場合singleInstance はインスタンスの作成のみです。インテントが到着し、singleTask に設定されたアクティビティを作成する必要がある場合、システムはスタックにアクティビティのインスタンスがすでに存在するかどうかを確認します。存在する場合は、インテントを直接送信します。

singleInstance:

まず、タスクの概念を説明します。タスクは複数のアクティビティに配置できるスタックとして考えることができます。たとえば、アプリケーションが開始されると、Android はタスクを作成し、アプリケーションのエントリ アクティビティを開始します。その後、このタスク内でのみ他のアクティビティがそのインターフェイスで呼び出されます。では、複数のタスク間でアクティビティを共有する場合はどうすればよいでしょうか?たとえば、ツアーガイドサービスアプリケーションを開くと、その中にGOOGLEマップを開くアクティビティがあり、ホームボタンを押してメインメニューに戻り、再度GOOGLEマップアプリケーションを起動すると、先ほどの地図が表示されます。実際には、これは同じアクティビティです。実際には、これはsingleInstanceを導入しています。 singleInstance モードは、Activity を単独でスタックに置くことで、スタック内に Activity が 1 つだけ存在し、この Activity によって異なるアプリケーションのインテントが受信されて表示されることで共有が実現されます。もちろん、これらのアプリケーションは破壊されていないことが前提なので、先ほどHOMEキーを押した場合はリターンキーを押しても無効になります。

7. アクティビティ ジャンプ

アクティビティ ジャンプ、結果は返されません

これは、アクティビティにジャンプする最も簡単な方法です。 1 つのアクティビティから別のアクティビティを開始するには、直接 startActivity(new Intent(current Activity.this, next Activity.class)) を実行します。

アクティビティはジャンプしてデータ/結果を返します

データまたは結果を返す必要がある場合は、startActivityForResult (Intent 意図、int requestCode) を使用します。 requestCode の値はカスタマイズされ、ジャンプのターゲット アクティビティを識別するために使用されます。ジャンプ ターゲット アクティビティが行う必要があるのは、データ/結果を返すことだけです。setResult(int resultCode) はデータなしの結果のみを返すか、setResult(int resultCode, Intent data) は両方を返します。返されたデータ/結果を受け取る処理関数は onActivityResult(int requestCode, int resultCode, Intent data) です。ここでの requestCode は startActivityForResult の requestCode で、resultCode は setResult の resultCode で、返されるデータは data です。

** setResult の後に、finish() を呼び出して現在のアクティビティを破棄する必要があることに注意してください。そうしないと、元のアクティビティに戻ることができず、元のアクティビティの onActivityResult 関数を実行して、現在のアクティビティが応答しないことを確認できません。 。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。