2011年6月14日火曜日

【Android】 ACTION_EXTERNAL_APPLICATIONS_AVAILABLEはこねーよ!

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
photo: Original Update by Origamiancy

昨夜未明、私はSDカードへのインストールをサポートしたアプリに新規機能を追加していました。
その機能はAlarmManagerを使って色々登録するので、端末の再起動時にACTION_BOOT_COMPLETEDによってそれらをリストアしてやらんといけませんでした。
技術的には簡単だったので颯爽と実装を終えた私は意気揚々とテストに取り掛かりました。
さてリストアはうまくいったかな?

が・・・だめっ・・・!

何度端末を再起動しても、マニフェストファイルを見直してもダメ。
全く同じ設定の他アプリは受け取っているのにこの新機能を追加したアプリだけは受け取れません。

30分ほどハマってようやく気が付きました。

SDカードにインストールしてるアプリはACTION_BOOT_COMPLETEDを受け取れないんじゃね?

全くそのとおりでした。
長い夜の始まりでした。



SDカードにインストールされていた場合ACTION_BOOT_COMPLETEDは受け取れない


そうです、SDカードにアプリがインストールされていた場合ACTION_BOOT_COMPLETED(android.intent.action.BOOT_COMPLETED)は受け取れないんです。
確かに、SDカードのマウントより前に飛んでるイメージがありますね。
実際ドキュメントにも書かれています。

App Install Locationの"Applications That Should NOT Install on External Storage"に以下の記載があります。
Broadcast Receivers listening for "boot completed"
The system delivers the ACTION_BOOT_COMPLETED broadcast before the external storage is mounted to the device. If your application is installed on the external storage, it can never receive this broadcast.
訳:SDカードにインストールしてるアプリにACTION_BOOT_COMPLETEDはこねーよ! neverだよnever!

ではどーしたらええの?



ACTION_EXTERNAL_APPLICATIONS_AVAILABLEというアクションが追加されている


同ドキュメントにはまた、こんな記載もあります。
Your running Service will be killed and will not be restarted when external storage is remounted. You can, however, register for the ACTION_EXTERNAL_APPLICATIONS_AVAILABLE broadcast Intent, which will notify your application when applications installed on external storage have become available to the system again. At which time, you can restart your Service.
訳:Serviceもほんとはダメだけど、と、特別にACTION_EXTERNAL_APPLICATIONS_AVAILABLEを登録してたら再起動してあげるんだからね!

つまりACTION_EXTERNAL_APPLICATIONS_AVAILABLEを受け取るサービスを定義しておいてナニすればいいってことー!?



いやACTION_EXTERNAL_APPLICATIONS_AVAILABLEはSDカードにインストールされているアプリ側は受け取れないぽい


試す前に色々調べていると、以下のissueが。

Issue 8485: Documentation bug: ACTION_EXTERNAL_APPLICATIONS_AVAILABLE

ACTION_EXTERNAL_APPLICATIONS_AVAILABLEってSDカード内のアプリは受け取れなくねー?との事。
確かにリファレンスのACTION_EXTERNAL_APPLICATIONS_AVAILABLEの方では以下の記載が

ACTION_EXTERNAL_APPLICATIONS_AVAILABLE
Note that the packages in this list do not receive this broadcast. The specified set of packages are now available on the system.
訳:extraに乗ってくる利用可能リストに含まれるパッケージはこのbroadcastを受け取れないよー!(つまりSDカードがマウントされて有効化されるアプリ自身はこのbroadcastは受け取れない!)



ドキュメントバグじゃね


Issue 8485にこんなコメントが
This is a real bug. The apps installed on external storage will not receive ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.
訳:ACTION_EXTERNAL_APPLICATIONS_AVAILABLEはこねーよ!



明日があるさ


もしかしたらServiceで動的にACTION_EXTERNAL_APPLICATIONS_AVAILABLEを受け取るBroadcastReceiverをregisterしておくとシステムが空気読んで再起動してくれるのかもしれません。でもなんだか試すのが面倒なので諦めました。


全てを諦めた私はとうとうアプリを"internalOnly"にしました。


終わり

0 件のコメント:

コメントを投稿