2011年07月16日

javadoc翻訳 〜Activity編〜(4)

Configuration Changes

If the configuration of the device (as defined by the Resources.Configuration class) changes,
then anything displaying a user interface will need to update to match that configuration.
Because Activity is the primary mechanism for interacting with the user, it includes special
support for handling configuration changes.
Unless you specify otherwise, a configuration change (such as a change in screen orientation,
language, input devices, etc) will cause your current activity to be destroyed, going through
the normal activity lifecycle process of onPause(), onStop(), and onDestroy() as appropriate.
If the activity had been in the foreground or visible to the user, once onDestroy() is called
in that instance then a new instance of the activity will be created, with whatever savedInstanceState
the previous instance had generated from onSaveInstanceState(Bundle).

コンフィグレーションの変更

Resources.Configurationによって定義される、端末のコンフィグレーションが変更された場合、
表示しているユーザインタフェースはそのコンフィグレーションに適合するように更新される必要がある。
なぜなら、Activityはユーザとインタラクトする主なメカニズムであり、そこにはコンフィグレーションの変更
も含まれているからである。

端末の設定はResources.Configurationによって定義される。
端末の設定とはネットワーク設定や言語設定、あるいは画面設定などのことだ。
そのResources.Configurationが変更された場合、ユーザに対して何かを表示しているインタフェースは、
この変更を適用する必要があるだろう。そこには当然、アプリケーション、およびそれを使うActivityも含まれる。

別の方法で定義しない限り、スクリーン・オリエンテーション、言語、入力デバイスなどの各種端末設定変更により、
現在のActityは破棄されることになるだろう。その後、通常のActivtyのライフサイクル、すなわちonPause()、onStop()、そしてonDestroy()が適正にコールされるだろう。

もし、onDestroy()がコールされたActivityが、フォアグランドにいるか、ユーザから視認可能であった場合、
つまりユーザーから確認可能な位置に居た場合、保存してある以前のインスタンス状態がどうあれ、
新たにActivityインスタンスが作られることになる。

This is done because any application resource, including layout files, can change based on any
configuration value. Thus the only safe way to handle a configuration change is to re-retrieve
all resources, including layouts, drawables, and strings. Because activities must already know
how to save their state and re-create themselves from that state, this is a convenient way to
have an activity restart itself with a new configuration.

In some special cases, you may want to bypass restarting of your activity based on one or more
types of configuration changes. This is done with the android:configChanges attribute in its manifest.
For any types of configuration changes you say that you handle there, you will receive a call to your
current activity's onConfigurationChanged(Configuration) method instead of being restarted. If a
configuration change involves any that you do not handle, however, the activity will still be restarted
and onConfigurationChanged(Configuration) will not be called.

レイアウト定義ファイルを含む、アプリケーションが使用する全てのリソースは、端末設定に基づいて変化しうる。
だから、、コンフィグレーションの変更を安全にハンドリングする唯一の方法は、レイアウトや画像、文字列を含む
全てリソースをイチから全部再構築することである。そうしないと、Activityはその設定変更ひとつひとつに対して
どうデータを保存し、自身を再構築するのか考慮しなければならなくなるし、結局、イチから作りなおすのが
Activityを新しい設定でスタートさせるのにもっとも適合しているからである。

場合によっては、コンフィグレーションの変更によるActivityの再構築を回避したい場合もあるかもしれない。
この意志をハンドリング設定がandroid:configChanges属性だ。

<activity
android:configChanges=["mcc", "mnc", "locale",
"touchscreen", "keyboard",
"keyboardHidden",
"navigation", "orientation",
"screenLayout", "fontScale", "uiMode"]
</activity>


つまり、端末の設定変更をカテゴライズして、そこに変更があった際、ハンドリングしたいものを選べるわけである。
これで、設定変更の際、無条件で再構築される代わりに、Activity#onConfigurationChanged(Configuration)のコールを
受け取ることになる。もしも、ハンドリング外のコンフィグレーション変更が発生した場合は、当然Activityは無条件に
リスタートされActivity#onConfigurationChanged(Configuration)はコールされない。




