Android
アクティビティ
サーチ…
前書き
アクティビティは、ユーザーインターフェイス(UI)を持つ単一の画面を表します 。 Android Appには、複数のアクティビティがある場合があります。たとえば、電子メールアプリケーションには、すべての電子メールを一覧表示するアクティビティ、電子メールコンテンツを表示する別のアクティビティ、さらには新しい電子メールを作成する別のアクティビティがあります。 App内のすべてのアクティビティが連携して、完璧なユーザーエクスペリエンスを実現します。
構文
void onCreate(Bundle savedInstanceState)//アクティビティの開始時に呼び出されます。
void onPostCreate(Bundle savedInstanceState)//アクティビティの起動が完了したとき(onStart()およびonRestoreInstanceState(Bundle)が呼び出された後)に呼び出されます。
void onStart()// onCreate(Bundle)の後に呼び出されるか、またはonRestart()の後にアクティビティが停止したときに呼び出されますが、ユーザに再び表示されます。
void onResume()//あなたのアクティビティがユーザとやり取りを開始するために、onRestoreInstanceState(Bundle)、onRestart()、またはonPause()の後に呼び出されます。
void onPostResume()//アクティビティのレジュームが完了したとき(onResume()が呼び出された後)に呼び出されます。
void onRestart()//現在のアクティビティがユーザに再表示されている(ユーザがそれまでナビゲートしている)ときにonStop()の後に呼び出されます。
void onPause()//アクティビティがバックグラウンドに入っても、まだ(まだ)殺されていないときに、アクティビティのライフサイクルの一部として呼び出されます。
void onStop()//ユーザーが見えなくなったときに呼び出されます。
void onDestroy()//アクティビティが破棄される前に最終的なクリーンアップを実行します。
void onNewIntent(Intent intent)//パッケージのlaunchModeを "singleTop"に設定するアクティビティ、またはstartActivity(Intent)を呼び出すときにクライアントがFLAG_ACTIVITY_SINGLE_TOPフラグを使用した場合に呼び出されます。
void onSaveInstanceState(Bundle outState)// onCreate(Bundle)またはonRestoreInstanceState(Bundle)で状態を復元できるように、アクティビティからインスタンスごとの状態を取得するために呼び出されます(このメソッドによって設定されたBundleは、 )。
void onRestoreInstanceState(Bundle savedInstanceState)//このメソッドは、アクティビティが以前に保存された状態から再初期化されているときにonStart()の後に呼び出されます。
パラメーター
パラメータ | 詳細 |
---|---|
インテント | startActivityと共に使用してアクティビティを起動することができます。 |
バンドル | StringキーからさまざまなParcelable値へのマッピング。 |
コンテキスト | アプリケーション環境に関するグローバルな情報へのインタフェース。 |
備考
アクティビティとは、電話をかける、写真を撮る、電子メールを送信する、地図を表示するなど、何かをするためにユーザーが対話できる画面を提供するアプリケーションコンポーネントです。各アクティビティには、そのユーザーインターフェイスを描画するウィンドウが表示されます。ウィンドウは通常、画面を塗りつぶしますが、画面よりも小さく、他のウィンドウの上に浮いている場合があります。
バックスタック履歴からアクティビティを除外する
オープンできるアクティビティB
があり、さらに多くのアクティビティを開始することができます。しかし、ユーザは、タスクアクティビティをナビゲートするときにそれに遭遇するべきではありません。
最も簡単な解決策は、 AndroidManifest.xml
<activity>
タグに対してnoHistory
属性をtrue
に設定することです。
<activity
android:name=".B"
android:noHistory="true">
次のアクティビティを開始する前にB
がfinish()
呼び出す場合も、この同じ動作がコードから可能です。
finish();
startActivity(new Intent(context, C.class));
noHistory
フラグの一般的な使用法は、 "スプラッシュスクリーン"またはログインアクティビティです。
Androidのアクティビティライフサイクルの説明
MainActivityを持つアプリケーションが、ボタンクリックを使用して次のアクティビティを呼び出すことができると仮定します。
public class MainActivity extends AppCompatActivity {
private final String LOG_TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "calling onCreate from MainActivity");
}
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "calling onStart from MainActivity");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "calling onResume from MainActivity");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "calling onPause from MainActivity");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "calling onStop from MainActivity");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "calling onDestroy from MainActivity");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "calling onRestart from MainActivity");
}
public void toNextActivity(){
Log.d(LOG_TAG, "calling Next Activity");
Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
} }
そして
public class NextActivity extends AppCompatActivity {
private final String LOG_TAG = NextActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
Log.d(LOG_TAG, "calling onCreate from Next Activity");
}
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "calling onStart from Next Activity");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "calling onResume from Next Activity");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "calling onPause from Next Activity");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "calling onStop from Next Activity");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "calling onDestroy from Next Activity");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "calling onRestart from Next Activity");
} }
アプリが最初に作成されるとき
D / MainActivity:MainActivityからonCreateを呼び出す
D / MainActivity:MainActivityからonStartを呼び出す
D / MainActivity:MainActivityからonResumeを呼び出す
呼び出される
画面がスリープすると
08:11:03.142 D / MainActivity:MainActivityからonPauseを呼び出す
08:11:03.192 D / MainActivity:MainActivityからonStopを呼び出す
呼び出されます。そしてもう一度目が覚めると
08:11:55.922 D / MainActivity:MainActivityからonRestartを呼び出す
08:11:55.962 D / MainActivity:MainActivityからonStartを呼び出す
08:11:55.962 D / MainActivity:MainActivityからonResumeを呼び出す
呼び出される
ケース1:メインアクティビティから次アクティビティが呼び出されたとき
D / MainActivity:次のアクティビティを呼び出す
D / MainActivity:MainActivityからonPauseを呼び出す
D / NextActivity:次のアクティビティからonCreateを呼び出す
D / NextActivity:次のアクティビティからonStartを呼び出す
D / NextActivity:次のアクティビティからonResumeを呼び出す
D / MainActivity:MainActivityからonStopを呼び出す
戻るボタンを使用して次のアクティビティからメインアクティビティに戻るとき
D / NextActivity:次のアクティビティからonPauseを呼び出す
D / MainActivity:MainActivityからonRestartを呼び出す
D / MainActivity:MainActivityからonStartを呼び出す
D / MainActivity:MainActivityからonResumeを呼び出す
D / NextActivity:次のアクティビティからonStopを呼び出す
D / NextActivity:次のアクティビティからonDestroyを呼び出す
ケース2:アクティビティが部分的に不明瞭な場合(オーバービューボタンが押された場合)またはアプリがバックグラウンドに移行し、別のアプリが完全にそれを隠す場合
D / MainActivity:MainActivityからonPauseを呼び出す
D / MainActivity:MainActivityからonStopを呼び出す
アプリがフォアグラウンドに戻ってユーザーの入力を受け入れる準備ができたら、
D / MainActivity:MainActivityからonRestartを呼び出す
D / MainActivity:MainActivityからonStartを呼び出す
D / MainActivity:MainActivityからonResumeを呼び出す
呼び出される
ケース3:暗黙のインテントを達成するためにアクティビティが呼び出され、ユーザーが選択を行ったとき。たとえば、共有ボタンが押され、ユーザーが表示されたアプリケーションのリストからアプリを選択する必要がある場合
D / MainActivity:MainActivityからonPauseを呼び出す
アクティビティは表示されますが、アクティブではありません。選択が完了し、アプリがアクティブな場合
D / MainActivity:MainActivityからonResumeを呼び出す
と呼ばれる
ケース4:
アプリケーションがバックグラウンドで(別のフォアグラウンドアプリのリソースを解放するために) 殺されると、アプリケーションが終了する前にonPause (ハニカム前デバイス用)またはonStop (ハニカムデバイス以降)が最後に呼び出されます。
onCreateとonDestroyは、アプリケーションが実行されるたびに一度呼び出されます。しかし、onPause、onStop、onRestart、onStart、onResumeは、ライフサイクル中に何度も呼び出されることがあります。
アクティビティlaunchMode
起動モードは、タスク内の新規または既存のアクティビティの動作を定義します。
可能な起動モードは次のとおりです。
- 標準
- シングルトップ
- シングルタスク
- singleInstance
これは、 <activity/>
要素のandroid manifestでandroid:launchMode
属性として定義する必要があります。
<activity
android:launchMode=["standard" | "singleTop" | "singleTask" | "singleInstance"] />
標準:
デフォルト値。このモードが設定されている場合、常に新しい意図ごとに新しいアクティビティが作成されます。したがって、同じタイプの多くのアクティビティを取得することは可能です。新しいアクティビティがタスクの先頭に配置されます。異なるアンドロイドバージョンにはいくつかの違いがあります。アクティビティが別のアプリケーションから開始する場合、アンドロイド<= 4.4では開始アプリケーションと同じタスクに配置されますが、> = 5.0の新しいタスクが作成されます。
シングルトップ:
このモードは、 standard
とほぼ同じです。 singleTopアクティビティの多くのインスタンスを作成できました。違いは、現在のスタックの先頭にアクティビティのインスタンスがすでに存在する場合、新しいインスタンスを作成する代わりにonNewIntent()
が呼び出される点です。
SingleTask:
この起動モードのアクティビティーは、システム内に 1つのインスタンスのみを持つことができます。アクティビティーの新規タスクが作成されます(存在しない場合)。それ以外の場合は、アクティビティのあるタスクが前面に移動し、 onNewIntent
が呼び出されます。
SingleInstance:
このモードはsingleTask
と似ていsingleTask
。違いは、 singleInstance
アクティビティを保持するタスクはこのアクティビティのみをsingleInstance
ことができ、それ以上のアクティビティを持たないことです。 singleInstance
アクティビティが別のアクティビティを作成すると、そのアクティビティを配置するための新しいタスクが作成されます。
setContentViewを使用したUIの提示
アクティビティクラスは、 setContentView
てUIを配置できるウィンドウを作成します。
3つのsetContentView
メソッドがあります。
-
setContentView(int layoutResID)
- レイアウトリソースからアクティビティコンテンツを設定します。 -
setContentView(View view)
- アクティビティの内容を明示的なビューに設定します。 -
setContentView(View view, ViewGroup.LayoutParams params)
- 提供されたsetContentView(View view, ViewGroup.LayoutParams params)
、アクティビティの内容を明示的なビューに設定します。
setContentView
が呼び出されると、このビューはアクティビティのビュー階層に直接配置されます。それ自体が複雑なビュー階層になる可能性があります。
例
リソースファイルからコンテンツを設定する:
ビュー階層を持つリソースファイル(この例ではmain.xml)を追加します。<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello" />
</FrameLayout>
アクティビティのコンテンツとして設定します。
public final class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The resource will be inflated,
// adding all top-level views to the activity.
setContentView(R.layout.main);
}
}
コンテンツを明示的なビューに設定する:
public final class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Creating view with container
final FrameLayout root = new FrameLayout(this);
final TextView text = new TextView(this);
text.setText("Hello");
root.addView(text);
// Set container as content view
setContentView(root);
}
}
現在のアクティビティスタックをクリアし、新しいアクティビティを開始する
現在のアクティビティスタックをクリアして新しいアクティビティを開始する場合(たとえば、アプリからログアウトしてアクティビティでログを開始する場合)、2つのアプローチがあるようです。
1.ターゲット(API> = 16)
アクティビティからfinishAffinity()
を呼び出す
2.ターゲット(11 <= API <16)
Intent intent = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
リクルートから除外されたアプリケーションの終了
まずAndroidManifest.xmlにExitActivityを定義します
<activity
android:name="com.your_example_app.activities.ExitActivity"
android:autoRemoveFromRecents="true"
android:theme="@android:style/Theme.NoDisplay" />
その後、ExitActivityクラス
/**
* Activity to exit Application without staying in the stack of last opened applications
*/
public class ExitActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Utils.hasLollipop()) {
finishAndRemoveTask();
} else if (Utils.hasJellyBean()) {
finishAffinity();
} else {
finish();
}
}
/**
* Exit Application and Exclude from Recents
*
* @param context Context to use
*/
public static void exitApplication(ApplicationContext context) {
Intent intent = new Intent(context, ExitActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(intent);
}
}
活動のための上のナビゲーション
上のナビゲーションは、Manifest.xmlのandroid:parentActivityName=""
をアクティビティタグに追加することで、アンドロイドで実行されます。基本的にこのタグを使用すると、アクティビティの親アクティビティについてシステムに指示します。
どうしたの?
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".SkillSchoolApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".ui.activities.SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.activities.MainActivity" />
<activity android:name=".ui.activities.HomeActivity"
android:parentActivityName=".ui.activities.MainActivity/> // HERE I JUST TOLD THE SYSTEM THAT MainActivity is the parent of HomeActivity
</application>
HomeActivityのツールバーの矢印をクリックすると、親アクティビティに戻ります。
Javaコード
ここでは、この機能に必要なJavaコードを記述します。
public class HomeActivity extends AppCompatActivity {
@BindView(R.id.toolbar)
Toolbar toolbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
ButterKnife.bind(this);
//Since i am using custom tool bar i am setting refernce of that toolbar to Actionbar. If you are not using custom then you can simple leave this and move to next line
setSupportActionBar(toolbar);
getSupportActionBar.setDisplayHomeAsUpEnabled(true); // this will show the back arrow in the tool bar.
}
}
このコードを実行すると、戻るボタンを押すとMainActivityに戻ります。上のナビゲーションの理解をさらに深めるために、私はドキュメントを読むことをお勧めします
オーバーライドすることで、必要に応じてこの動作をカスタマイズすることができます
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this); // Here you will write your logic for handling up navigation
return true;
}
return super.onOptionsItemSelected(item);
}
シンプルハック
これは単純なハックで、親がバックスタック状態にある場合、主に親アクティビティーにナビゲートするために使用されます。 idがandroid.R.id.home
と等しい場合にonBackPressed()
呼び出す
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}