SlideShare a Scribd company logo
ライフサイクル
と非同期処理
2012/03/14(水)@PRO&BSC
         樋口 祐紀
 (higuchi_yuki@probsc.jp)
本日の内容
• Androidアプリは良くおちます
 –回転すると...
 –Homeボタン押してほっておくと...

• バックエンドはクラウド!というアプリは
  たくさんあります
 –ダウンロード処理
 –プログレスダイアログ処理
                        2
エミュレータの使い方
ショットカットで操作してみましょう
    操作        ショートカット
画面の回転 (前へ) Ctrl + F11
画面の回転(次へ) Ctrl + F12
ネットワーク切替     F8
フルスクリーンモード Alt + Enter
トラックボール      F6

トラックボール
             Delete
(キー押下中)
                         4
DDMSの使い方
 Dalvik Debug Monitor
スクリーンショットや着呼が可能
• C:¥android¥android-sdk¥tools¥ddms.bat
  –   キャプチャ
  –   ログ
  –   接続リセット
  –   着呼




                                          6
ライフサイクルとは?
ライフサイクル
      モデル
• Android端末にど
  のような操作を行う
  と、どのような経路
  をたどるか?を常に
  意識しましょう!




                8
package jp.probsc.test;                      public void onPause() {
                                               super.onPause();
import android.app.Activity;
                                               Log.i("trace", “5. onPause");
import android.os.Bundle;
                                             }
import android.util.Log;
                                             public void onStop() {
public class MainActivity
                                               super.onStop();
                 extends Activity {
                                               Log.i("trace", “6. onStop");
  public void onCreate(Bundle state) {       }
    super.onCreate(state);
                                             public void onDestroy() {
    Log.i("trace", “1. onCreate");
                                               super.onDestroy();
  }
                                               Log.i("trace", “7. onDestroy");
  public void onStart() {                    }
    super.onStart();
                                             public void onRestoreInstanceState(Bundle state) {
    Log.i("trace", “2. onStart");
                                               super.onRestoreInstanceState(state);
  }
                                               Log.i("trace", “8. onRestoreInstanceState");
  public void onRestart() {                  }
    super.onRestart();
                                             public void onSaveInstanceState(Bundle state) {
    Log.i("trace", “3. onRestart");
                                               super.onSaveInstanceState(state);
  }
                                               Log.i("trace", “9. onSaveInstanceState");
  public void onResume() {                   }
    super.onResume();
                                             public void onUserLeaveHint() {
    Log.i("trace", “4. onResume");
                                               super.onUserLeaveHint();
  }
                                               Log.i("trace", “10. onUserLeaveHint");
                                             }
                                         }
                                                                                               9
ログ出力と基に表を埋めてみましょう
(1) 起動           (2) Back キー        (3) Home キー
1. onCreate
2. onStart
4. onResume



(4) 回転           (5) 着呼             (6) (3) 後、アイコンタップ




(7) 履歴から他アプリ起動   (8) 小メモリにてHomeキー   (9) (8) 後、アイコンタップ




                                                    10
画面回転に対応するには?
• 縦、横のそれぞれでレイアウトファイルを分ける
                             画面の大きさによって分けるには「layout-hdpi /
                             layout-mdpi / layout-ldpi」などとします。

                             具体的な解像度に対応するには「layout-480x320
                             / layout-854x480」などとします。



• 画面向きを固定する
 <application android:icon="@drawable/icon" android:label="@string/app_name">
   <activity android:name=".MainActivity" android:label="@string/app_name"
             android:screenOrientation="portrait">
 縦向固定

 <application android:icon="@drawable/icon" android:label="@string/app_name">
   <activity android:name=".MainActivity" android:label="@string/app_name"
             android:screenOrientation="landscape">
 横向固定                                                                           11
画面固定して destory 呼ばれなくするには?
... (省略) ...
                                                                    AndroidManifest.xml
<application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name=".MainActivity" android:label="@string/app_name"
    android:screenOrientation="portrait"
    android:configChanges="orientation|keyboardHidden">
... (省略) ...




... (省略) ...
                                                                       MainActivity.java
public class MainActivity extends Activity {
... (省略) ...
    public void onConfigurationChanged(Configuration newConfig) {
      super.onConfigurationChanged(newConfig);

        Log.i(“trace”, “onConfigurationChanged called");
    }
}
... (省略) ...

                                                                                      12
Web APIの利用
← こんな Toast が表示され
郵便番号検索                                           れば成功です。

API の利用
                                 「zip.php?zn=9800014」の部分を変更し
                                 て結果が変わるか確かめてみましょう。
HttpURLConnection http = null;                              String city =
InputStream in = null;                                       lineStr.substring(
try {                                                          lineStr.indexOf("city=¥"") + 6,
  // HTTP GETにてデータを取得                                          lineStr.indexOf(
  URL url = new URL(                                             "¥" />¥n<value address="));
  "http://zip.cgis.biz/xml/zip.php?zn=9800014");            Toast.makeText(this, city,
  http =                                                     Toast.LENGTH_LONG).show();
    (HttpURLConnection)url.openConnection();            }
  http.setRequestMethod("GET");                     }
  http.connect();                                  }
  in = http.getInputStream();                      catch (Exception ex) {
                                                   }
 // XML の city 属性の値を取得                             finally {
 byte[] line = new byte[1024];                       try {
 while (true) {                                        if (http != null) http.disconnect();
   int size = in.read(line);                           if (in != null) in.close();
   if (size <= 0) break;                             }
                                                     catch (Exception e) {
  String lineStr = new String(line);                 }
  if (lineStr.contains("city=")) {                 }

   ネットにアクセスするため、AndroidManifest.xmlに下記パーミッションを追加しましょう
   <uses-permission android:name="android.permission.INTERNET" />                             14
非同期処理                                                   protected Long doInBackground(
                                                                                         String... params) {
AsyncTask                                                 for (int i = 0; i < 10; i++) {
                                                            if (isCancelled()) break;
... (省略) ...                                                SystemClock.sleep(1000);
                                                            publishProgress((i + 1) * 10);
public void onCreate(Bundle state) {                      }
 super.onCreate(state);                                   return 0L;
    new MyAsyncTask().execute("");                      }
}                                                       protected void onProgressUpdate(
                                                                                       Integer... values) {
public class MyAsyncTask extends                          dialog.setProgress(values[0]);
              AsyncTask<String, Integer, Long> {        }
    ProgressDialog dialog;                              protected void onCancelled() {
    protected void onPreExecute() {                      dialog.dismiss();
      dialog = new ProgressDialog(MainActivity.this);       new AlertDialog.Builder(MainActivity.this)
      dialog.setTitle("Loading data...");                    .setMessage("キャンセル")
      dialog.setProgressStyle(                               .setPositiveButton("OK", null).create().show();
               ProgressDialog.STYLE_HORIZONTAL);        }
      dialog.setOnCancelListener(
                           new OnCancelListener() {     protected void onPostExecute(Long result) {
       public void onCancel(DialogInterface arg) {       dialog.dismiss();
         MyAsyncTask.this.cancel(true);
                                                            new AlertDialog.Builder(MainActivity.this)
       }
                                                              .setMessage("完了!")
      });
                                                              .setPositiveButton("OK", null).create().show();
      dialog.setMax(100);
                                                            }
      dialog.setProgress(0);
                                                        }
      dialog.show();
    }                                                   ... (省略) ...
                                                                                                         15
本日の課題
• じゃんけんゲームの改善
 – 画面回転しても影響がないようにライフサイクルの観
   点から修正しましょう
 – メモリ領域が足りなくなっても破棄されないように修正
   しましょう
• EditTextに郵便番号を入力し、Buttonを押下
  にて「AsyncTask + 郵便番号検索API」を起
  動し、町の名前をTextViewに表示しましょう
                               16

More Related Content

PDF
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
PPTX
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
PDF
Ajax 応用
PDF
Ecmascript2015とその周辺について
PDF
Androidの通信周りのコーディングについて
PDF
Jetpack datastore入門
PDF
Apache Torqueについて
PDF
Spockの基礎
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Ajax 応用
Ecmascript2015とその周辺について
Androidの通信周りのコーディングについて
Jetpack datastore入門
Apache Torqueについて
Spockの基礎

What's hot (20)

PDF
DOMイベントの基礎から深淵まで
PDF
Clojure
PDF
Tezos Hands on 2019-06-15 Exercise (Japanese)
PDF
Valhalla Update JJUG CCC Spring 2019
PDF
Synthesijer hls 20150116
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
PPTX
ActiveResourceが面白すぎる件
PDF
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
PDF
Composable Callbacks & Listeners
PDF
Paging Libraryの利用をやめたいお気持ち表明
PDF
About Jobs
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
PDF
PHP5.5新機能「ジェネレータ」初心者入門
PDF
「Html sql」で図書館hpにアクセスしてみよう
PDF
traitを使って楽したい話
PDF
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
PDF
LINQソースでGO!
PDF
Goの文法の実例と解説
PDF
Javaセキュアコーディングセミナー東京第3回演習の解説
PDF
Unit test in android
DOMイベントの基礎から深淵まで
Clojure
Tezos Hands on 2019-06-15 Exercise (Japanese)
Valhalla Update JJUG CCC Spring 2019
Synthesijer hls 20150116
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
ActiveResourceが面白すぎる件
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
Composable Callbacks & Listeners
Paging Libraryの利用をやめたいお気持ち表明
About Jobs
Synthesijer and Synthesijer.Scala in HLS-friends 201512
PHP5.5新機能「ジェネレータ」初心者入門
「Html sql」で図書館hpにアクセスしてみよう
traitを使って楽したい話
「Grails-1.1を斬る!〜Grails-1.1からのチーム開発〜」
LINQソースでGO!
Goの文法の実例と解説
Javaセキュアコーディングセミナー東京第3回演習の解説
Unit test in android
Ad

Viewers also liked (9)

PDF
Android Lecture #02 @PRO&BSC Inc.
PDF
Android Lecture #04 @PRO&BSC Inc.
PDF
Android Lecture #01 @PRO&BSC Inc.
PDF
AOZORAYOMITE and Intent
PDF
AozoraYomite @InfoTalk 2012/12/21
PDF
Programmer @jc-21 2014/03/29
PDF
カジュアルにMongo dbのbackup機能説明
PDF
月間10億pvを支えるmongo db
PDF
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Android Lecture #02 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.
AOZORAYOMITE and Intent
AozoraYomite @InfoTalk 2012/12/21
Programmer @jc-21 2014/03/29
カジュアルにMongo dbのbackup機能説明
月間10億pvを支えるmongo db
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Ad

Similar to Android Lecture #03 @PRO&BSC Inc. (20)

PDF
Android4.2徹底解剖!
ODP
はじめてのAndroid開発
PDF
日本Androidの会 中国支部資料
PDF
Tokyo GTUG Bootcamp2010
PDF
SHARPのエコ技を実装してみた
PDF
夜子まま塾講義10(画面の呼び出し)
ODP
OSC2011 Androidハンズオン
PDF
Android カスタムROMの作り方
PDF
Android api-levels
PDF
アプリリリース後に後悔しないための20のこと
PPTX
初めてのAndroid開発
PDF
函館IKA ICS開発情報
PPT
Android Hacks - 合宿 Activity
PDF
Android gameprogramming
PPTX
日本Androidの会のハンズオンセミナー資料(20130315)
PPTX
学生向けAndroid勉強会(入門編)
PPTX
Using the Fragments(Android)
PDF
みゆっき☆Think#3 「androidに触ってみるよ!」
PDF
Android0422
PPTX
勉強会資料Out ofmemory
Android4.2徹底解剖!
はじめてのAndroid開発
日本Androidの会 中国支部資料
Tokyo GTUG Bootcamp2010
SHARPのエコ技を実装してみた
夜子まま塾講義10(画面の呼び出し)
OSC2011 Androidハンズオン
Android カスタムROMの作り方
Android api-levels
アプリリリース後に後悔しないための20のこと
初めてのAndroid開発
函館IKA ICS開発情報
Android Hacks - 合宿 Activity
Android gameprogramming
日本Androidの会のハンズオンセミナー資料(20130315)
学生向けAndroid勉強会(入門編)
Using the Fragments(Android)
みゆっき☆Think#3 「androidに触ってみるよ!」
Android0422
勉強会資料Out ofmemory

Android Lecture #03 @PRO&BSC Inc.

  • 2. 本日の内容 • Androidアプリは良くおちます –回転すると... –Homeボタン押してほっておくと... • バックエンドはクラウド!というアプリは たくさんあります –ダウンロード処理 –プログレスダイアログ処理 2
  • 4. ショットカットで操作してみましょう 操作 ショートカット 画面の回転 (前へ) Ctrl + F11 画面の回転(次へ) Ctrl + F12 ネットワーク切替 F8 フルスクリーンモード Alt + Enter トラックボール F6 トラックボール Delete (キー押下中) 4
  • 6. スクリーンショットや着呼が可能 • C:¥android¥android-sdk¥tools¥ddms.bat – キャプチャ – ログ – 接続リセット – 着呼 6
  • 8. ライフサイクル モデル • Android端末にど のような操作を行う と、どのような経路 をたどるか?を常に 意識しましょう! 8
  • 9. package jp.probsc.test; public void onPause() { super.onPause(); import android.app.Activity; Log.i("trace", “5. onPause"); import android.os.Bundle; } import android.util.Log; public void onStop() { public class MainActivity super.onStop(); extends Activity { Log.i("trace", “6. onStop"); public void onCreate(Bundle state) { } super.onCreate(state); public void onDestroy() { Log.i("trace", “1. onCreate"); super.onDestroy(); } Log.i("trace", “7. onDestroy"); public void onStart() { } super.onStart(); public void onRestoreInstanceState(Bundle state) { Log.i("trace", “2. onStart"); super.onRestoreInstanceState(state); } Log.i("trace", “8. onRestoreInstanceState"); public void onRestart() { } super.onRestart(); public void onSaveInstanceState(Bundle state) { Log.i("trace", “3. onRestart"); super.onSaveInstanceState(state); } Log.i("trace", “9. onSaveInstanceState"); public void onResume() { } super.onResume(); public void onUserLeaveHint() { Log.i("trace", “4. onResume"); super.onUserLeaveHint(); } Log.i("trace", “10. onUserLeaveHint"); } } 9
  • 10. ログ出力と基に表を埋めてみましょう (1) 起動 (2) Back キー (3) Home キー 1. onCreate 2. onStart 4. onResume (4) 回転 (5) 着呼 (6) (3) 後、アイコンタップ (7) 履歴から他アプリ起動 (8) 小メモリにてHomeキー (9) (8) 後、アイコンタップ 10
  • 11. 画面回転に対応するには? • 縦、横のそれぞれでレイアウトファイルを分ける 画面の大きさによって分けるには「layout-hdpi / layout-mdpi / layout-ldpi」などとします。 具体的な解像度に対応するには「layout-480x320 / layout-854x480」などとします。 • 画面向きを固定する <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="portrait"> 縦向固定 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="landscape"> 横向固定 11
  • 12. 画面固定して destory 呼ばれなくするには? ... (省略) ... AndroidManifest.xml <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:configChanges="orientation|keyboardHidden"> ... (省略) ... ... (省略) ... MainActivity.java public class MainActivity extends Activity { ... (省略) ... public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i(“trace”, “onConfigurationChanged called"); } } ... (省略) ... 12
  • 14. ← こんな Toast が表示され 郵便番号検索 れば成功です。 API の利用 「zip.php?zn=9800014」の部分を変更し て結果が変わるか確かめてみましょう。 HttpURLConnection http = null; String city = InputStream in = null; lineStr.substring( try { lineStr.indexOf("city=¥"") + 6, // HTTP GETにてデータを取得 lineStr.indexOf( URL url = new URL( "¥" />¥n<value address=")); "http://zip.cgis.biz/xml/zip.php?zn=9800014"); Toast.makeText(this, city, http = Toast.LENGTH_LONG).show(); (HttpURLConnection)url.openConnection(); } http.setRequestMethod("GET"); } http.connect(); } in = http.getInputStream(); catch (Exception ex) { } // XML の city 属性の値を取得 finally { byte[] line = new byte[1024]; try { while (true) { if (http != null) http.disconnect(); int size = in.read(line); if (in != null) in.close(); if (size <= 0) break; } catch (Exception e) { String lineStr = new String(line); } if (lineStr.contains("city=")) { } ネットにアクセスするため、AndroidManifest.xmlに下記パーミッションを追加しましょう <uses-permission android:name="android.permission.INTERNET" /> 14
  • 15. 非同期処理 protected Long doInBackground( String... params) { AsyncTask for (int i = 0; i < 10; i++) { if (isCancelled()) break; ... (省略) ... SystemClock.sleep(1000); publishProgress((i + 1) * 10); public void onCreate(Bundle state) { } super.onCreate(state); return 0L; new MyAsyncTask().execute(""); } } protected void onProgressUpdate( Integer... values) { public class MyAsyncTask extends dialog.setProgress(values[0]); AsyncTask<String, Integer, Long> { } ProgressDialog dialog; protected void onCancelled() { protected void onPreExecute() { dialog.dismiss(); dialog = new ProgressDialog(MainActivity.this); new AlertDialog.Builder(MainActivity.this) dialog.setTitle("Loading data..."); .setMessage("キャンセル") dialog.setProgressStyle( .setPositiveButton("OK", null).create().show(); ProgressDialog.STYLE_HORIZONTAL); } dialog.setOnCancelListener( new OnCancelListener() { protected void onPostExecute(Long result) { public void onCancel(DialogInterface arg) { dialog.dismiss(); MyAsyncTask.this.cancel(true); new AlertDialog.Builder(MainActivity.this) } .setMessage("完了!") }); .setPositiveButton("OK", null).create().show(); dialog.setMax(100); } dialog.setProgress(0); } dialog.show(); } ... (省略) ... 15
  • 16. 本日の課題 • じゃんけんゲームの改善 – 画面回転しても影響がないようにライフサイクルの観 点から修正しましょう – メモリ領域が足りなくなっても破棄されないように修正 しましょう • EditTextに郵便番号を入力し、Buttonを押下 にて「AsyncTask + 郵便番号検索API」を起 動し、町の名前をTextViewに表示しましょう 16