Starting Activities and Getting Results

The startActivity(Intent) method is used to start a new activity, which will be placed at the top of the
activity stack. It takes a single argument, an Intent, which describes the activity to be executed.

Sometimes you want to get a result back from an activity when it ends. For example, you may start an
activity that lets the user pick a person in a list of contacts; when it ends, it returns the person
that was selected. To do this, you call the startActivityForResult(Intent, int) version with a second
integer parameter identifying the call. The result will come back through your
onActivityResult(int, int, Intent) method.

When an activity exits, it can call setResult(int) to return data back to its parent. It must always
supply a result code, which can be the standard results RESULT_CANCELED, RESULT_OK, or any custom
values starting at RESULT_FIRST_USER. In addition, it can optionally return back an Intent containing
any additional data it wants. All of this information appears back on the parent's Activity.onActivityResult(),
along with the integer identifier it originally supplied.

If a child activity fails for any reason (such as crashing), the parent activity will receive a result with the
code RESULT_CANCELED.

Activityの開始と結果取得

Activityスタックに新たなActivityを追加するコマンドが
startActivity(Intent)メソッドである。
引数にとるのはIntentというオブジェクトである。
このオブジェクトが次に起動されるActivityが何なのか知っている。

例えばあるActivityがstartActivity(Intent)を使用して新たなActivityを呼び出し、その子Activityの振る舞いの結果を、
呼び出し元のActivityが取得したい場合があるだろう。例えば、一時的に連絡リストを表示しているActivityを前面に起動して、
ユーザが選択した連絡先を元のActivityに戻したい場合などだ。これはstartActivityForResult(Intent, int)を使用する。
二つ目のintの引数は、呼び出しを識別するための識別子だ。結果はonActivityResult(int requestCode, int resultCode, Intent data)
が呼び出したActivityの処理終了時にコールバックされることによって受け取ることができる。

子Activityはその処理結果をsetResult(int)をで設定できる。引数のint値は結果コードである。結果コードはRESULT_CANCELED, RESULT_OKのほか
RESULT_FIRST_USERから始まるカスタム値が設定可能である。加えて、Intentに追加のデータを含めてリターンすることもできる。
内容はStringでもintでも、独自のオブジェクトでもよい。ただし、独自のオブジェクトをintentにセットする場合、そのオブジェクトは
Serializableインタフェースを実装する必要がある。

こうした子Activityの処理結果情報は親のonActivityResult()メソッドにオリジナルのint識別子と共に戻される。
int識別子はもちろん、親のActivityがstartActivityForResult()で引数に渡した識別子のことである。
仮に子Activityがクラッシュなど、なんらかの原因で失敗状態になった場合、親Activityは結果をRESULT_CANCELEDコードと共に受け取るだろう。

[呼び出し元(親Activity)]

・以下のコードで子Activityを起動


Intent i = new Intent(getApplicationContext(),ChildActivity.class);

startActivityForResult(i,0);


・あらかじめ、結果が返却された場合の処理を以下メソッドで実装しておく

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	
	//Check request code
	if (requestCode == DEFINED_REQUEST_CODE) {
		//expected
		
		//RESULT_OK
		if (resultCode == RESULT_OK) {
			//display message
			String message = data.getStringExtra("test.child.activity.result");
			Log.d(TAG, "message = " + message);
		}
		
	}

}



[子Activity]

・以下のコードで結果を送信


Intent intent = new Intent();
intent.putExtra("test.child.activity.result", "The world is on.The world is mine.");
setResult(RESULT_OK, intent);
finish();



javadoc翻訳 〜Activity編〜(1)
javadoc翻訳 〜Activity編〜(2)
javadoc翻訳 〜Activity編〜(3)
javadoc翻訳 〜Activity編〜(5)
javadoc翻訳 〜Activity編〜(6)last
posted by sandman at 16:30| Comment(0) | Android | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。