初心者向けのアクティビティ


このセクションの紹介:

このセクションでは、Android の 4 つの主要コンポーネントの 1 つである Activity (アクティビティ) について説明します。まず、Activity の公式の概要を見てみましょう。 PS: 公式 Web サイトのドキュメント: Activity

は次のように紹介されています: 意味について:

アクティビティは、ユーザーが対話型操作を実行できるようにする画面上の領域を提供します。それ。 、 電話をかける、写真を撮る、メールを送信する、地図を表示するなどです。アクティビティは、ユーザー インターフェイスを描画するウィンドウとして理解できます。 このウィンドウは画面全体を埋めることも、画面よりも小さくすることも、他のウィンドウの上に浮かせることもできます。

上記の段落から、次の情報を取得できます:

1. アクティビティはユーザー インターフェイスの表示に使用され、ユーザーはアクティビティ インタラクションを通じて関連する操作を完了します2. アプリでは複数のアクティビティが可能です

さて、一般的な紹介はこれで終わりです。さらに詳しく知りたい場合は、引き続き API を読み、このセクションを開始してください~


  1. アクティビティの概念とアクティビティのライフ サイクル図1.jpg

注:

1. onPause() と onStop() が呼び出される前提は です。 新しいアクティビティがオープンしました!前者は古いアクティビティがまだ表示されている場合、後者は古いアクティビティが表示されなくなった場合です。
2. さらに、個人テスト: AlertDialog と PopWindow は上記の 2 つのコールバック メソッドをトリガーしません~


2. Activity/ActionBarActivity/AppCompatActivity の違い:

の説明を始める前に、これら 3 つについて説明しましょう。アクティビティ 1 の作成の違い: 言うまでもなく、Activity は下位バージョンとの互換性のために提案されています。これらはすべて v7 パッケージに含まれています。 ActionBarActivity は、ActionBar~ という名前からもわかるように、5.0 以降は Google によって廃止され、現在は使用されています。 ToolBar... Android Studio でアクティビティを作成すると、デフォルトの継承は AppCompatActivity になります。 もちろん、単に Activity を記述することもできますが、AppCompatActivity は何か新しいものを提供します。 2 つのうちの 1 つを選択してください。お好みでどうぞ~


3.アクティビティ作成プロセス

2.png

追記:

さて、上で述べたように、Activity と AppCompatActivity を継承できますが、後者は Just got を提供します新しいものをいくつか! さらに、Android で 4 つの主要コンポーネントを定義している限り、それらを使用するかどうかに関係なく、AndroidManifest.xml でそれらを比較する必要があることに注意してください。 このコンポーネントは宣言する必要があります。宣言しない場合、プログラムは実行時に直接終了し、ClassNotFindException を報告します...


4. onCreate() の 1 つのパラメーターと 2 つのパラメーターの違い:

as を使用する友人は、Act の onCreate() メソッドを書き換えると、これには 2 つのパラメーターがあることがわかると思います:

3.png

ただし、通常、パラメータは 1 つだけです:

4.png

さて、これは 5.0 で提供される新しいメソッドです。これを使用するには、まず設定ファイルでアクティビティの属性を設定する必要があります:

android:persistableMode= persistAcrossReboots"

これにより、アクティビティは永続化する機能を持ちます。通常、他の 2 つのメソッドでそれを使用します:

public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
public void onRestoreInstanceState(Bundle SavedInstanceState, PersistableBundlepersistentState)

これら 2 つのメソッドの名前に精通している友人もいると思います: 前者のメソッドは次の状況で呼び出されます:

  1. ホーム ボタンをクリックしてホームページに戻るか、長押しして他のプログラムを実行することを選択します
  2. 電源ボタンを押して閉じます 画面
  3. が新しいアクティビティ
  4. を開始すると、水平画面と垂直画面を切り替えるときに必ず実行されます。これは、水平画面と垂直画面を切り替えるときに、Actが最初に破棄され、次に再実行されるためです。作成した。 重要な原則: システムが「許可なしに」アクティビティを破棄すると、システムによって onSaveInstanceState が呼び出されます。 データを保存する機会をシステムが提供する必要があるため、これはシステムの責任です (保存するかどうかはわかりません)。

