SlideShare a Scribd company logo
インテントと永続化
 2012/03/07(水)@PRO&BSC
          樋口 祐紀
  (higuchi_yuki@probsc.jp)
本日の内容
• 青空読手のご紹介
• どうやって作ってるの?
• マネタイズ
• インテント
• 永続化
• デバッグ方法
• 本日の課題
                2
青空読手のご紹介
青空読手のご紹介①
作者一覧やランキングから選択 文庫の表示 もちろんしおり機能も




                                  4
青空読手のご紹介②
               サイズ: 極大 + 太さ: 極太   サイズ: 極小 + 太さ: 極細

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




                                                 5
青空読手のご紹介③


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

  横向き表示にも対応




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




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




                       端末                                          国
1 Samsung Galaxy S                   10.00% (12,198)   1 日本        98.23% (119,826)
2 Sharp IS03                          8.93% (10,890)   2 アメリカ合衆国       0.34% (420)
3 Fujitsu Toshiba REGZA Phone T01C     7.17% (8,752)   3 中国             0.31% (384)
4 SEMC Xperia Arco                     6.09% (7,427)   4 大韓民国          0.20% (238)
5 Samsung Galaxy Tab                   5.89% (7,190)   5 台湾            0.18% (220)
6 Samsung Galaxy S2                    5.17% (6,306)   6 タイ            0.09% (112)
7 SEMC Xperia Arc                      5.15% (6,282)   7 香港            0.09% (109)
8 SEMC Xperia X10                      4.45% (5,432)   8 イギリス            0.07% (83)
9 SEMC Experia Acro                    2.62% (3,194)   9 オーストラリア         0.06% (71)
10 その他                               44.52% (54,312)   10 その他          0.43% (520)    8
どうやって作ってるの?
どうやって作ってるの!?①
   • データは青空文庫サイト *1 から
     zipファイルをDL後、解凍
       – 500文庫分のzipファイルへのリン
         クを保持

   • フォントは「IPA明朝」をダウン
     ロードして利用
   • SurfaceViewで頑張って描画
       – (背景+本文+ルビ+タイトル
         +ページ数)x 2
*1 … http://www.aozora.gr.jp/   10
どうやって作ってるの!?②
• Twitterによるつぶやき




                   11
どうやって作ってるの!?③
 • Twitterへのつぶやき投稿はこんなにかんたん!
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);




                                                             12
ちなみに、メールの場合はこんな感じ
Intent intent = new Intent();

// アクションとデータタイプを指定
intent.setAction(Intent.ACTION_SEND);
intent.setType("message/rfc822");

// TO、CC、BCC、件名、本文を順に指定
intent.putExtra(Intent.EXTRA_EMAIL,
      new String[] { "foo@example.com" });
intent.putExtra(Intent.EXTRA_CC,
      new String[] { "cc@example.com" });
intent.putExtra(Intent.EXTRA_BCC,
      new String[] { "bcc@example.com" });
intent.putExtra(Intent.EXTRA_SUBJECT, "件名");
intent.putExtra(Intent.EXTRA_TEXT, "本文の内容");

// Intent を発行
startActivity(intent);
                                               13
どうやって作ってるの!?④
                                              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='hyukix@gmail.com',
                                                  to='hyukix@gmail.com',
                                                  subject='Bug Report - AozoraYomite',
                                                  body=report)




【参考サイト】throw Life - Androidアプリのバグ報告システムを考える
http://www.adamrocker.com/blog/288/bug-report-system-for-android.html                        14
どうやって作ってるの!?⑤
• 青空プロバイダとの連携機能




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




出典:マネタイズ【monetize】の意味 - 国語辞書 - goo辞書 http://goo.gl/RRI8   17
突然ですがクイズです
• 青空読手のユーザの 3% が ¥210- で
  購入してくれていたとすると、これまでに私
  の懐にいくら入っていたでしょう?
  A. ¥10,000-
  B. ¥100,000-
  C. ¥1,000,000-
  D. もっと稼げる。そう、iPhone ならね
                            18
実はけっこう稼げるAndroid!?




230,000 (ユーザ) × 3% (購入割合)
      × ¥210- × 70% (開発者の取り分)

  =   ¥1,014,300-               19
Android有料アプリは苦戦中...
• そこで広告!Androidでは AdMob がメジャー




                                20
DL 数が伸びないことには...
                     ①   ②   ③




