Android におけるデータの管理について簡単にまとめてみました。

Intent
他のコンポーネント(アクティビティ、サービス、ブロードキャストレシーバ)とのデータの受け渡しを行う際に使います。
設定した任意のデータに加え、コンポーネントや Android システムに関与する情報を持っています。
Bundle
画面の状態を一時的に保存するために使われます。
画面を回転してアクティビティを再生成したとき、他のアプリからリソース要求 (メモリ不足) されてプロセスがキルされたときに元の状態に復帰させるために使います。
onSaveInstanceState() で画面の状態を保存し、onRestoreInstanceState() または onCreate() で復帰します。
永続データ (Preference / SQLite / File)
アプリケーションが終了してもデータを保持していたい場合に使います。
これらは他のアプリと共有して扱うことができます。
static 変数
Android では static 変数をキャッシュ以外の目的で使ってはいけません。 (static final は除く)
Android ではアプリの終了≠プロセスの終了ではないため、static 変数がすぐに解放されるわけではありません。
そのためアプリを再開したときに static 変数が終了時のまま再開することになります。
(不要なプロセスはシステムが頻繁に終了させているため、再開時に必ず残っているというわけではなりません)
また、他のアプリがリソースを要求(メモリ不足)することによりプロセスがキルされた場合も同様です。
プロセスがキルされてもアクティビティはスタックに詰まれたままとなっているため、static 変数により状態を管理していると想定されない処理が行われる可能性があります。
例外発生時のアプリ終了も同様です⇒『Androidの例外処理』
■ 参考サイト
ソフトウェア技術ドキュメントを勝手に翻訳 - 4. インテントとインテントフィルタ
ソフトウェア技術ドキュメントを勝手に翻訳 - 8. データ保存
Experiments Never Fail - Android の Static 変数はヤバい
猫好きモバイルアプリケーション開発者記録 - Androidでstatic変数が勝手にクリアされる問題と対処法

Intent
他のコンポーネント(アクティビティ、サービス、ブロードキャストレシーバ)とのデータの受け渡しを行う際に使います。
設定した任意のデータに加え、コンポーネントや Android システムに関与する情報を持っています。
Bundle
画面の状態を一時的に保存するために使われます。
画面を回転してアクティビティを再生成したとき、他のアプリからリソース要求 (メモリ不足) されてプロセスがキルされたときに元の状態に復帰させるために使います。
onSaveInstanceState() で画面の状態を保存し、onRestoreInstanceState() または onCreate() で復帰します。
永続データ (Preference / SQLite / File)
アプリケーションが終了してもデータを保持していたい場合に使います。
これらは他のアプリと共有して扱うことができます。
static 変数
Android では static 変数をキャッシュ以外の目的で使ってはいけません。 (static final は除く)
Android ではアプリの終了≠プロセスの終了ではないため、static 変数がすぐに解放されるわけではありません。
そのためアプリを再開したときに static 変数が終了時のまま再開することになります。
(不要なプロセスはシステムが頻繁に終了させているため、再開時に必ず残っているというわけではなりません)
また、他のアプリがリソースを要求(メモリ不足)することによりプロセスがキルされた場合も同様です。
プロセスがキルされてもアクティビティはスタックに詰まれたままとなっているため、static 変数により状態を管理していると想定されない処理が行われる可能性があります。
例外発生時のアプリ終了も同様です⇒『Androidの例外処理』
■ 参考サイト
ソフトウェア技術ドキュメントを勝手に翻訳 - 4. インテントとインテントフィルタ
ソフトウェア技術ドキュメントを勝手に翻訳 - 8. データ保存
Experiments Never Fail - Android の Static 変数はヤバい
猫好きモバイルアプリケーション開発者記録 - Androidでstatic変数が勝手にクリアされる問題と対処法
スポンサーサイト
- Date: Sun 04 08 2013
- Category: Android
- Response: Comment 0 Trackback 0
Android 2.1 ~ 向け ActionBar : ActionBarActivity (Android Support Library r18)
Android 3.0 (API 11) から追加された ActionBar。
Android Design でも重要視されているユーザインターフェースで、従来のタイトルバーの代わりにアプリのアイコン、タイトル名、オプションメニューを配置できるウィジェットです。
従来のタイトル

ActionBar

ActionBar は Android 3.0 から追加されたため、それ以前の Andoroid 2.x では使うことができません。
そこで API Level 間の違いを解消するための Support Library を使います。
※ 2013/07/24 に公開された Android Support Library r18 より ActionBar に対応しました。
未対応時に ActionBarSherlock を使って ActionBar に対応していた方も簡単に移行することができます。
なお、ActionBar に対応した Support Library は android-support-v7 なので Android 2.1 (API 7) からしか使うことができません。
以下は、Eclipse (日本語パッチ) 環境にて行っています。
(Windows7 なのに C 直下に android フォルダあるのは気にしないでください…)
本家 (Android Developers | Support Library Setup)
http://developer.android.com/tools/support-library/setup.html
■ Android Support Library の取得/更新
[ウィンドウ] - [Android SDK マネージャー] を起動し、
[Extras] > [Android Support Library] にチェックを入れてインストールをします。

