36
インテントと永続化 2012/03/07()@PRO&BSC 樋口 祐紀 ([email protected])

Android Lecture #02 @PRO&BSC Inc

Embed Size (px)

DESCRIPTION

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

Citation preview

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

インテントと永続化 2012/03/07(水)@PRO&BSC

樋口 祐紀

([email protected])

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

本日の内容

• 青空読手のご紹介

• どうやって作ってるの?

• マネタイズ

• インテント

• 永続化

• デバッグ方法

• 本日の課題 2

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

青空読手のご紹介

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

青空読手のご紹介①

4

作者一覧やランキングから選択 文庫の表示 もちろんしおり機能も

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

文字のサイズと太さの指定

サイズ: 極大 + 太さ: 極太 サイズ: 極小 + 太さ: 極細

5

青空読手のご紹介②

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

青空読手のご紹介③

6

横向き表示にも対応

SDカードや本体内の テキストの読み込みも可能

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

mobile ASCII vol.5に 掲載! 2011/7/29発行

7

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

ディベロッパーコンソール

8

端 末

1 Samsung Galaxy S 10.00% (12,198)

2 Sharp IS03 8.93% (10,890)

3 Fujitsu Toshiba REGZA Phone T01C 7.17% (8,752)

4 SEMC Xperia Arco 6.09% (7,427)

5 Samsung Galaxy Tab 5.89% (7,190)

6 Samsung Galaxy S2 5.17% (6,306)

7 SEMC Xperia Arc 5.15% (6,282)

8 SEMC Xperia X10 4.45% (5,432)

9 SEMC Experia Acro 2.62% (3,194)

10 その他 44.52% (54,312)

1 日本 98.23% (119,826)

2 アメリカ合衆国 0.34% (420)

3 中国 0.31% (384)

4 大韓民国 0.20% (238)

5 台湾 0.18% (220)

6 タイ 0.09% (112)

7 香港 0.09% (109)

8 イギリス 0.07% (83)

9 オーストラリア 0.06% (71)

10 その他 0.43% (520)

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

どうやって作ってるの?

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

どうやって作ってるの!?①

• データは青空文庫サイト*1からzipファイルをDL後、解凍

– 500文庫分のzipファイルへのリンクを保持

• フォントは「IPA明朝」をダウンロードして利用

• SurfaceViewで頑張って描画

– (背景+本文+ルビ+タイトル+ページ数)x 2

10 *1 … http://www.aozora.gr.jp/

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

• Twitterによるつぶやき

11

どうやって作ってるの!?②

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

どうやって作ってるの!?③

• Twitterへのつぶやき投稿はこんなにかんたん!

12