① アンドロイダー レビュー記事
② アンドロイダー 青空文庫比較記事
③ au one market 登録               21
昨年度末の盛り上がり!




              22
インテント
インテントって何?
  • 処理依頼メッセージのこと
      – 例: AK Notepadによる他アプリ機能




     AK Notepadにてテキ    ACTION_SEND イ ン    Twidroidにペーストさ
     ストを入力。メニューから      テ ン トが発行 さ れ 、 対   れる。ポイントは相互連
     Shareを指定すると…      応アプリがリストアップ        携を前提としてない点
出典:使って分かったAndroidとiPhoneの違い http://goo.gl/5nGc             24
Extra Data
IntentとExtraData                                            –
                                                            –
                                                                EXTRA_ALARM_COUNT
                                                                EXTRA_BCC
Activity Actions         Broadcast Actions                  –   EXTRA_CC
–   ACTION_MAIN             – ACTION_TIME_TICK              –   EXTRA_CHANGED_COMPONENT_NAME
–   ACTION_VIEW             – ACTION_TIME_CHANGED           –   EXTRA_DATA_REMOVED
–   ACTION_ATTACH_DATA – ACTION_TIMEZONE_CHANGED            –   EXTRA_DOCK_STATE
–   ACTION_EDIT             – ACTION_BOOT_COMPLETED         –   EXTRA_DOCK_STATE_CAR
–   ACTION_PICK             – ACTION_PACKAGE_ADDED          –   EXTRA_DOCK_STATE_DESK
–   ACTION_CHOOSER          – ACTION_PACKAGE_CHANGED        –   EXTRA_DOCK_STATE_UNDOCKED
–   ACTION_GET_CONTENT – ACTION_PACKAGE_REMOVED             –   EXTRA_DONT_KILL_APP
–   ACTION_DIAL             – ACTION_PACKAGE_RESTARTED      –   EXTRA_EMAIL
–   ACTION_CALL             – ACTION_PACKAGE_DATA_CLEA      –   EXTRA_INITIAL_INTENTS
–   ACTION_SEND                 RED                         –   EXTRA_INTENT
–   ACTION_SENDTO           – ACTION_UID_REMOVED            –   EXTRA_KEY_EVENT
–   ACTION_ANSWER           – ACTION_BATTERY_CHANGED        –   EXTRA_PHONE_NUMBER
–   ACTION_INSERT           – ACTION_POWER_CONNECTED        –   EXTRA_REMOTE_INTENT_TOKEN
–   ACTION_DELETE           – ACTION_POWER_DISCONNECT       –   EXTRA_REPLACING
    ACTION_RUN                  ED
–                                                           –   EXTRA_SHORTCUT_ICON
    ACTION_SYNC             – ACTION_SHUTDOWN
–                                                           –   EXTRA_SHORTCUT_ICON_RESOURCE
–   ACTION_PICK_ACTIVITY                                    –   EXTRA_SHORTCUT_INTENT
–   ACTION_SEARCH                                           –   EXTRA_STREAM
–   ACTION_WEB_SEARCH                                       –   EXTRA_SHORTCUT_NAME
–   ACTION_FACTORY_TEST                                     –   EXTRA_SUBJECT
     // インテントによるブラウザ起動の例                                    –   EXTRA_TEMPLATE
     Uri uri = Uri.parse("http://probsc.jp");               –   EXTRA_TEXT
     Intent intent = new Intent(Intent.ACTION_VIEW, uri);   –   EXTRA_TITLE
     startActivity(intent);                                 –   EXTRA_UID              25
画面遷移もインテントで実施①
<?xml version="1.0" encoding="utf-8"?>       サブ画面のレイアウト:
<LinearLayout                                     res/layout/sub.xml
  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>
                                                                 26
画面遷移もインテントで実施②
import   android.app.Activity;                サブ画面のActivity:
import   android.os.Bundle;                      src/SubActivity.java
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();
                 }
            });
     }
}                                                                 27
画面遷移もインテントで実施③
・・・
                                        AndroidManifest.xml (一部抜粋)
<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>
・・・

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

Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent);
                                                                    28
永続化
携帯電話では頻繁に要永続化
• 他アプリ起動、着呼、バッテリー切れ等々、様々
  な要因によりアプリが終了させられます。
 ⇒ 頻繁に永続化しないと状態を喪失する

