Task 1~5を実施しながら、各演習課題を実施・確認・提出して下さい。実行確認は、TA・教員からのチェックを受けて下さい。
【チェック合格条件】各スクリーンショットと内容が一致すること(色は問わない)
今回の目標はAndroid Studioを用いた開発環境とその補助機能になれることです。本資料を注意深く読めば、十分実施できる内容です。Android Studioの使い方に関するより詳細な説明はAndroid Developersサイトを参照することをお勧めします(それでも分からない場合はネット・○○GPTで検索してみましょう)。
Task 1では、使用端末(Tablet or Smartphone or Emulator)の設定をします。
Task 2では、最初のAndroidアプリ「Hello World」を作成し、アンドロイドデバイス(実機)もしくはエミュレータ上で実行します。
ここでは、簡単な機能紹介しか行いません。使っていけば、慣れていきます。Android Studioの使い方に関するより詳細な説明はAndroid Developersサイトを参照することをお勧めします(それでも分からない場合はネット・○○GPTで検索してみましょう)。
Androidアプリ開発では、プログラミング(実装したい機能・動作など)はJavaファイルとして実装、レイアウトのデザイン(実装したいGUI・画面構成など)はXMLファイルとして実装します。
setContentView(R.layout.activity_main);
をコメントアウトして、アプリを起動するとなにが起きるかを確かめてみましょう。
「CTRL」+「SPACE」キーを押下するとコードアシストのpop-upが起動します。
エディタ左側のNavigation windowからmanifests
, layout
, menu
, values
の各項目を展開(►)すると、アプリの設定・内容・属性の定義などに用いる複数のXML形式のファイルを確認することができます。
Manifestがアプリケーションに関する必要不可欠な情報を表現し、それをAndroidシステムに伝え、アプリケーションのコードが実行される前に、この情報をシステムが持っていなければなりません。Manifestの主な役割は以下の通りです。
resフォルダはアプリケーションリソース(resources)で構成されています。Resourcesには、画像(drawable)・画面設計(layout)・メニュー(menu)・値(values)が含まれています。
valueは寸法(dimens.xml
)・文字列(strings.xml
)・スタイル(styles.xml
)の3つがあります。
アプリケーション全体で繰り返して利用する情報をXMLで定義します。例えば、デフォルトのタイトル”Sample1_1”の文字列は、resフォルダ内のstrings.xml
で定義されています。同様に、デフォルトの“Hello World!”の文字列は、resフォルダ内のstrings.xml
で定義されています。
文字列の場合には、専用エディタも提供されています。
「Hello IT Practice1」アプリを実装し、Landscapeモード(横向き)にした時の結果のスクリーンショットを取りましょう。
activity_main.xml
タブをクリック、もしくはresources
ディレクトリ直下のlayout
ディレクトリ内にあるactivity_main.xml
を選択してGUI(グラフィカル・ユーザ・インタフェース)設計ツールを開きましょう。
AndroidManifest.xmlを読んで、以下の質問に回答しましょう。
Androidではログを取得する機能として、Logcatが用意されています。下記のように、Logcatのタグ(TAG)の部分に現在実行中のクラス名を書くのが定番となっています。
private static final String TAG = "SampleActivity1_1";
public class SampleActivity1_1{
/** Logcatのタグに含める文字列. */
private static final String TAG = "SampleActivity1_1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG,"メッセージ");
Log.d(TAG,"メッセージ");
Log.i(TAG,"メッセージ");
Log.w(TAG,"メッセージ");
Log.e(TAG,"メッセージ");
}
}
上記メッセージは、Logcatビューで簡単に確認することができます。
Logcatのビューが表示されていない場合は Android Studio [View]→[Tool Window]→[Android]で表示してください。
Logcatではタグでログを絞り込むことができるので、機械的に設定しておけば、着目したいクラスのログがすぐに絞り込めて便利です。ログを出力するのとしないのとでは、開発効率がかなり違うので、できるだけログを活用しましょう!
ログを入れたい場所に、以下のいずれかの関数を各用途に合わせて使用しましょう。
/* 簡易メッセージ */
Log.v(TAG,"メッセージ");
/* デバッグメッセージ */
Log.d(TAG,"メッセージ");
/* 情報 */
Log.i(TAG,"メッセージ");
/* 警告 */
Log.w(TAG,"メッセージ");
/* エラー */
Log.e(TAG,"メッセージ");
SampleActivity1_1プロジェクトのまま、上記の通りにコードを追加する。
Android Studio Dolphin 6以降のlog level および、Tagによるフィルタの設定方法はUser guideを参照して下さい。
ユーザーがアプリの内外を移動してからアプリに戻ると、アプリ内のActivityインスタンスはライフサイクルのさまざまな状態の間を遷移します。Activityクラスには、システムがActivityを作成、停止、再開している、またはActivityが存在するプロセスを破棄しているなど、状態が変化したことをActivityが認識できるようにするコールバックが備えられています。
ライフサイクル コールバック メソッド内で、ユーザーがActivityを離れてから戻った場合のActivityの動作を宣言できます。たとえば、ストリーミング動画プレーヤーを作成している場合は、ユーザーが別のアプリに切り替えたときに動画を一時停止し、ネットワーク接続を終了するようにできます。ユーザーが戻ってきた際に、ネットワークに再接続して、ユーザーが同じ場所から動画の再生を再開できるようにします。つまり、各コールバックにより、特定の状態変化に対して適した作業を実行できます。適切な作業を適切なタイミングで行い、移行を正しく処理することで、アプリの堅牢性とパフォーマンスが向上します。 たとえば、ライフサイクル コールバックを適切に実装することで、アプリで次の状況を回避できます。
Activityのライフサイクルにおけるステージ間を移動するために、Activityクラスには onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy()の 6 つのコールバックのコアセットがあります。Activityが新しい状態になると、これらの各コールバックが呼び出されます。以下の図は、ライフサイクルを視覚的に示したものです。
onCreate()は、システムが最初にActivityを作成したときに呼び出されます。Activityが作成されると、Activityは作成済みの状態になります。 onCreate()メソッドでは、Activityのライフサイクルの全期間で1回のみ実行する必要がある基本的なアプリの起動ロジックを実行します。例えば、onCreate() の実装では、データをリストにバインドし、Activityを ViewModel に関連付け、一部のクラススコープ変数をインスタンス化します。このメソッドはパラメータsavedInstanceStateを受け取ります。これは、Activityの以前に保存された状態を含むBundleオブジェクトです。Activityがこれまで存在しなかった場合、Bundleオブジェクトの値はnullになります。
Activityが開始状態になると、システムはこのコールバックを呼び出します。アプリがActivityをフォアグラウンドに移動して操作可能な状態にする準備を行うと、onStart() の呼び出しによってActivityがユーザーに表示されます。 たとえば、このメソッドでは、UI を保持するコードをアプリが初期化します。
Activityが再開状態(実行状態)になるとフォアグラウンドに移動し、システムは onResume() コールバックを呼び出します。これは、アプリがユーザーと対話する状態です。フォーカスがアプリから他の対象に移動する状況が発生するまで、アプリはこの状態を保持します。このようなイベントには、電話の着信、別のActivityへのユーザーの移動、デバイス画面をオフにする操作などがあります。
Activityが再開状態に移行すると、Activityのライフサイクルに関連付けられているライフサイクル対応コンポーネントは、すべて ON_RESUME イベントを受け取ります。この時点で、ライフサイクル コンポーネントは、コンポーネントが表示されフォアグラウンドにある状態で実行する必要がある機能(カメラ プレビューの開始など)を有効にできます。
onResume()後の再開状態(実行状態)では、Activityがフォアグラウンドで実行され、ユーザはそこで操作を行うことができます。
割り込みイベントが発生すると、Activityは一時停止状態になり、システムは onPause() コールバックを呼び出します。
ユーザーがActivityを離れることを最初に示すために、システムはこのメソッドを呼び出します(Activityが破棄されることを意味するとは限りません)。これは、Activityがフォアグラウンドにないことを示します(ユーザーがマルチウィンドウ モードの場合は、Activityが引き続き表示されます)。 Activityが一時停止状態であり、間もなく再開する予定である場合は、onPause() メソッドを使用して、続行しない(または適度に続行する)必要がある操作を一時停止または調整します。
onPause後の一時停止状態では、Activityは別のActivityによって部分的に隠されています。フォアグラウンドにある別のActivityは半透明になっているか、全画面をカバーしていません。 一時停止したActivityはユーザの入力を受信せず、一切のコードを実行できません。
ユーザーに表示されなくなったActivityは、停止状態になり、システムは onStop() コールバックを呼び出します。これは、新たに開始されたActivityが画面全体を占有する場合などに発生します。Activityの実行が終了し、間もなく消滅する場合に、システムによって onStop() も呼び出されることがあります。
Activityが停止状態に移行すると、Activityのライフサイクルに関連付けられているライフサイクル対応コンポーネントは、ON_STOP イベントを受け取ります。この時点で、ライフサイクル コンポーネントは、コンポーネントが画面に表示されていない間に実行する必要のない機能を停止できます。
onStop後の停止状態では、Activityは完全に隠され、ユーザには表示されません。バックグラウンドに存在するとみなされます。 停止状態の間、Activity インスタンスとメンバ変数のようなそのすべての状態情報は保持されますが、Activity インスタンスは一切のコードを実行できません。
名前そのままActivityの再表示の際に呼び出される。これが呼び出された後にはonStart()->onResume()と続いて呼び出される。アプリキル(Destroy)される時には呼ばれることはない。
onDestroy() はActivityが破棄される前に呼び出されます。このコールバックは、次のいずれかの理由でシステムによって呼び出されます。
Sample1_1プロジェクトのまま、コードアシストを利用しながら、下記名称のメソッドを追加しましょう。