インストールが完了すると以下のフォルダが生成されます。
[ANDROID_SDK_HOME]\extras\android\support\v7
■ ライブラリプロジェクトのインポート
ActionBar はリソースファイルを扱うため jar ではなく、ライブラリプロジェクトになっています。
取得した [ANDROID_SDK_HOME]\extras\android\support\v7\appcompat をインポートします。
[ファイル] - [新規] - [プロジェクト] から [Android] > [既存コードからの Andorid プロジェクト]
インポートする際には 『プロジェクトをワークスペースにコピー』にチェックを入れてください。
インポートが完了すると android-support-v7-appcompat プロジェクトが作成されます。

■ ライブラリプロジェクトの参照
Android プロジェクトを作成しますが作成するプロジェクトは以下のバージョンを指定してください。
・Minumum Required SDK > API 7 : Android 2.1 (Eclair) 以上
・Target SDK > API 14 : Android 4.0 (IceCreamSandwich) 以上
プロジェクトが作成し終わったら、android-support-v7-appcompat を参照します。
作成したプロジェクトを右クリックし [プロパティー] を選択。
ライブラリーに android-support-v7-appcompat を追加します。

次に、作成したプロジェクトの libs フォルダに android-support-v7-appcompat プロジェクトの libs フォルダ内の jar ファイルをコピーします。
(ライブラリプロジェクト内にあればいいはずなのに参照元にも無いとエラーになりました…)

Found 2 versions of android-support-v4.jar in the dependency list, but not all the versions are identical (check is based on SHA-1 only at this time)
とエラーが出た場合、作成したプロジェクトと android-support-v7-appcompat の android-support-v4.jar ファイルのバージョンが異なっています。android-support-v4.jar をコピーするか、最新にしてクリーンしてください。
これでライブラリプロジェクトの参照が完了しました。
■ 実装
ライブラリプロジェクトを参照したことで後は実装するだけですが、ActionBar を使うには以下のルールを守る必要があります。
・ActionBarActivity を継承する
・AppCompat のテーマを設定する
ActionBarActivity を継承しているのにテーマが設定されない場合、コンパイルは通りますが実行時に以下のエラーが発生します。
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
テーマは AndroidManifest.xml にある application で使用している theme を変更します。
ContextThemeWrapper#setTheme(int resid) で動的に設定してもエラーになります。
設定できるテーマは以下のとおり。
・Theme.AppCompat
・Theme.AppCompat.Light
・Theme.AppCompat.Light.DarkActionBar
/res/values/styles.xml
以上の設定が完了すれば準備完了です。
最初に表示した(↑にある) ActionBar は以下のソースコードによって形成されています。
なお、ActionBarActivity は FragmentActivity を継承しているので Fragment を使うこともできます。
■ ActionBarSherlock からの移行
ActionBarSherlock から移行する場合 Menu/MenuItem を Andriod 標準のものに戻します。
MenuItem#setShowAsAction(int actionEnum) 等は ActionBar と同じ Android 3.0 (API 11) から追加されているため MenuItemCompat のメソッドを使います。
ActionBarSherlock
android-support-v7
ActionBarSherlock の記事を書いた2日後に実装されるとかタイミングが悪かった…
■ 参考サイト
Android Developers - Support Library Setup
ソフトウェア技術ドキュメントを勝手に翻訳 - 6.3 アクションバーの使用
クラスメソッド開発者ブログ - [Android Tips] Support Library に追加された ActionBarActivity を使ってみた
EGG 開発ブログ - Support v7 の Action Barを使ったナビゲーションドロワー実装 (準備編)
EGG 開発ブログ - Support v7 の Action Barを使ったナビゲーションドロワー実装 (実装編)
Qiita|nagakenjs - ActionBarActivity移行メモ
Android Design でも重要視されているユーザインターフェースで、従来のタイトルバーの代わりにアプリのアイコン、タイトル名、オプションメニューを配置できるウィジェットです。
従来のタイトル

ActionBar

ActionBar は Android 3.0 から追加されたため、それ以前の Andoroid 2.x では使うことができません。
そこで API Level 間の違いを解消するための Support Library を使います。
※ 2013/07/24 に公開された Android Support Library r18 より ActionBar に対応しました。
未対応時に ActionBarSherlock を使って ActionBar に対応していた方も簡単に移行することができます。
なお、ActionBar に対応した Support Library は android-support-v7 なので Android 2.1 (API 7) からしか使うことができません。
以下は、Eclipse (日本語パッチ) 環境にて行っています。
(Windows7 なのに C 直下に android フォルダあるのは気にしないでください…)
本家 (Android Developers | Support Library Setup)
http://developer.android.com/tools/support-library/setup.html
■ Android Support Library の取得/更新
[ウィンドウ] - [Android SDK マネージャー] を起動し、
[Extras] > [Android Support Library] にチェックを入れてインストールをします。