• Androidの永続化方法
 1)   共有プリファレンス(XMLによるハッシュマップ)
 2)   内部保存領域
 3)   外部保存領域
 4)   SQLite データベース
 5)   ネットワーク上のストレージ
                                 30
共有プリファレンスの保存
// インスタンス取得
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();
                                                          31
共有プリファレンスの読み出し
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);



                                                          32
デバッグ方法
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
AlertDialog の使い方
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();

                                                               35
本日の課題
• じゃんけんゲームの作成
 – 「グー」「チョキ」「パー」のボタンを押した際に、ランダム
   でアプリ側も手を出し、詳細を決める
 – 10回中、何回勝つかを競うゲーム
 – 最高得点と履歴を永続化して保持
 – 最高得点はメイン画面に、履歴はサブ画面に表示
 – 最高得点をとった際にtwitter / メールで周知できる
 – 上記の他に1つ独自機能を追加
                                   36

More Related Content

PDF
AOZORAYOMITE and Intent
PDF
BigDataの集め方
PPTX
Aiwolf seminar 2019_ja
PDF
人狼知能プログラミング演習資料2015
PDF
[コデアル][Programming24]Androidアプリ勉強会01
PDF
Programming24 第3回Androidアプリ勉強会
PDF
Programming24 第2回androidアプリ勉強会
PDF
モテたい...Watsonでモテる秘訣を...ディスカバリーしてみた:女性限定! クラウド勉強会 ~Watson&Node-REDでアプリ開発~
AOZORAYOMITE and Intent
BigDataの集め方
Aiwolf seminar 2019_ja
人狼知能プログラミング演習資料2015
[コデアル][Programming24]Androidアプリ勉強会01
Programming24 第3回Androidアプリ勉強会
Programming24 第2回androidアプリ勉強会
モテたい...Watsonでモテる秘訣を...ディスカバリーしてみた:女性限定! クラウド勉強会 ~Watson&Node-REDでアプリ開発~

Viewers also liked (8)

PDF
Android Lecture #03 @PRO&BSC Inc.
PDF
Android Lecture #01 @PRO&BSC Inc.
PDF
Android Lecture #04 @PRO&BSC Inc.
PDF
Programmer @jc-21 2014/03/29
PDF
AozoraYomite @InfoTalk 2012/12/21
PDF
カジュアルにMongo dbのbackup機能説明
PDF
月間10億pvを支えるmongo db
PDF
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #01 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.
Programmer @jc-21 2014/03/29
AozoraYomite @InfoTalk 2012/12/21
カジュアルにMongo dbのbackup機能説明
月間10億pvを支えるmongo db
Succession “Losers”: What Happens to Executives Passed Over for the CEO Job?
Ad

Similar to Android Lecture #02 @PRO&BSC Inc. (20)

PDF
Tokyo GTUG Bootcamp2010
PDF
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
PDF
Titanium勉強会
PDF
データマイニング+WEB勉強会資料第6回
PDF
Jqm20120804 publish
PDF
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
PDF
リアルFacebookガジェットを作った(ロングバージョン)
PPTX
学生向けAndroid勉強会(入門編)
PDF
CodeIgniterによるPhwittr
PDF
Zend Frameworkで始める携帯サイト
PDF
オープンデータセミナー in 鳥取
PPT
20111031 MobileWeb at TDC
PDF
リアルFacebookガジェットを作った
PDF
0621 ndk game
PPT
Titanium Mobile
PDF
PF部2011年12月勉強会.androidsola
PDF
Azure IoT Edge で Custom Vision
PDF
20150209 甲府-web新世紀2
PDF
冬だからAndroid再入門
PDF
SocialWeb Conference vol.5 OpenSocial Night #2
Tokyo GTUG Bootcamp2010
Mashup Caravan in オープンソースカンファレンス2011 Hiroshima: infoScoop OpenSource
Titanium勉強会
データマイニング+WEB勉強会資料第6回
Jqm20120804 publish
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
リアルFacebookガジェットを作った(ロングバージョン)
学生向けAndroid勉強会(入門編)
CodeIgniterによるPhwittr
Zend Frameworkで始める携帯サイト
オープンデータセミナー in 鳥取
20111031 MobileWeb at TDC
リアルFacebookガジェットを作った
0621 ndk game
Titanium Mobile
PF部2011年12月勉強会.androidsola
Azure IoT Edge で Custom Vision
20150209 甲府-web新世紀2
冬だからAndroid再入門
SocialWeb Conference vol.5 OpenSocial Night #2
Ad

