函館IKA ICS開発情報

Preview:

Citation preview

ICS開発情報

@vvakame

Saturday, March 24, 12

Honeycomb• Fragment

• Action Bar

• Loader

• Gamepad, Joypad

• USB Host

• ADK (Android Open Accessory Development Kit)

世間がスルーwSaturday, March 24, 12

Ice Cream Sandwich

• Action Provider

• Android Beam

• Wi-Fi Direct

Saturday, March 24, 12

Compatibility Package• 一部、新APIの互換パッケージ有り

• Android 1.6(Donuts) 以降に対応• 以下のAPIが使えるよ!

• 各種 Fragment• 各種 Loader• 各種 Adapter• MenuCompat

Action Bar はありません。ActionBarSherlock というのがあります。

Saturday, March 24, 12

Fragment

• Android開発の新しい基本要素

• ライフサイクルイベントを持つ

• 部品化されたActivity

• ライブラリ化がしやすい

必修科目!!!

Saturday, March 24, 12

構成の変化

Activity

View

View

View

今までの作り方

View

View

Saturday, March 24, 12

構成の変化

Activity

View無しFragment

View有りFragmentView

View

View

これからの作り方

Saturday, March 24, 12

構成の変化• ロジックを書く場所

• 今まではActivityに書いたり

• これからはFragmentに書く!

• ActivityはFragmentの交差点に

• Fragmentは小型Activity的な役割

Saturday, March 24, 12

使い方 (View有り)

• スマホ・タブレット対応に便利

• 1Fragmentだけ表示=スマホ用

• 複数Frament表示=タブレット用

• ↑スマホで複数Fragmentもあり

Saturday, March 24, 12

<?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:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" />

<fragment android:id="@+id/fragment" android:name="net.vvakame.hakodateika.SampleFragment" android:layout_width="match_parent" android:layout_height="wrap_content" />

</LinearLayout>

使い方 (View有り)

こんだけ

Saturday, March 24, 12

使い方 (View有り)

<?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:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/this_is_fragment" />

</LinearLayout>

public class SampleFragment extends Fragment {

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment, container); }}

Saturday, March 24, 12

使い方 (View無し)

• ロジックのライブラリ化に便利

• ライフサイクルイベントあるからね!

• プログラムからFragmentを追加してやる

• onCreateView で null を返すとエラー

Saturday, March 24, 12

使い方 (View無し)

public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