final String msg = " 『坊っちゃん』なう #aozorayomite"; final Uri uri = Uri.parse( http://twitter.com/home/?status= + URLEncoder.encode(msg, "UTF-8")); final Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);

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

ちなみに、メールの場合はこんな感じ

13

Intent intent = new Intent(); // アクションとデータタイプを指定 intent.setAction(Intent.ACTION_SEND); intent.setType("message/rfc822"); // TO、CC、BCC、件名、本文を順に指定 intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "[email protected]" }); intent.putExtra(Intent.EXTRA_CC, new String[] { "[email protected]" }); intent.putExtra(Intent.EXTRA_BCC, new String[] { "[email protected]" }); intent.putExtra(Intent.EXTRA_SUBJECT, "件名"); intent.putExtra(Intent.EXTRA_TEXT, "本文の内容"); // Intent を発行 startActivity(intent);

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

どうやって作ってるの!?④

14

def get_or_post(self): pdev = self.request.get('dev').encode('utf-8') pos = self.request.get('os').encode('utf-8') pver = self.request.get('ver').encode('utf-8') ptitle = self.request.get('title').encode('utf-8') pbug = self.request.get('bug').encode('utf-8') report = "dev: " + pdev + "¥n" report += "os: " + pos + "¥n" report += "ver: " + pver + "¥n" report += "title: " + ptitle + "¥n" report += "bug: " + pbug mail.send_mail( sender='[email protected]', to='[email protected]', subject='Bug Report - AozoraYomite', body=report)

【参考サイト】throw Life - Androidアプリのバグ報告システムを考える http://www.adamrocker.com/blog/288/bug-report-system-for-android.html

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

どうやって作ってるの!?⑤

• 青空プロバイダとの連携機能

15

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

マネタイズ

Page 17: Android Lecture #02 @PRO&BSC Inc

マネタイズとはなんぞや?

17 出典:マネタイズ【monetize】の意味 - 国語辞書 - goo辞書 http://goo.gl/RRI8

Page 18: Android Lecture #02 @PRO&BSC Inc

突然ですがクイズです

• 青空読手のユーザの 3% が ¥210- で購入してくれていたとすると、これまでに私の懐にいくら入っていたでしょう?

A. ¥10,000-

B. ¥100,000-

C. ¥1,000,000-

D. もっと稼げる。そう、iPhone ならね

18

Page 19: Android Lecture #02 @PRO&BSC Inc

実はけっこう稼げるAndroid!?

230,000 (ユーザ) × 3% (購入割合)

× ¥210- × 70% (開発者の取り分)

= ¥1,014,300- 19

Page 20: Android Lecture #02 @PRO&BSC Inc

Android有料アプリは苦戦中...

• そこで広告!Androidでは AdMob がメジャー

20

Page 21: Android Lecture #02 @PRO&BSC Inc

DL 数が伸びないことには...

21

① ② ③

① アンドロイダー レビュー記事 ② アンドロイダー 青空文庫比較記事 ③ au one market 登録

Page 22: Android Lecture #02 @PRO&BSC Inc

昨年度末の盛り上がり!

22

Page 23: Android Lecture #02 @PRO&BSC Inc

インテント

Page 24: Android Lecture #02 @PRO&BSC Inc

インテントって何?

• 処理依頼メッセージのこと

– 例: AK Notepadによる他アプリ機能

AK Notepadにてテキストを入力。メニューからShareを指定すると…

ACTION_SEND イ ンテントが発行され、対応アプリがリストアップ

Twidroidにペーストされる。ポイントは相互連携を前提としてない点

出典:使って分かったAndroidとiPhoneの違い http://goo.gl/5nGc 24

Page 25: Android Lecture #02 @PRO&BSC Inc

IntentとExtraData Activity Actions

– ACTION_MAIN

– ACTION_VIEW

– ACTION_ATTACH_DATA

– ACTION_EDIT

– ACTION_PICK

– ACTION_CHOOSER

– ACTION_GET_CONTENT

– ACTION_DIAL

– ACTION_CALL

– ACTION_SEND

– ACTION_SENDTO

– ACTION_ANSWER

– ACTION_INSERT

– ACTION_DELETE

– ACTION_RUN

– ACTION_SYNC

– ACTION_PICK_ACTIVITY

– ACTION_SEARCH

– ACTION_WEB_SEARCH

– ACTION_FACTORY_TEST

Broadcast Actions – ACTION_TIME_TICK

– ACTION_TIME_CHANGED

– ACTION_TIMEZONE_CHANGED

– ACTION_BOOT_COMPLETED

– ACTION_PACKAGE_ADDED

– ACTION_PACKAGE_CHANGED

– ACTION_PACKAGE_REMOVED

– ACTION_PACKAGE_RESTARTED

– ACTION_PACKAGE_DATA_CLEARED

– ACTION_UID_REMOVED

– ACTION_BATTERY_CHANGED

– ACTION_POWER_CONNECTED

– ACTION_POWER_DISCONNECTED

– ACTION_SHUTDOWN

Extra Data – EXTRA_ALARM_COUNT

– EXTRA_BCC

– EXTRA_CC

– EXTRA_CHANGED_COMPONENT_NAME

– EXTRA_DATA_REMOVED

– EXTRA_DOCK_STATE

– EXTRA_DOCK_STATE_CAR

– EXTRA_DOCK_STATE_DESK

– EXTRA_DOCK_STATE_UNDOCKED

– EXTRA_DONT_KILL_APP

– EXTRA_EMAIL

– EXTRA_INITIAL_INTENTS

– EXTRA_INTENT

– EXTRA_KEY_EVENT

– EXTRA_PHONE_NUMBER

– EXTRA_REMOTE_INTENT_TOKEN

– EXTRA_REPLACING

– EXTRA_SHORTCUT_ICON

– EXTRA_SHORTCUT_ICON_RESOURCE

– EXTRA_SHORTCUT_INTENT

– EXTRA_STREAM

– EXTRA_SHORTCUT_NAME

– EXTRA_SUBJECT

– EXTRA_TEMPLATE

– EXTRA_TEXT

– EXTRA_TITLE

– EXTRA_UID

// インテントによるブラウザ起動の例

Uri uri = Uri.parse("http://probsc.jp");

Intent intent = new Intent(Intent.ACTION_VIEW, uri);

startActivity(intent);

25

Page 26: Android Lecture #02 @PRO&BSC Inc

画面遷移もインテントで実施①

26

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >

<TextView android:id="@+id/txtMessage" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="this is sub activity !!" />

<Button android:id="@+id/btnFinish" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="finish" />

</LinearLayout>

サブ画面のレイアウト: res/layout/sub.xml

Page 27: Android Lecture #02 @PRO&BSC Inc

画面遷移もインテントで実施②

27

import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;

public class SubActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sub); Button btnFinish = (Button)findViewById(R.id.btnFinish); btnFinish.setOnClickListener(new OnClickListener() { public void onClick(View v) { SubActivity.this.finish(); } }); } }

