2012年7月4日水曜日

Google I/O 2012 セッションまとめ : What's New in Android?

What's New in Android?

■ パフォーマンス

 スムースな操作感を実現
 基本的にはパフォーマンスの問題
 VSync(ヴィーシンクと発音する) による描画とアニメーション
  - 新しい Choreographer と TimeAnimator クラス
 ストリーミング入力
 より速い invalidation と描画
 必要に応じてトリプルバッファリング


■ フレームワークの機能

 Widget と Wallpaper に機能追加

 Widget
  • 3 party ランチャーから AppWidgetManager.ACTION_APPWIDGET_BIND で直接 AppWidget を bind するリクエストをユーザーに投げられる
  • AppWidgetProvider.onAppWidgetExtrasChanged() で AppWidget をサイズが変更されたことを検知できる
  • remote views に対して縦横のレイアウトが使えるようになった
  • remote views にメモリーリミットが付いた(画面サイズの関数)
  • GridLayout と ViewStub が remote で使えるようになった(つまり AppWidget で使える)
 Wallpaper
  • アプリの wallpapers を見るための新しい Intent である ACTION_CHANGE_LIVE_WALLPAPER が追加された(今までは live wallpaper アプリを作ったら、「ホームに行って〇〇してください」というようなインストラクションを表示するだけのアプリで対処していたが、アプリから直接 wallpaper を選択するピッカーを開くことができるようになった)


 Animation と LayoutTransition

 ViewPropertyAnimator
  • withLayer() メソッドが追加された
    これにより、複数の複雑なアニメーションを組み合わせたときや、複雑なレイアウトのビューをアニメーションさせるときによりよいパフォーマンスを発揮できる

    ハードウェアレイヤー ON → アニメーション → ハードウェアレイヤー OFF

    は boilerplate code なのでこのメソッドとして用意したとのこと view.animate().rotationY(180).withLayer()
  • withStartAction() と withEndAction() メソッドが追加された
    これまでは Animation のリスナーをセットしていたが、より簡単に記述できるようになった。
view.animate().translationX(0).withStartAction(new Runnable() { public void run() { view.setTranslationX(-view.getWidth()); } }); view.animate().alpha(0).withEndAction(new Runnable() { public void run() { parent.removeView(view); } });  LayoutTransition
  • 新しい Transition タイプの Changing を有効にできるようになった
LayoutTransition t = new LayoutTransition(); t.enableTransitionType(LayoutTransition.CHANGING); container.setLayoutTransition(t);

 その他
  • Non-editable TextView のメモリ使用が改善された & 長いテキストに対するパフォーマンスがあがった
  • ClipData でスタイルされた文字をサポートするようになった(太字や斜線などの情報もこぴぺできる)
  • システム全体のメモリ管理がよくなった
  • ActivityManager.getMyMemoryState()
  • ComponentCallback2.TRIM_*
  • GridLayout と TextureView が support library に追加され ICS 以前でも使えるようになった
  • データベースクエリをキャンセルできるようになった
  • Cursors, ContentProviders, Loaders
