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

Android Lecture #03 @PRO&BSC Inc.

May 17, 2015

Download

Education

Yuki Higuchi

2012/03/14 に株式会社 PRO&BSC にて行った Android 研修の資料 #3 です。
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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

本日の課題