サブ画面のActivity: src/SubActivity.java

Page 28: Android Lecture #02 @PRO&BSC Inc

画面遷移もインテントで実施③

28

・・・ <application android:icon="@drawable/icon" android:label="@string/app_name" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".SubActivity" /> </application> ・・・

AndroidManifest.xml (一部抜粋)

Intent intent = new Intent(MainActivity.this, SubActivity.class); startActivity(intent);

メイン画面のActivity: src/MainActivity.java (一部抜粋)

Page 29: Android Lecture #02 @PRO&BSC Inc

永続化

Page 30: Android Lecture #02 @PRO&BSC Inc

携帯電話では頻繁に要永続化

• 他アプリ起動、着呼、バッテリー切れ等々、様々な要因によりアプリが終了させられます。

⇒ 頻繁に永続化しないと状態を喪失する

• Androidの永続化方法

1) 共有プリファレンス(XMLによるハッシュマップ)

2) 内部保存領域

3) 外部保存領域

4) SQLite データベース

5) ネットワーク上のストレージ

30

Page 31: Android Lecture #02 @PRO&BSC Inc

共有プリファレンスの保存

31

// インスタンス取得 SharedPreferences pre = PreferenceManager.getDefaultSharedPreferences(this);

// エディタ取得 SharedPreferences.Editor editor = pre.edit();

// 値を書き込み editor.putString("key_text", "test"); editor.putInt("key_int", 1); editor.putLong("key_long", (long)1.1); editor.putFloat("key_float", (float)1.1); editor.putBoolean("key_bool", true);

// editor.clear(); // すべての設定を削除

// 保存 editor.commit();

Page 32: Android Lecture #02 @PRO&BSC Inc

共有プリファレンスの読み出し

32

SharedPreferences pre = PreferenceManager.getDefaultSharedPreferences(this);

/* // 名前付きプリファレンスの取得 SharedPreferences pre = getSharedPreferences("pre_key_01", MODE_PRIVATE); */

String strVal = pre.getString("key_text", "none"); int intVal = pre.getInt("key_int", 0); long longVal = pre.getLong("key_long", (long)0.0); float floatVal = pre.getFloat("key_float", (float)0.0); boolean boolVal = pre.getBoolean("key_bool", false);

Page 33: Android Lecture #02 @PRO&BSC Inc

デバッグ方法

Page 34: Android Lecture #02 @PRO&BSC Inc

LogCat の使い方 [ウィンドウ(W)] – [ビューの

表示(V)] – [LogCat] で

下部に「LogCat」ビューが追加

Log.e("error label", "error msg");

Log.w("warning label", "warning msg");

Log.i("info label", "info msg");

Log.d("debug label", "debug msg");

Log.v("verbose label", "verbose msg");

34

Page 35: Android Lecture #02 @PRO&BSC Inc

AlertDialog の使い方

35

AlertDialog.Builder builder = new AlertDialog.Builder(this);

builder.setTitle("title");

builder.setMessage("message");

builder.setPositiveButton("OK", new

DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {

Toast.makeText(getApplicationContext(),

"OK Clicked!!", Toast.LENGTH_LONG).show();

}

});

builder.setNegativeButton("No", null);

AlertDialog dialog = builder.create();

dialog.show();

Page 36: Android Lecture #02 @PRO&BSC Inc

• じゃんけんゲームの作成

– 「グー」「チョキ」「パー」のボタンを押した際に、ランダム

でアプリ側も手を出し、詳細を決める

– 10回中、何回勝つかを競うゲーム

– 最高得点と履歴を永続化して保持

– 最高得点はメイン画面に、履歴はサブ画面に表示

– 最高得点をとった際にtwitter / メールで周知できる

– 上記の他に1つ独自機能を追加 36

本日の課題