{ // Fragmentの作成と登録 SampleFragment fragment = new SampleFragment(); FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(fragment, "SampleFragment"); transaction.commit(); } }}

compat 利用時はFragmentActgivityを継承

Saturday, March 24, 12

使い方 (View無し)

• ライブラリ化の例

• Android Beamの簡単ライブラリ化

• Activityに2つのinterfaceを実装

• AndroidManifestに少し書き足す

• ↑これだけで簡単に利用可能!!実際のコードを見てみます

Saturday, March 24, 12

Fragmentの差し替え

• 画面遷移を表現することも可能

• FragmentManager とか

• FragmentTransaction とか

Saturday, March 24, 12

addToBackStackpublic class MainActivity extends Activity implements OnClickListener { int mCount = 1;

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

{ // 初回は addToBackStackなし SampleFragment fragment = new SampleFragment("No." + mCount); FragmentTransaction tx = getFragmentManager().beginTransaction(); tx.replace(R.id.fragment_place, fragment).commit(); mCount++; } }

@Override public void onClick(View v) { SampleFragment fragment = new SampleFragment("No." + mCount); FragmentTransaction tx = getFragmentManager().beginTransaction(); tx.replace(R.id.fragment_place, fragment).addToBackStack(null).commit(); mCount++; }} Backキーで1つ前のFragmentに戻れる!

Saturday, March 24, 12

おすすめイディオム• onAttach で独自コールバックを取得

public class SampleFragment extends Fragment { public interface OnSampleCallback { public void onXxx(); }

public interface OnSampleCallbackPicker { public OnSampleCallback getOnSampleCallback(); }

OnSampleCallback mCallback;

@Override public void onAttach(Activity activity) { super.onAttach(activity);

if (activity instanceof OnSampleCallbackPicker == false) { throw new ClassCastException( "activity が OnSampleCallbackPicker を実装していません."); } mCallback = ((OnSampleCallbackPicker) activity).getOnSampleCallback(); if (mCallback == null) { throw new NullPointerException("activityからcallbackが取得できませんでした"); } }}

Saturday, March 24, 12

おすすめイディオム• Activity で独自コールバックを実装

public class MainActivity extends Activity implements OnSampleCallbackPicker { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

{ // Fragmentの作成と登録 SampleFragment fragment = new SampleFragment(); FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(fragment, "SampleFragment"); transaction.commit(); } }

public OnSampleCallback getOnSampleCallback() { return new OnSampleCallbackImpl(); }

class OnSampleCallbackImpl implements OnSampleCallback {

public void onXxx() { } }}

複数Fragment利用時に名前の衝突が少ない

Saturday, March 24, 12

おすすめイディオム• ActivityでコードからFragmentを差し替える場合public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);

{ // Fragmentの作成と登録 SampleFragment fragment = new SampleFragment(new OnSampleCallbackImpl()); FragmentManager manager = getFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(fragment, "SampleFragment"); transaction.commit(); } }

class OnSampleCallbackImpl implements OnSampleCallback {

public void onXxx() { } }}

Fragmentの使い回しがよりやりやすく

Saturday, March 24, 12

onDestroy

FragmentのライフサイクルActivity FragmentonCreate

onStart

onResume

onPause

onStop

onDestroy

onAttachonCreate

onCreateView

onActivityCreated

onStart

onResume

onPause

onStop

onDestroyViewonDetach

Saturday, March 24, 12

onDestroyonDestroyView

onDetach

よく使うやつActivity FragmentonCreate

onStart

onResume

onPause

onStop

onDestroy

onAttachonCreate

onCreateView

onActivityCreated

onStart

onResume

onPause

onStop

Saturday, March 24, 12

これ

Saturday, March 24, 12

Action Bar

• 今まではMenuキー(ハードキー)だった

• 機能があるか押すまでわからん…

• じゃ、画面上に出せばよくね?

• ↑たぶんGoogleはこう思った

Saturday, March 24, 12

使い方

• AndroidManifest.xml で…

• targetSdkVersion を 11以上

• minSdkVersion を 11以上

• ↑どっちか!

Saturday, March 24, 12

ActionBarにできること• 今までのMenuと同じこと

• Viewを配置したりできる

• SplitActionBarで画面下に表示することもできる

Saturday, March 24, 12

Loader

• AsyncTask のお利口さんVersion

• AsyncTaskLoader

• CursorLoader

• 処理結果をキャッシュしてくれる

Saturday, March 24, 12

vs AsyncTask?• Loaderがよさそう

• データ更新通知が受け取れるもの

• AsyncTask がよさそう

• 頻繁に更新されるもの

• キャッシュの意味が薄いもの

• 毎回実行されないと困るものAsyncTask がいらなくなるわけじゃなさそうです

Saturday, March 24, 12

ゲーム用HID対応大幅強化

全部Joystick扱いGamepadは...?

Saturday, March 24, 12

リッチなゲームも作れる

USB接続のKeyboardやMouseもサポートされたので幅がさらに↑↑

• ActivityにGenericMotionEvent が追加

• on~ とか dispatch~ とか

• ボタン系は従来通りKeyEvent

• アナログ系はGenericMotionEvent

• 一定期間の入力が一気に渡されるのでMotionEvent#getHistoricalXXX 使う

Saturday, March 24, 12

キーコンフィグだけ対応でもおk

既存のゲームも操作性大幅↑↑

Saturday, March 24, 12

USB Host

もうすこし詳しい説明あります

3.1

ADK とは違うのだよ!

Saturday, March 24, 12

USB Host?

プロトコルが分かればなんでも出来る…!?デバイスメーカーさん、対応Androidアプリ開発いかがですか!

• 今までのAndroidはDevice側だった

• マスストレージ とか

• 今度のAndroidはHost側になれます!

• ラベルプリンタを接続して印刷

• LEDディスプレーに図形表示 他

Saturday, March 24, 12

実際にやってみた

タカラトミー グリッターパネルhttp://amzn.to/glitterpanel

Saturday, March 24, 12

ADK3.1

Saturday, March 24, 12

ADK?

@magoroku15 先生の資料がスゴい!

• Androidはデバイス側

• ADKがホスト側 …なんか直感と逆!

• Android 周辺機器が作れる

• 2.3.4 以降対応のBackport有り

RT社のADKボード

アプリ連携も容易!ハード対応アプリがなければマーケットに飛ばしたりも可能

Saturday, March 24, 12

ActionProvider

• ActionBar用の動作のライブラリ化

• 公式だと ShareActionProvider

• 正直他にどう使えばいいのやら…?

• 良い活用方法が思いついたら教えて!

Saturday, March 24, 12

使い方

<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:id="@+id/pick_action_provider" android:actionProviderClass="net.vvakame.applist.ApplicationActionProvider" android:icon="@android:drawable/ic_menu_send" android:showAsAction="always"/>

</menu>

ActionBar 実装クラスを指定します

Saturday, March 24, 12

Android Beam• NFC 

• 端末タッチで簡単に通信可能

• でも転送速度は遅い 1KBが目安

• 端末間通信のための便利なAPI

• かっこいいUI!

• 送信先アプリ指定も可能!

Saturday, March 24, 12

NFC?• Near Field Communication の略

• FeliCa とか Kitaca, Suica みたいな奴

• 実は 2.3 時代からNFCのAPIはあった

• 2.3.4 から書込/送信も可能に

• Beam は OSとして使い方を示した!

Saturday, March 24, 12

Android Beam?

• 主に端末 ←→ 端末の情報交換

• Youtubeアプリで見てる動画の共有

• 起動中アプリを相手側で起動

• 送信先アプリの指定が可能 (AAR)アプリにBeam用実装がない場合、受信側で同じアプリを起動します。なかったらマーケットへ飛びます。

Saturday, March 24, 12

使い方

• AndroidManifest.xmlに書く

• NfcAdapter経由でコールバックを登録

• NDEF を送って送受信する

実際のコードを見てみます

Saturday, March 24, 12

NDEFって何?

• NFC Data Exchange Format の略

• NFCによるデータ交換はこの形式

• Beamするだけならテンプレコードでおk

• 別に覚えなくても問題なし!

Saturday, March 24, 12

android.nfc.NdefMessage

NdefRecord NdefRecord

NdefMessage

• NdefMessageは1つ以上のNdefRecordから構成される

• 一般的には1レコードだけっぽい

Saturday, March 24, 12

android.nfc.NdefRecord

NdefRecord NdefRecord

NdefMessage

MB ME CF SR IL TNF

LENGTH INFO(TYPE, PAYLOAD, ID)

BODY(TYPE, ID, PAYLOAD)Saturday, March 24, 12

どう解釈するの?

• TNFとTypeの値によってPayloadの解釈の仕方が変わる

• AndroidSDKに含まれるNFCDemoではText, Uri, SmartPosterに対応

• NFC RTD でぐぐれ

Saturday, March 24, 12

略語• NFC Near Field Communication• NDEF NFC Data Exchange Format• MB Message Begin• ME Message End• CF Chunk Flag• SR Short Record• IL ID Length• TNF Type Name Format• RTD Record Type Definition

Saturday, March 24, 12

Wi-FI Direct4.0

日経ソフトウェア5月号今日発売!

Saturday, March 24, 12

Wi-Fi Direct• 端末同士でWi-Fiで通信できる

• 通信速度が早い

• セキュア (WPA2, WPS)

• 接続も比較的簡単…

• フレームワークの品質が悪い!!!!

• 2.3時代のNFCのAPIを見ているよう…

Saturday, March 24, 12

Wi-Fi Direct (仕様)• 機器同士で通信が可能

• APの助けとかはいらない

• Ad hoc とは違う (通常の接続と両立)

• Androidでは今のところ両立不可

• プリンタに直接接続して印刷とか

• 今のとこOSは手伝ってくれない

Saturday, March 24, 12

Frameworkェ…!• OS巻き込んで落ちる

• 切断→再接続 を3セットくらいで落ちる

• 原稿書いてる途中10分に1回リブる

• OS設定画面のON/OFFイジっただけで落ちる

• 使い物になるかァ!ヽ(`!´)ノ

Saturday, March 24, 12

(´・ω・`)

まだ製品品質じゃないね…

こなれるのまとうか…

今後の進化は超楽しみです!端末間通信は全部コレになるといいかも

Saturday, March 24, 12

接続の流れアプリの呼び出し処理OSからの通知ユーザにさせる操作

0. Wi-Fi Directを有効にする (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION がBroadcastされる)

1. WifiP2pManager#discoverPeers で接続可能なPeerを探す2. WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION がBroadcastされてくる3. WifiP2pManager#requestPeers で各Peerの情報をリクエストする4. WifiP2pManager.PeerListListener#onPeersAvailable にコールバックが来る5. 接続の前準備として、WifiP2pConfig を組み立てる WPSの指定など6. WifiP2pManager#connect で指定したPeerに接続する7. WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION がBroadcastされてくる8. WifiP2pManager#requestConnectionInfo で接続情報をリクエストする9. WifiP2pManager.ConnectionInfoListener#onConnectionInfoAvailable にコールバックが来る10. 通信のための処理を行う(Socketを開き通信を行うなど)

11. WifiP2pManager#removeGroup を呼び出し接続を解除する

Saturday, March 24, 12

必要な権限

<?xml version="1.0" encoding="utf-8"?><manifest 略> <uses-sdk android:minSdkVersion="14" /> <!-- Wi-Fi Direct 接続確立 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<!-- 通信のためのソケットを開くまで --> <uses-permission android:name="android.permission.INTERNET" />

<uses-feature android:name="android.hardware.wifi.direct" />

略</manifest>

Saturday, March 24, 12

おすすめ書籍

私が書きました

• 第1章 Android 4.0(ICS)

• 第2章 フラグメント

• 第3章 アクションバー

• 第4章 ノーティフィケーション

• 第5章 アニメーション

• 第6章 アプリケーションウィジェット

• 第7章 コピー&ペースト

• 第8章 ドラッグ&ドロップ

• 第9章 ローダー

yanzmSaturday, March 24, 12

気になること?

Fragment

Action Bar

Loader

Gamepad, Joypad

USB Host

ADK

Action Provider

Android

Wi-Fi Direct

Saturday, March 24, 12