後者のメソッドは、onCreate のように前者によって保存されたデータを取得することもできます。 通常、onStart() と onResume() の間に実行されます。 データの取得と保存の方法が 2 つあるのは、Act が終了せずにジャンプすることを避けるためです。 次に、onCreate() メソッドを使用せず、保存されたデータを取り出したいとします~

戻る: このページに戻る Activity には永続化する機能があり、追加された PersistableBundle パラメーターによりこれらのメソッドが作成されます。 システムシャットダウン後に再起動するデータ復元機能があります。 !そして、それは他のシリアル化操作には影響しません、くそー、 具体的にどのように実装されているかはまだ分かりませんが、別ファイルに保存したのかもしれません~!後ほど原理が分かりましたらお知らせします! さらに、API バージョンは >=21 である必要があります。これは、有効であるためにはバージョン 5.0 以降である必要があることを意味します~


4. アクティビティを開始するいくつかの方法

Android では、新しいアクティビティを開始できます。次の 2 つの方法では、ここでの開始方法ではなく、どのように開始されるかに注意してください。 スタートモード! !明示的起動と暗黙的起動に分かれる!

1. 明示的な起動: 次のように記述されたパッケージ名で起動します:

① 最も一般的なもの:

startActivity(new Intent(current Act.this, 起動される Act.class) ); ) ;
intent.setComponent(cn) ;
startActivity(intent) ;
Intentの初期化時にパッケージ名を指定します:


Intenttent = new Intent("android.intent.action.MAIN") );
intent .setClassName("現在の Act の完全修飾クラス名", "開始 Act の完全修飾クラス名");
startActivity(intent);

2. 暗黙的な起動: アクション、カテゴリ、またはインテントフィルターのデータを通じて実装されます。 これは、インテントの インテント フィルター** によって実現されます。このインテントの章で詳しく説明します。 ここで知っておくべきことはこれだけです!

5.png

3. パッケージ名を使用して apk を直接起動する別の方法もあります:

Intenttent = getPackageManager().getLaunchIntentForPackage
("によって最初に起動されるアクティビティの完全修飾クラス名apk");
if(intent != null) startActivity(intent) ;

5. 水平画面と垂直画面の切り替えと状態保存に関する問題

前述したように、アプリが水平画面と垂直画面を切り替えると、現在のアクティビティが破棄され、新しいアクティビティが作成されます。ライフサイクルの中の自分自身 印刷する文を追加する 各メソッドにログインして判定したり、ボタンとTextViewを設定してボタンクリック後のTextViewを変更します。 テキストを表示し、水平画面と垂直画面を切り替えると、魔法のように TextView のテキストが前の内容に戻ることがわかります。 水平画面と垂直画面を切り替えると、Act は次のライフサイクルを経ます:
onPause->onStop->onDestory->onCreate->onStart->onResume
水平画面と垂直画面の切り替え:


1. まず、 水平画面と垂直画面の自動切り替えを無効にする方法について説明します。これは非常に簡単です。AndroidManifest.xml に属性を追加します: android:screenOrientation。 次のオプションの値があります:

  • unspecified: デフォルト値 システムが表示方向を決定します。決定方法はデバイスに関連しているため、デバイスが異なれば表示方向も異なります。
  • ランドスケープ: 横画面表示 (幅が高さより長い)
  • ポートレート: 縦画面表示 (高さが幅より長い)
  • user: ユーザーの現在の優先方向
  • Behind: そして、このアクティビティの下にあるアクティビティの方向は同じです (アクティビティスタック内)
  • センサー: 物理センサーによって決定されます。ユーザーがデバイスを回転すると、画面が縦向きと横向きに切り替わります。
  • nosensor: 物理センサーを無視して、ユーザーがデバイスを回転させてもセンサーが変化しないようにします (「指定されていない」設定を除く)。