インストールが完了すると以下のフォルダが生成されます。
[ANDROID_SDK_HOME]\extras\android\support\v7
■ ライブラリプロジェクトのインポート
ActionBar はリソースファイルを扱うため jar ではなく、ライブラリプロジェクトになっています。
取得した [ANDROID_SDK_HOME]\extras\android\support\v7\appcompat をインポートします。
[ファイル] - [新規] - [プロジェクト] から [Android] > [既存コードからの Andorid プロジェクト]
インポートする際には 『プロジェクトをワークスペースにコピー』にチェックを入れてください。
インポートが完了すると android-support-v7-appcompat プロジェクトが作成されます。

■ ライブラリプロジェクトの参照
Android プロジェクトを作成しますが作成するプロジェクトは以下のバージョンを指定してください。
・Minumum Required SDK > API 7 : Android 2.1 (Eclair) 以上
・Target SDK > API 14 : Android 4.0 (IceCreamSandwich) 以上
プロジェクトが作成し終わったら、android-support-v7-appcompat を参照します。
作成したプロジェクトを右クリックし [プロパティー] を選択。
ライブラリーに android-support-v7-appcompat を追加します。

次に、作成したプロジェクトの libs フォルダに android-support-v7-appcompat プロジェクトの libs フォルダ内の jar ファイルをコピーします。
(ライブラリプロジェクト内にあればいいはずなのに参照元にも無いとエラーになりました…)

Found 2 versions of android-support-v4.jar in the dependency list, but not all the versions are identical (check is based on SHA-1 only at this time)
とエラーが出た場合、作成したプロジェクトと android-support-v7-appcompat の android-support-v4.jar ファイルのバージョンが異なっています。android-support-v4.jar をコピーするか、最新にしてクリーンしてください。
これでライブラリプロジェクトの参照が完了しました。
■ 実装
ライブラリプロジェクトを参照したことで後は実装するだけですが、ActionBar を使うには以下のルールを守る必要があります。
・ActionBarActivity を継承する
・AppCompat のテーマを設定する
ActionBarActivity を継承しているのにテーマが設定されない場合、コンパイルは通りますが実行時に以下のエラーが発生します。
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.
テーマは AndroidManifest.xml にある application で使用している theme を変更します。
ContextThemeWrapper#setTheme(int resid) で動的に設定してもエラーになります。
設定できるテーマは以下のとおり。
・Theme.AppCompat
・Theme.AppCompat.Light
・Theme.AppCompat.Light.DarkActionBar
/res/values/styles.xml
<!-- <style name="AppBaseTheme" parent="android:Theme.Light"> -->
<style name="AppBaseTheme" parent="Theme.AppCompat">
以上の設定が完了すれば準備完了です。
最初に表示した(↑にある) ActionBar は以下のソースコードによって形成されています。
package jp.inujirushi.android.sample;テーマを xml 側で定義する必要がありますが、それ以外では ActionBarActivity を継承するだけで特別な設定は必要ありません。
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
public class TestActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// レイアウトを設定する
setContentView(R.layout.activity_layout);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add("HELP").setIcon(
android.R.drawable.ic_menu_help);
MenuItemCompat.setShowAsAction(item,
MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return true;
}
}
なお、ActionBarActivity は FragmentActivity を継承しているので Fragment を使うこともできます。
■ ActionBarSherlock からの移行
ActionBarSherlock から移行する場合 Menu/MenuItem を Andriod 標準のものに戻します。
MenuItem#setShowAsAction(int actionEnum) 等は ActionBar と同じ Android 3.0 (API 11) から追加されているため MenuItemCompat のメソッドを使います。
ActionBarSherlock
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("HELP").setIcon(android.R.drawable.ic_menu_help)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
return true;
}
android-support-v7
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuItem item = menu.add("HELP").setIcon(android.R.drawable.ic_menu_help);
MenuItemCompat.setShowAsAction(item, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
return true;
}
ActionBarSherlock の記事を書いた2日後に実装されるとかタイミングが悪かった…
■ 参考サイト
Android Developers - Support Library Setup
ソフトウェア技術ドキュメントを勝手に翻訳 - 6.3 アクションバーの使用
クラスメソッド開発者ブログ - [Android Tips] Support Library に追加された ActionBarActivity を使ってみた
EGG 開発ブログ - Support v7 の Action Barを使ったナビゲーションドロワー実装 (準備編)
EGG 開発ブログ - Support v7 の Action Barを使ったナビゲーションドロワー実装 (実装編)
Qiita|nagakenjs - ActionBarActivity移行メモ