Android Lecture #02 @PRO&BSC Inc.

  • 1. インテントと永続化 2012/03/07(水)@PRO&BSC 樋口 祐紀 (higuchi_yuki@probsc.jp)
  • 2. 本日の内容 • 青空読手のご紹介 • どうやって作ってるの? • マネタイズ • インテント • 永続化 • デバッグ方法 • 本日の課題 2
  • 5. 青空読手のご紹介② サイズ: 極大 + 太さ: 極太 サイズ: 極小 + 太さ: 極細 文字のサイズと太さの指定 5
  • 6. 青空読手のご紹介③ SDカードや本体内の テキストの読み込みも可能 横向き表示にも対応 6
  • 8. ディベロッパーコンソール 端末 国 1 Samsung Galaxy S 10.00% (12,198) 1 日本 98.23% (119,826) 2 Sharp IS03 8.93% (10,890) 2 アメリカ合衆国 0.34% (420) 3 Fujitsu Toshiba REGZA Phone T01C 7.17% (8,752) 3 中国 0.31% (384) 4 SEMC Xperia Arco 6.09% (7,427) 4 大韓民国 0.20% (238) 5 Samsung Galaxy Tab 5.89% (7,190) 5 台湾 0.18% (220) 6 Samsung Galaxy S2 5.17% (6,306) 6 タイ 0.09% (112) 7 SEMC Xperia Arc 5.15% (6,282) 7 香港 0.09% (109) 8 SEMC Xperia X10 4.45% (5,432) 8 イギリス 0.07% (83) 9 SEMC Experia Acro 2.62% (3,194) 9 オーストラリア 0.06% (71) 10 その他 44.52% (54,312) 10 その他 0.43% (520) 8
  • 10. どうやって作ってるの!?① • データは青空文庫サイト *1 から zipファイルをDL後、解凍 – 500文庫分のzipファイルへのリン クを保持 • フォントは「IPA明朝」をダウン ロードして利用 • SurfaceViewで頑張って描画 – (背景+本文+ルビ+タイトル +ページ数)x 2 *1 … http://www.aozora.gr.jp/ 10
  • 12. どうやって作ってるの!?③ • Twitterへのつぶやき投稿はこんなにかんたん! 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); 12
  • 13. ちなみに、メールの場合はこんな感じ Intent intent = new Intent(); // アクションとデータタイプを指定 intent.setAction(Intent.ACTION_SEND); intent.setType("message/rfc822"); // TO、CC、BCC、件名、本文を順に指定 intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "foo@example.com" }); intent.putExtra(Intent.EXTRA_CC, new String[] { "cc@example.com" }); intent.putExtra(Intent.EXTRA_BCC, new String[] { "bcc@example.com" }); intent.putExtra(Intent.EXTRA_SUBJECT, "件名"); intent.putExtra(Intent.EXTRA_TEXT, "本文の内容"); // Intent を発行 startActivity(intent); 13
  • 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='hyukix@gmail.com', to='hyukix@gmail.com', subject='Bug Report - AozoraYomite', body=report) 【参考サイト】throw Life - Androidアプリのバグ報告システムを考える http://www.adamrocker.com/blog/288/bug-report-system-for-android.html 14
  • 18. 突然ですがクイズです • 青空読手のユーザの 3% が ¥210- で 購入してくれていたとすると、これまでに私 の懐にいくら入っていたでしょう? A. ¥10,000- B. ¥100,000- C. ¥1,000,000- D. もっと稼げる。そう、iPhone ならね 18
  • 19. 実はけっこう稼げるAndroid!? 230,000 (ユーザ) × 3% (購入割合) × ¥210- × 70% (開発者の取り分) = ¥1,014,300- 19
  • 21. DL 数が伸びないことには... ① ② ③ ① アンドロイダー レビュー記事 ② アンドロイダー 青空文庫比較記事 ③ au one market 登録 21
  • 24. インテントって何? • 処理依頼メッセージのこと – 例: AK Notepadによる他アプリ機能 AK Notepadにてテキ ACTION_SEND イ ン Twidroidにペーストさ ストを入力。メニューから テ ン トが発行 さ れ 、 対 れる。ポイントは相互連 Shareを指定すると… 応アプリがリストアップ 携を前提としてない点 出典:使って分かったAndroidとiPhoneの違い http://goo.gl/5nGc 24
  • 25. Extra Data IntentとExtraData – – EXTRA_ALARM_COUNT EXTRA_BCC Activity Actions Broadcast Actions – EXTRA_CC – ACTION_MAIN – ACTION_TIME_TICK – EXTRA_CHANGED_COMPONENT_NAME – ACTION_VIEW – ACTION_TIME_CHANGED – EXTRA_DATA_REMOVED – ACTION_ATTACH_DATA – ACTION_TIMEZONE_CHANGED – EXTRA_DOCK_STATE – ACTION_EDIT – ACTION_BOOT_COMPLETED – EXTRA_DOCK_STATE_CAR – ACTION_PICK – ACTION_PACKAGE_ADDED – EXTRA_DOCK_STATE_DESK – ACTION_CHOOSER – ACTION_PACKAGE_CHANGED – EXTRA_DOCK_STATE_UNDOCKED – ACTION_GET_CONTENT – ACTION_PACKAGE_REMOVED – EXTRA_DONT_KILL_APP – ACTION_DIAL – ACTION_PACKAGE_RESTARTED – EXTRA_EMAIL – ACTION_CALL – ACTION_PACKAGE_DATA_CLEA – EXTRA_INITIAL_INTENTS – ACTION_SEND RED – EXTRA_INTENT – ACTION_SENDTO – ACTION_UID_REMOVED – EXTRA_KEY_EVENT – ACTION_ANSWER – ACTION_BATTERY_CHANGED – EXTRA_PHONE_NUMBER – ACTION_INSERT – ACTION_POWER_CONNECTED – EXTRA_REMOTE_INTENT_TOKEN – ACTION_DELETE – ACTION_POWER_DISCONNECT – EXTRA_REPLACING ACTION_RUN ED – – EXTRA_SHORTCUT_ICON ACTION_SYNC – ACTION_SHUTDOWN – – EXTRA_SHORTCUT_ICON_RESOURCE – ACTION_PICK_ACTIVITY – EXTRA_SHORTCUT_INTENT – ACTION_SEARCH – EXTRA_STREAM – ACTION_WEB_SEARCH – EXTRA_SHORTCUT_NAME – ACTION_FACTORY_TEST – EXTRA_SUBJECT // インテントによるブラウザ起動の例 – EXTRA_TEMPLATE Uri uri = Uri.parse("http://probsc.jp"); – EXTRA_TEXT Intent intent = new Intent(Intent.ACTION_VIEW, uri); – EXTRA_TITLE startActivity(intent); – EXTRA_UID 25
  • 26. 画面遷移もインテントで実施① <?xml version="1.0" encoding="utf-8"?> サブ画面のレイアウト: <LinearLayout res/layout/sub.xml 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> 26
  • 27. 画面遷移もインテントで実施② import android.app.Activity; サブ画面のActivity: import android.os.Bundle; src/SubActivity.java 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(); } }); } } 27
  • 28. 画面遷移もインテントで実施③ ・・・ AndroidManifest.xml (一部抜粋) <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> ・・・ メイン画面のActivity: src/MainActivity.java (一部抜粋) Intent intent = new Intent(MainActivity.this, SubActivity.class); startActivity(intent); 28
  • 30. 携帯電話では頻繁に要永続化 • 他アプリ起動、着呼、バッテリー切れ等々、様々 な要因によりアプリが終了させられます。 ⇒ 頻繁に永続化しないと状態を喪失する • Androidの永続化方法 1) 共有プリファレンス(XMLによるハッシュマップ) 2) 内部保存領域 3) 外部保存領域 4) SQLite データベース 5) ネットワーク上のストレージ 30
  • 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(); 31
  • 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); 32
  • 34. 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
  • 35. AlertDialog の使い方 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(); 35
  • 36. 本日の課題 • じゃんけんゲームの作成 – 「グー」「チョキ」「パー」のボタンを押した際に、ランダム でアプリ側も手を出し、詳細を決める – 10回中、何回勝つかを競うゲーム – 最高得点と履歴を永続化して保持 – 最高得点はメイン画面に、履歴はサブ画面に表示 – 最高得点をとった際にtwitter / メールで周知できる – 上記の他に1つ独自機能を追加 36