2.

水平画面と垂直画面に異なるレイアウトをロードしたい場合:

1) Android は水平画面と垂直画面に応じて異なるレイアウトをロードします。 2 つのレイアウト フォルダーを作成します:

layout-landhorizo​​ntal screen、layout-portvertical screen 次に、これら 2 つのレイアウト ファイルをこれら 2 つのフォルダーに放り込むと、ファイル名は同じになります。Android が自動的に判断して、対応するレイアウトを読み込みます。

2) コード内で独自の判断を行い、必要なものをロードします。

通常、レイアウト ファイルは onCreate() メソッドでロードします。ここで、キー コードは次のようになります。 :

if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){
setContentView(R.layout.horizo​​ntal screen);
}

else if (this.getResources().getConfiguration ( ).orientation ==Configuration.ORIENTATION_PORTRAIT) {
setContentView(R.layout.vertical screen);
}

3. シミュレータを横画面と縦画面に切り替える方法

シミュレータが GM の場合。シミュレータの切り替えボタンを押すだけです。ネイティブ シミュレータの場合は、Ctrl + f11/f12 を押して切り替えます。


4. 状態保存の問題:

前述のように、これはバンドルの SavedInstanceState パラメータを通じて完了できます。 3 つのコア メソッド:


onCreate(Bundle SavedInstanceState);
onSaveInstanceState(Bundle outState);
onRestoreInstanceState(Bundle SavedInstanceState);

onSaveInstanceState() メソッドをオーバーライドして、このバンドルにデータを書き込むだけです。例:

outState.putInt("num",1);

このようにして、onCreate または onRestoreInstanceState で取り出すことができます。内部に保存されているデータですが、取得する前に null かどうかを確認する必要があります。

savedInstanceState.getInt("num");

それでは、好きなようにしてください~


6. システムによって提供される共通アクティビティ

それでは、最後に、いくつかのシステムを添付します。いくつかの共通アクティビティが提供されます。

//1. 電話をかける
//モバイルカスタマーサービス 10086 に電話する
Uri uri = Uri.parse("tel:10086");
Intenttent = new Intent(Intent.ACTION_DIAL, uri);
startActivity(intent) ; );
intent.putExtra("sms_body", "Hello");
startActivity(intent);

///3. MMS を送信する (添付ファイル付きのテキスト メッセージを送信するのと同等)
Intenttent = new Intent(Intent. ACTION_SEND) ;
intent.putExtra("sms_body", "Hello");
Uri uri = Uri.parse("content://media/external/images/media/23");
intent.putExtra(Intent.EXTRA_STREAM) , uri );
intent.setType("image/png");
startActivity(intent);

//4. ブラウザを開きます:
// Google ホームページを開きます
Uri uri = Uri.parse("http: //www .baidu.com");
Intenttent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

///5. メールの送信: (Google サービスを去勢するのは無駄です!!! !)
//someone@domain.com にメールを送信します
Uri uri = Uri.parse("mailto:someone@domain.com");
Intenttent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity( tent);
//「Hello」という内容の電子メールをsomeone@domain.comに送信します
Intenttent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, "someone@domain.com") ;
intent .putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("text/plain");
startActivity(intent);
//複数の人にメールを送信する
Intenttent=new Intent(Intent.ACTION_SEND);
String[] tos = {"1@abc.com", "2@abc.com"} // Recipient
String[] ccs = { "3@abc.com", "4@abc.com"} // CC
String[] bccs = {"5@abc.com", "6@abc.com"}; tent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_BCC, bccs);
intent.putExtra(Intent.EXTRA_SUBJECT, "件名");
tent.putExtra(Intent.EXTRA_TEXT, "Hello");
intent.setType("message/rfc822");
startActivity(intent);

