android lecture #03 @pro&bsc inc

16
ライフサイクル と非同期処理 2012/03/14()@PRO&BSC 樋口 祐紀 ([email protected])

Upload: yuki-higuchi

Post on 17-May-2015

565 views

Category:

Education


0 download

DESCRIPTION

2012/03/14 に株式会社 PRO&BSC にて行った Android 研修の資料 #3 です。

TRANSCRIPT

Page 1: Android Lecture #03 @PRO&BSC Inc

ライフサイクル と非同期処理

2012/03/14(水)@PRO&BSC

樋口 祐紀

([email protected])

Page 2: Android Lecture #03 @PRO&BSC Inc

本日の内容

• Androidアプリは良くおちます

–回転すると...

–Homeボタン押してほっておくと...

• バックエンドはクラウド!というアプリはたくさんあります

–ダウンロード処理

–プログレスダイアログ処理 2

Page 3: Android Lecture #03 @PRO&BSC Inc

エミュレータの使い方

Page 4: Android Lecture #03 @PRO&BSC Inc

ショットカットで操作してみましょう

操作 ショートカット

画面の回転 (前へ) Ctrl + F11

画面の回転(次へ) Ctrl + F12

ネットワーク切替 F8

フルスクリーンモード Alt + Enter

トラックボール F6

トラックボール (キー押下中)

Delete

4

Page 5: Android Lecture #03 @PRO&BSC Inc

DDMSの使い方 Dalvik Debug Monitor

Page 6: Android Lecture #03 @PRO&BSC Inc

スクリーンショットや着呼が可能 • C:¥android¥android-sdk¥tools¥ddms.bat

– キャプチャ

– ログ

– 接続リセット

– 着呼

6

Page 7: Android Lecture #03 @PRO&BSC Inc

ライフサイクルとは?

Page 8: Android Lecture #03 @PRO&BSC Inc

ライフサイクル モデル

• Android端末にどのような操作を行うと、どのような経路をたどるか?を常に意識しましょう!

8

Page 9: Android Lecture #03 @PRO&BSC Inc

9

package jp.probsc.test;

import android.app.Activity; import android.os.Bundle; import android.util.Log;

public class MainActivity extends Activity {

public void onCreate(Bundle state) { super.onCreate(state); Log.i("trace", “1. onCreate"); }

public void onStart() { super.onStart(); Log.i("trace", “2. onStart"); }

public void onRestart() { super.onRestart(); Log.i("trace", “3. onRestart"); }

public void onResume() { super.onResume(); Log.i("trace", “4. onResume"); }

public void onPause() { super.onPause(); Log.i("trace", “5. onPause"); }

public void onStop() { super.onStop(); Log.i("trace", “6. onStop"); }

public void onDestroy() { super.onDestroy(); Log.i("trace", “7. onDestroy"); }

public void onRestoreInstanceState(Bundle state) { super.onRestoreInstanceState(state); Log.i("trace", “8. onRestoreInstanceState"); }

public void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); Log.i("trace", “9. onSaveInstanceState"); }

public void onUserLeaveHint() { super.onUserLeaveHint(); Log.i("trace", “10. onUserLeaveHint"); } }

Page 10: Android Lecture #03 @PRO&BSC Inc

ログ出力と基に表を埋めてみましょう (1) 起動 (2) Back キー (3) Home キー

1. onCreate 2. onStart 4. onResume

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

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

10

Page 11: Android Lecture #03 @PRO&BSC Inc

画面回転に対応するには?

• 縦、横のそれぞれでレイアウトファイルを分ける

• 画面向きを固定する

11

<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="portrait">

画面の大きさによって分けるには「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="landscape">

縦向固定

横向固定

Page 12: Android Lecture #03 @PRO&BSC Inc

画面固定して destory 呼ばれなくするには?

12

... (省略) ...

<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">

... (省略) ...

AndroidManifest.xml

... (省略) ...

public class MainActivity extends Activity {

... (省略) ...

public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i(“trace”, “onConfigurationChanged called"); } }

... (省略) ...

MainActivity.java

Page 13: Android Lecture #03 @PRO&BSC Inc

Web APIの利用

Page 14: Android Lecture #03 @PRO&BSC Inc

← こんな Toast が表示され れば成功です。

「zip.php?zn=9800014」の部分を変更して結果が変わるか確かめてみましょう。

HttpURLConnection http = null; InputStream in = null; try { // HTTP GETにてデータを取得 URL url = new URL( "http://zip.cgis.biz/xml/zip.php?zn=9800014"); http = (HttpURLConnection)url.openConnection(); http.setRequestMethod("GET"); http.connect(); in = http.getInputStream(); // XML の city 属性の値を取得 byte[] line = new byte[1024]; while (true) { int size = in.read(line); if (size <= 0) break; String lineStr = new String(line); if (lineStr.contains("city=")) {

String city = lineStr.substring( lineStr.indexOf("city=¥"") + 6, lineStr.indexOf( "¥" />¥n<value address=")); Toast.makeText(this, city, Toast.LENGTH_LONG).show(); } } } catch (Exception ex) { } finally { try { if (http != null) http.disconnect(); if (in != null) in.close(); } catch (Exception e) { } }

郵便番号検索 API の利用

14 ネットにアクセスするため、AndroidManifest.xmlに下記パーミッションを追加しましょう

<uses-permission android:name="android.permission.INTERNET" />

Page 15: Android Lecture #03 @PRO&BSC Inc

非同期処理 AsyncTask

15

... (省略) ...

public void onCreate(Bundle state) { super.onCreate(state);

new MyAsyncTask().execute(""); } public class MyAsyncTask extends AsyncTask<String, Integer, Long> {

ProgressDialog dialog;

protected void onPreExecute() { dialog = new ProgressDialog(MainActivity.this); dialog.setTitle("Loading data..."); dialog.setProgressStyle( ProgressDialog.STYLE_HORIZONTAL); dialog.setOnCancelListener( new OnCancelListener() { public void onCancel(DialogInterface arg) { MyAsyncTask.this.cancel(true); } }); dialog.setMax(100); dialog.setProgress(0); dialog.show(); }

protected Long doInBackground( String... params) { for (int i = 0; i < 10; i++) { if (isCancelled()) break; SystemClock.sleep(1000); publishProgress((i + 1) * 10); } return 0L; }

protected void onProgressUpdate( Integer... values) { dialog.setProgress(values[0]); }

protected void onCancelled() { dialog.dismiss();

new AlertDialog.Builder(MainActivity.this) .setMessage("キャンセル") .setPositiveButton("OK", null).create().show(); }

protected void onPostExecute(Long result) { dialog.dismiss();

new AlertDialog.Builder(MainActivity.this) .setMessage("完了!") .setPositiveButton("OK", null).create().show(); } }

... (省略) ...

Page 16: Android Lecture #03 @PRO&BSC Inc

• じゃんけんゲームの改善

– 画面回転しても影響がないようにライフサイクルの観

点から修正しましょう

– メモリ領域が足りなくなっても破棄されないように修正

しましょう

• EditTextに郵便番号を入力し、Buttonを押下

にて「AsyncTask + 郵便番号検索API」を起

動し、町の名前をTextViewに表示しましょう 16

本日の課題