2012年3月25日日曜日

ICSでBOOT_COMPLETEDが受信できない?

ウィジェットの問題に続いて、端末起動時にアプリのサービスが
自動起動しない問題が発覚した。

Android OS 2.3.4で確認した際は問題なく動作していたのだが、
4.0ではBOOT_COMPLETEDを受信していなかった。
これはおかしいと思ってアプリ情報を覗いてみると、
RECEIVE_BOOT_COMPLETEDの権限が無くなっていた。
(もちろんマニフェストファイルには記載済み)


とりあえずググってみると同様の報告が幾つかあった。

■ android.intent.action.BOOT_COMPLETED
http://nalabjp.wordpress.com/2012/02/18/android-intent-action-boot_completed/

■ Android Service stopped working
http://stackoverflow.com/questions/9570607/android-service-stopped-working

■ RECEIVE_BOOT_COMPLETED not required for BOOT_COMPLETED broadcast
http://code.google.com/p/android/issues/detail?id=14044

■ broadcastreciever not working while phone is booting in android
http://stackoverflow.com/questions/9596579/broadcastreciever-not-working-while-phone-is-booting-in-android

■ Android Boot-Up BroadCast Not invoking
http://stackoverflow.com/questions/9426189/android-boot-up-broadcast-not-invoking


しかしながらどれも解決するには至らず、再度マニフェストファイルを確認した。
そこで指定しているSDKバージョンが関連してるのではないかと思い立ち、
以下のようにターゲットSDKバージョンを追加してみた。

【変更前】
<uses-sdk android:minSdkVersion="4" />

【変更後】
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="4" />


変更後のapkをGalaxy Nexusにインストールして動作確認した所、
BOOT_COMPLETEDを受信してサービスが自動起動するようになった。
Android OS 1.6以上で動作させるため、最小SDKバージョンのみ
指定しておけば動作するだろうという思い込みで、ターゲットSDKバージョンを
指定していなかったのが原因のようだ。動作原理が不明…。

アプリ情報を見るとRECEIVE_BOOT_COMPLETEDの権限が表示されている。


ちなみに、android:targetSdkVersionに14以上(Android OS 4.0以上)を指定すると
メニューボタン(Galaxy Nexusでは右端の縦3点マーク)が表示されなくなり、
以前のバージョンとの互換が取れなくなるので注意する事。

0 件のコメント:

コメントを投稿