Androidアプリ開発 74のアンチパターン

書籍Androidアプリ開発 74のアンチパターン

Link

 状態:-  閲覧数:564  投稿日:2018-05-09  更新日:2018-05-09

公式


リックテレコム 書籍情報

補足や更新情報
・「Not Found」が表示される理由は不明
http://www.ric.co.jp/book/contents/pdfs/1112_support.pdf

カスタマーレビュー


Androidアプリ開発 74のアンチパターン

P61 Chapter05 アクテイビティ

 閲覧数:252 投稿日:2018-05-12 更新日:2018-05-29

アクティビティオブジェクト


「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




週間人気ページランキング / 4-29 → 5-5
順位 ページタイトル抜粋 アクセス数
アクセスが、ありませんでした! 0
2024/5/6 1:01 更新