読者です 読者をやめる 読者になる 読者になる

【Android】Android 3.0〜4.0ぐらいに追加されたAPIまとめ(3.x編)

結局自分でSupport Libraryを使ったりなんだりでもうちょっと詳しくなったので、色々追記しました。

[2014/07/02追記ここまで]

前書き

前に使ってた端末がFroyoだったこと、Androidアプリの開発を始めた頃はGingerbread全盛期だったこともあり、AndroidAPIに関する知識がそこで止まってしまっているんだけど、「何で今までなかったの?」みたいなAPIがかなり追加されているようなので、使いそうな奴を一旦まとめてみようかなと。

Fragments

3.0以降のウリ。の割には意外と資料が少ない。

いくつかのViewGroupをひとまとめにし、Activityのコンポーネントとして再利用可能。

UIを持つ必要がなく、Activityのバックグラウンドで動くスレッドとして使用することも出来るらしい。

[追記]

DialogFragmentListFragmentなどもある。

Activityの一部分を外出しできるようになったぐらいに考えておけばいい。

[追記ここまで]

Action Bar

面倒くさそう。

アプリ上部にあったタイトルバーの代わりに提供され、OptionMenuを定義することが出来る。

ぶっちゃけ今までので十分な気がする。デフォルトが上部ってのが気に入らない。

[追記]

あまりに気に食わなかったので無理矢理下に持っていったら、案外便利だった。面倒臭いのは間違いないが。

Windowsで言うツールバーみたいなポジション。

[追記ここまで]

Content loaders

今まであったAsyncTaskを使うとどうしてもActivityと一対一の関係になりやすく、再利用もクソもなく、結局コードが分散してしまって非常に読みにくかったり、インナークラスで実装するとアホみたいにコードが長くなったりでそれはそれはうんこでした。うんこすぎて使ってません。全部RunnableとHandleで組み合わせたほうが使いやすいんだもん。

それでも1つのActivity内で2つ以上非同期処理を実装しようとすると、それはもう冗長なんてレベルではないコードが生まれ、保守もへったくれもないことが非常に多かったり、DBからn件ずつとってきてListViewの最下部まで行ったらまたn件取得する、みたいな処理をやろうとすると結構アクロバティックなことをしないといけなかったので、その辺が改善されてるといいなぁ。

多用しそうなので使い方もメモしておく。

1.アクティビティのonCreate()メソッド内、またはフラグメントのonActivityCreated()メソッド内で Loader を初期化する

getLoaderManager().initLoader(0, null, this);

initLoaderのリファレンスはこんな感じ。非同期処理を二つ以上使う場合はidを振り分ければいけそうです。

LoaderManager自体は1 Activityに1つとのことなので、各Activityでidを振り分ける必要はないっぽい。

2.LoaderManagerのコールバックを実装する

公式ドキュメントの翻訳より引用。

LoaderManager.LoaderCallbacks には以下のメソッドが含まれています。

  • onCreateLoader()? 与えられた ID に対する新しい Loader をインスタンス化して返す。
  • onLoadFinished() ? 前に作成されたローダがそのロードを完了したときに呼び出される。
  • onLoaderReset()? 前に作成されたローダがリセットされ、それによりそのデータを利用できなくなったときに呼び出される。

initLoaderを呼び出すとonCreateLoderメソッドが呼び出され、そのとき初めてLoaderのインスタンスが作成されるみたいですね。initLoaderで渡したBundleがonCreateLoderで使える

ようなので、TextViewの値なんかを渡したい時に使うんでしょうかね。

onLoadFinishedの第二引数にDが返ってきてるので、こいつを使ってUIの各所に変更を加えればいいんでしょう。多分。

onLoaderResetは各リソースの解放ですかね。ただ、どうもLoader自体もライフサイクルを持っているみたいなので、明示的に(例えばActivityのonDestoryとかで)呼ぶ必要があるのかどうかいまいちよくわからない。

思っていた以上に簡単に使えそうです。ドキュメントを読んでいると「内部DBからデータを取ってくるときはせっかく作ったからCursorAdapterを使ってね!」と言う何かをひしひしと感じるんですが、肝心のCursorAdapterのリファレンスに「The Cursor must include a column named “_id” or this class will not work. 」ってさらっと書いてあるあたり悪意も感じますね。

とは言え、いつものようにAdapter拡張祭りを行えばそこそこ使えそうなのでこのあたりを参考に作ってみるのもいいかもしれません。ListView用のArrayAdapterを拡張して作るよりは、まぁ、使えるかな?って感じですが。

[追記]

思ったより使わなかったって言うか使いにくかったんですが、今までAsyncTaskで無理矢理やっていた再帰処理があるならこっちに変えてしまったほうが使いやすいと思います。

なんと言うか、全然洗練されきってないままリリースされたAPIな気がします。特に呼び出し方が。

[追記ここまで]

Multiple-choice selection for ListView

元々ListViewは複数選択できますが、それに加えてAction Barに「今複数選択してますよ!」と言うイベントを通知出来るみたいです。

ここの説明がわかりやすい。

AdapterViewFlipper

おせーよ。

こんな感じに使うみたいですが、代替案として何らかのライブラリを使っている場合は無理に実装しなくてもよさそう。

おせーよ or もうライブラリがありそうシリーズ

CalendarViewNumberPickerSearchViewなど。

後、PopupMenuListPopupWindowなど、入力補完などに使えそうなものも実装されたらしい。

JSON utilities

なんと言うことでしょう。JSON読み書きが標準APIに組み込まれました。でも結局org.jsonのラッパークラスみたいです。

JavaJSONに関するライブラリはもっとクールなプロダクトがいっぱいあるので、特に使う理由はないと思いますが、JSONObjectがどうのこうのJSONArrayがどうのこうのでお悩みの方はありがたく使わせて頂きましょう。

3.1で追加された諸要素

元々タブレット向けのAPIと言うこともあって、外部デバイスとの連携を強化するのがメインだったらしく、あんまり面白そうな要素(と言うか、どんなアプリでも汎用的に使えそうな要素)はなかったです。

ただ、LruCacheクラスは覚えておいた方が良さそうです。

私がAndroidアプリを作ってた頃はBitmapのキャッシュは大体全部SoftReferenceWeakReferenceにぶち込んでおくのが定石だったんですが、いつの間にかメモリリークの原因になっていたりGCの仕様が変わったので大した効果がなくなってたりと散々です。

Android 3.1(API Level 12)という微妙なタイミングで実装されてしまいましたが、一応Support PackageでLruCacheを使うことも出来るみたいなので、暇があったら実装しておきたいですね。あるのかねそんな暇…?

3.2で追加された諸要素

端末の解像度に絡んでくる、より細かなレイアウトの指定が出来るようになりました。

Flagmentsも微妙に強化されたみたいなんですが、そもそも何が出来るのかよくわかってないし、どうせ4.xでも強化されてるだろうからあんまり気にしてません。

まとめ

大体全部yanzm女史のまとめた記事に載ってます。

参考