Android Lecture #03 @PRO&BSC Inc.

811 views

Published on

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

Published in: Education, Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
811
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Android Lecture #03 @PRO&BSC Inc.

  1. 1. ライフサイクルと非同期処理2012/03/14(水)@PRO&BSC 樋口 祐紀 (higuchi_yuki@probsc.jp)
  2. 2. 本日の内容• Androidアプリは良くおちます –回転すると... –Homeボタン押してほっておくと...• バックエンドはクラウド!というアプリは たくさんあります –ダウンロード処理 –プログレスダイアログ処理 2
  3. 3. エミュレータの使い方
  4. 4. ショットカットで操作してみましょう 操作 ショートカット画面の回転 (前へ) Ctrl + F11画面の回転(次へ) Ctrl + F12ネットワーク切替 F8フルスクリーンモード Alt + Enterトラックボール F6トラックボール Delete(キー押下中) 4
  5. 5. DDMSの使い方 Dalvik Debug Monitor
  6. 6. スクリーンショットや着呼が可能• C:¥android¥android-sdk¥tools¥ddms.bat – キャプチャ – ログ – 接続リセット – 着呼 6
  7. 7. ライフサイクルとは?
  8. 8. ライフサイクル モデル• Android端末にど のような操作を行う と、どのような経路 をたどるか?を常に 意識しましょう! 8
  9. 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. 10. ログ出力と基に表を埋めてみましょう(1) 起動 (2) Back キー (3) Home キー1. onCreate2. onStart4. onResume(4) 回転 (5) 着呼 (6) (3) 後、アイコンタップ(7) 履歴から他アプリ起動 (8) 小メモリにてHomeキー (9) (8) 後、アイコンタップ 10
  11. 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. 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.javapublic class MainActivity extends Activity {... (省略) ... public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i(“trace”, “onConfigurationChanged called"); }}... (省略) ... 12
  13. 13. Web APIの利用
  14. 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. 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. 16. 本日の課題• じゃんけんゲームの改善 – 画面回転しても影響がないようにライフサイクルの観 点から修正しましょう – メモリ領域が足りなくなっても破棄されないように修正 しましょう• EditTextに郵便番号を入力し、Buttonを押下 にて「AsyncTask + 郵便番号検索API」を起 動し、町の名前をTextViewに表示しましょう 16

×