View
564
Download
0
Category
Preview:
DESCRIPTION
2012/03/14 に株式会社 PRO&BSC にて行った Android 研修の資料 #3 です。
Citation preview
ライフサイクル と非同期処理
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
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"); } }
ログ出力と基に表を埋めてみましょう (1) 起動 (2) Back キー (3) Home キー
1. onCreate 2. onStart 4. onResume
(4) 回転 (5) 着呼 (6) (3) 後、アイコンタップ
(7) 履歴から他アプリ起動 (8) 小メモリにてHomeキー (9) (8) 後、アイコンタップ
10
画面回転に対応するには?
• 縦、横のそれぞれでレイアウトファイルを分ける
• 画面向きを固定する
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">
縦向固定
横向固定
画面固定して 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
Web APIの利用
← こんな 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" />
非同期処理 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(); } }
... (省略) ...
• じゃんけんゲームの改善
– 画面回転しても影響がないようにライフサイクルの観
点から修正しましょう
– メモリ領域が足りなくなっても破棄されないように修正
しましょう
• EditTextに郵便番号を入力し、Buttonを押下
にて「AsyncTask + 郵便番号検索API」を起
動し、町の名前をTextViewに表示しましょう 16
本日の課題
Recommended