//6. 地図を表示:
//Google マップを開きます 北京、中国の場所(北緯39.9度、東経116.3度)
Uri uri = Uri.parse("geo:39.9,116.3");
Intent 意図 = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//7. 経路計画
// 経路計画: 北京のどこか(北緯 39.9 度、東経 116.3 度)から上海のどこかまで(北緯 31.2、経度 121.4)
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=39.9 116.3&daddr=31.2 121.4");
Intent 意図 = new Intent(Intent .ACTION_VIEW, uri);
startActivity(intent);

//8. マルチメディア再生:
Intenttent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file:///sdcard/foo) .mp3" );
intent.setDataAndType(uri, "audio/mp3");
startActivity(intent);

//SD カード内のすべてのオーディオ ファイルを取得し、最初のオーディオ ファイルを再生します =-=
Uri uri = Uri.withAppendedPath( MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intenttent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//9 にカメラをオンにします。写真を撮る:
// カメラ アプリケーションを開きます
Intenttent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 0);
Bundle extras =tent.getExtras(); = (ビットマップ) extras.get("data") ;

//Another:
//システムカメラアプリケーションを呼び出し、撮影した写真を保存します
Intent 意図 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE)
time = Calendar.getInstance ().getTimeInMillis();
tent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment
.getExternalStorageDirectory().getAbsolutePath()+"/tucue", time + ".jpg")));
startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);

//10. 写真を取得して切り取る
// 写真を取得して切り取る
Intenttent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
intent .putExtra("crop" , "true"); // クリッピングをオンにする
intent.putExtra("aspectX", 1) // クリッピングのアスペクト比は 1:2 です
intent.putExtra("aspectY", 2) );
intent. putExtra("outputX", 20) // 画像の幅と高さを保存します
intent.putExtra("output", Uri.fromFile(new) File("/mnt/sdcard /temp"))); // 保存パス
intent.putExtra("outputFormat", "JPEG") // 戻り値
startActivityForResult(intent, 0);
インテントの意図 = 新しいインテント ("com.android.camera.action.CROP");tent.setClassName("com.android.camera", "com.android.camera.CropImage");
intent.setData(Uri.fromFile("/mnt/sdcard/temp")); putExtra("outputX", 1); // カットのアスペクト比は 1:2 です
intent.putExtra("outputY", 2);
intent.putExtra("aspectX", 20);幅と高さ
intent.putExtra("aspectY", 40);
intent.putExtra("noFaceDetection", true); parse("file:///mnt/sdcard/temp"));
startActivityForResult(intent, 0);

//11. Google マーケットを開く
//Google マーケットを開いてプログラムの詳細ページに直接アクセスします
Uri uri = Uri.parse("market://details?id=" + "com.demo.app");
インテントの意図 = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

//12携帯電話の設定インターフェイスに入ります:
//ワイヤレス ネットワーク設定インターフェイスに入ります (他の人は 1 つの例から推測できます)
Intenttent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS)
startActivityForResult(intent, 0);

//13. apkのインストール:
Uri installUri = Uri.fromParts("package", "xxx", null);
returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

//14.
Uri uri = Uri.fromParts ("package", strPackageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);

//15. 添付ファイルを送信します。 new Intent(Intent.ACTION_SEND) ; ");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//16. 連絡先ページに入ります:
Intenttent = new Intent();
intent .setAction(Intent.ACTION_VIEW);
intent.setData(People.CONTENT_URI);
startActivity(intent);

//17. 指定された連絡先を表示します:
Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id) );//info.id 連絡先個人 ID
Intent 意図 = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(personUri);
startActivity(intent);


このセクションの概要:

さて、これを書くだけでは入門チュートリアルのようには見えませんが、もっと詳しく学ぶのは問題ありません。このセクションの最初の概要についてはここでやめましょう~学習を続けます。これについては、次のセクションのデータ転送、起動モードなどのアクティビティについて説明します~お楽しみに~