Link
状態:-
閲覧数:655
投稿日:2018-05-09
更新日:2018-05-09
公式
リックテレコム 書籍情報
補足や更新情報
・「Not Found」が表示される理由は不明
http://www.ric.co.jp/book/contents/pdfs/1112_support.pdf
カスタマーレビュー
Androidアプリ開発 74のアンチパターン
P61 Chapter05 アクテイビティ
アクティビティオブジェクト
「Android OS」が生成
・アクティビティを起動すると、「Android OS」がアクティビティオブジェクトを生成する
・アプリ開発者がnewを使用してオブジェクト生成するわけではない
破棄のタイミング
・「Android OS」が制御
・Backwards Compatibility(AppCompat)
紐づけ
書籍内容が、サンプルプロジェクトの何れに該当するか判断しづらい
・書籍に、サンプルプロジェクト名が掲載されていない
P68 5.4 アクティビティの保存と復元
「Android OS」によってアクティビティオブジェクトが破棄された後、アクティビティが実行状態に戻る場合
・最初にonCreateメソッドが呼ばれる
タイミング | onCreateへ渡される引数 |
---|---|
初回起動時 | null |
「Android OS」によってアクティビティオブジェクトが破棄された後、 アクティビティが実行状態に戻る場合 | Bundleオブジェクトに savedInstanceStateメソッドで値をセットしたもの |
・アクティビティのcountフォールドに保持されている
SaveInstanceState
▼/saveinstancestate/MainActivity.java
package com.mokelab.saveinstancestate;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static final String STATE_COUNT = "count";
private int count;
private TextView countText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
countText = findViewById(R.id.text_count);
// ボタンをタップしたら、カウントアップ
findViewById(R.id.button_count).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
count++;
updateText();
}
});
// 状態の復元
if (savedInstanceState != null) {
count = savedInstanceState.getInt(STATE_COUNT);
}
updateText();
}
private void updateText() {
countText.setText(String.valueOf(count));
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// 状態の保存
outState.putInt(STATE_COUNT, count);
}
}
P70 5.5 ユーザー操作とライフサイクルメソッド
アクティビティを起動したとき
・「Android OS」によってアクティビティオブジェクトが生成される
・onCreateメソッド内のsetContetViewメソッド画面で指定した画面が表示され、ユーザからの操作を受け付けるようになる
onCreate->onStart->onResume
アクティビティ起動中にホームボタンを押したとき
・その時点でユーザからの操作の受け付けを停止し、画面が完全に見えなくなる
・生成されたアクティビティオブジェクトが「Android OS」によって破棄される可能性もあるため、onSaveInstanceState()も呼ばれる
・呼ばれるタイミングは「onPause」と「onStop」の間、もしくは「onPause」の前
onPause->onStop
LifeCycle
▼/lifecycle/MainActivity.java
package com.mokelab.lifecycle;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
/**
* アクティビティのライフサイクル
*
* ホームボタンを押してみたり、ダイアログを表示させてみたりしましょう。
*/
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button_dialog).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showMessageDialog();
}
});
findViewById(R.id.button_activity).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
showNextActivity();
}
});
Toast.makeText(this, R.string.oncreate, Toast.LENGTH_SHORT).show();
}
@Override
protected void onRestart() {
super.onRestart();
Toast.makeText(this, R.string.onrestart, Toast.LENGTH_SHORT).show();
}
@Override
protected void onStart() {
super.onStart();
Toast.makeText(this, R.string.onstart, Toast.LENGTH_SHORT).show();
}
@Override
protected void onResume() {
super.onResume();
Toast.makeText(this, R.string.onresume, Toast.LENGTH_SHORT).show();
}
@Override
protected void onPause() {
super.onPause();
Toast.makeText(this, R.string.onpause, Toast.LENGTH_SHORT).show();
}
@Override
protected void onStop() {
super.onStop();
Toast.makeText(this, R.string.onstop, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
Toast.makeText(this, R.string.ondestroy, Toast.LENGTH_SHORT).show();
}
private void showMessageDialog() {
MessageDialogFragment dialog = MessageDialogFragment.newInstance();
dialog.show(getSupportFragmentManager(), null);
}
private void showNextActivity() {
Intent it = new Intent(this, NextActivity.class);
startActivity(it);
}
}
▼/lifecycle/MessageDialogFragment.java
package com.mokelab.lifecycle;
import android.app.Dialog;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
/**
* ダイアログを表示するためのフラグメント
*/
public class MessageDialogFragment extends DialogFragment {
public static MessageDialogFragment newInstance() {
return new MessageDialogFragment();
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(R.string.dialog);
builder.setPositiveButton(android.R.string.ok, null);
return builder.create();
}
}
▼/lifecycle/NextActivity.java
package com.mokelab.lifecycle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class NextActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
}
}
・Activityのライフサイクルについて
・Toast.makeText表示している間、次のToast.makeText命令が発生した場合は、どういう挙動となる?
・Activityのライフサイクル Androidアプリってどんな風に動いてるの?
P74 5.6 タスクと起動モード
LaunchMode
P80 デバッグ用のアクティビティにTaskAffinityを指定
TaskAffinity