signal = new CancellationSignal(); signal.setOnCancelListener(new OnCancelListener() { @Override public void onCancel() { // Cancelled contacts query } } Cursor c = r.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null, signal); signal.cancel();

 Activity の Animation
  • ActivityOptions
    Activity を開始するときのアニメーションをよりリッチにできる(例えば、Jelly Bean では Recent Apps から起動するとき、Recent Apps のサムネイルがそのままスケールアップするアニメーションになっている)
ActivityOptions opts; opts = ActivityOptions.makeScaleUpAnimation(view, 0, 0, view.getWidth(), view.getHeight()); startActivity(intent, opts.toBundle());

 Navigation
  • <activity> タグに android:parentActivityName 属性をつけることで、自動で 'UP' ナビゲーションをつけてくれる
  • support library で利用可能 ...
  • TaskStackBuilder
        合成したタスクスタックの簡単につくれる
        Notification や AppWidget からアプリを起動してバックキーで戻ったときにどこに戻るかのスタックをつくるのに便利
TaskStackBuilder.create(this) .addParentStack(ContentActivity.class) .addNextIntent(new Intent(this, ContentActivity.class) .putExtra(ContentActivity.EXTRA_TEXT, "From Notification") .startActivities();

 Internationalization
  • 新しいロケールとフォント : Arabic, Hebrew
  • right-to-left(RTL) text のサポートの改善 : TextView, EditText, StaticLayout, Canvas
  • RTL text のパフォーマンスの改善


 Accessibility
  • ジェスチャーによる画面上の全エレメントの探索
    AccessibilityService.GESTURE_SWIPE_UP, GESTURE_SWIPE_DOWN,...
    ナビゲーションボタン(Home, back, recent, notification)を含む
  • 現在のエレメントをダブルタップでアクティブ化
  • 単語、行、段落ごとのテキストリーディング
  • 標準のViewで動く : 特殊な場合には View.setImportantForAccessibility()
  • セマンティック構造でのカスタムビュー : View.getAccessibilityNodeProvider() を Override
  • Support library で使える


 External Storage Access
  • 外部ストレージの読み込み用パーミッション : android.permission.READ_EXTERNAL_STORAGE
    現在はこのパーミッションがなくても動くが、将来のリリースではこのパーミッションを必要とする予定
    Developer options の Protect USB storage にチェックをいれると、このパーミッションを正しく使っているかをチェックできる


 Limiting Costly Downloads
  • ConnectivityManager.isActiveNetworkMetered() : 現在の通信が測定されているか(ダウンロードにリミットが課されているか)をアプリから検知する
 


■ グラフィックスとメディア

 Renderscript Compute
  • NEON instruction のサポート
  • Texture sampling : rsSample()
  • x86エミュレータとx86デバイス上でのデバッグ
  • 1つのファイルで複数の root()-style カーネル


 Media
  • low-level コーデックデータへの API アクセス
  • "Media Codec APIs in Android Jelly Bean" を見てね


 Audio Latency Improvements
  • OpenSL, soundpool, tone generator のレイテンシの改善
  • いくつかのデバイスでの重大な warm latency の改善(デバイス依存)
  • ほかいろいろ


 NFC
  • Bluetooth を介して大きいデータをやりとり(タップしてファイルをデバイス間で移動)
  • Bluetooth ハンドセットやスピーカーとタップしてペアリング



■ Google Play

 user comments への返信(現在はまだ全員ができるわけではなく、top developer などバッチがある開発者から)

 in-app subscriptions

 その他
  • 新しい販売可能国
  • Android Developer Console へのチームアクセス
  • 販売レポート
  • Android Expansion Files : 50MB までの APK, 4GB までの Expansion files
  • 最適化された APK アップデート
  • Unlocked デバイスが Google Play から購入可能



■ SDK と Tools

 x86 エミュレータ : Android 2.3, Android 4.0

 エミュレータでの GPU サポート
  • Android 4.0.3+
  • OpenGL/ES 1.x + 2.x をサポート
  • ハードウェアアクセラレーションをつかったアプリケーションをサポート
 物理的な Android デバイスを介したセンサーとマルチタッチのサポート

 New tool
  • lint
  • Tracer for OpenGL ES
  • Device Monitor(DDMS の置き換え、より UI がリッチで hierarchyview などいくつかのツールが含まれている)
  • System Trace


 ADT
  • 新しい tools の統合 : lint, Tracer for OpenGL ES など
  • アプリケーションテンプレート
  • NDK サポートの改善 : Build, Debug
  • レイアウトエディターの改善 : 新しいプロパティシート
  • 多くのUIとパフォーマンスの改善



■ Notification(通知)

 Priority
  • Notification.priority
  • Notification.Builder.setPriority(int)
  • PRIORITY_MAX = 2, PRIORITY_HIGH = 1, PRIORITY_DEFAULT = 0, PRIORITY_LOW = -1, PRIORITY_MIN = -2
  • システム UI へのヒント
  • priority に応じて位置や見え方が変わる
  • 上部に配置するために FLAG_ONGOING を使うのやめること!変わりに高い priority を使う
  • ステータスバーに表示されない notification を作れるようになった(PRIORITY_MIN)


 Priority buckets
  • MAX : very urgent/active tasks : 着信、ターンバイターン方式の誘導、緊急アラート
  • HIGH : 重要なメール、SMS/チャット、"widgets"
  • DEFAULT : その他(JB以前の Notification はこれになる)
  • LOW : ジャンクメール、chatty apps
  • MIN : 終了したイベント、提案、詳細なステータス、アプリのプロモート


 bing CongtentView
  • contentView : 以前と同じ 64dip 高("1U")
  • bigContentView : 最大 256dip 高("4U")


 Action
  • 3つまでボタンを配置できる
  • 異なる Activity に遷移する/バックグラウンドでなにかアクションをする
  • すでに実行されたアクションを表示するために、intent に null をセットして re-notify() する
new Notification.Builder(this) .setContentTitle("Missed call") .setContentText("vvakame") .setLargeIcon(bitmap) .setSmallIcon(R.drawable.missed_call) .setPriority(Notification.PRIORITY_HIGH) .setContentIntent(callLogIntent) .addAction(R.drawable.call, "Call Back", callMeMaybe) .addAction(R.drawable.text, "Message", sendSms) .build();

 BigTextStyle
  • 複数行の TextView
  • contentText と bigText で同じ文字列を使えるが、bigText は ticker には使われない
  • スタイルと改行は使える
new Notification.Builder(this) .setSmallIcon(...) .setLargeIcon(...) .setContentTitle(senderName) .setTicker(tickerText) .addAction(...) .setContentText(msgText) .setStyle(new Notification.BigTextStyle().bigText(msgText)) .build();

 BigPictureStyle
  • 画像を大きく表示するスタイル
  • 画像は中心部にクロップされる
  • 画像の幅は 450dip より小さく、〜2:1 のアスペクト比がよい(Bitmapの外側はクロップされるので RAM の無駄遣いになる)
new Notification.Builder(this) ... .setStyle(new Notification.BigPictureStyle().bigPicture(photoBits)) .build();

 InboxStyle
  • メッセージ、ヘッドライン、カレンダーのアジェンダ、バッチ処理の通知などリストを表示するスタイル
  • setSummaryText() を使うことでアカウント名や "+5 more" などを追加できる
new Notification.Builder()this) .setContentTitle("3 new messages") .setContentText("You have mail!") .setSubText("test.hoge@gmail.com") .setNumber(3) .setSmallIcon(R.drawable.email) .setStyle(new Notification.InboxStyle() .addLine(styledLine1) .addLine(styledLine2) .addLine(styledLine3)) .build();

 Accountability
  • Notification をロングタップすることでアプリの情報(設定アプリのアプリ詳細画面)を見られるようになった(つまり、この Notification がどのアプリから来ているかを見ることができるようになった)
  • ここからアプリをアンインストールしたり、このアプリからの Notification を無効にできる
  • つまりうるさいアプリはここからすぐアンインストールされちゃうよ、ということ





0 件のコメント:

コメントを投稿