Android Lecture #03 @PRO&BSC Inc.
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Android Lecture #03 @PRO&BSC Inc.

  • 706 views
Uploaded on

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

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

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
706
On Slideshare
706
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
2
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. ライフサイクルと非同期処理2012/03/14(水)@PRO&BSC 樋口 祐紀 (higuchi_yuki@probsc.jp)
  • 2. 本日の内容• Androidアプリは良くおちます –回転すると... –Homeボタン押してほっておくと...• バックエンドはクラウド!というアプリは たくさんあります –ダウンロード処理 –プログレスダイアログ処理 2
  • 3. エミュレータの使い方
  • 4. ショットカットで操作してみましょう 操作 ショートカット画面の回転 (前へ) Ctrl + F11画面の回転(次へ) Ctrl + F12ネットワーク切替 F8フルスクリーンモード Alt + Enterトラックボール F6トラックボール Delete(キー押下中) 4
  • 5. DDMSの使い方 Dalvik Debug Monitor
  • 6. スクリーンショットや着呼が可能• C:¥android¥android-sdk¥tools¥ddms.bat – キャプチャ – ログ – 接続リセット – 着呼 6
  • 7. ライフサイクルとは?
  • 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. onCreate2. onStart4. 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.javapublic class MainActivity extends Activity {... (省略) ... public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i(“trace”, “onConfigurationChanged called"); }}... (省略) ... 12
  • 13. Web APIの利用
  • 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