Android:Broadcastを受信できないアプリのSTOP状態Yukiの枝折2012/03/09Android:Broadcastを受信できないアプリのSTOP状態Android3.1以降、アプリケーションに新たなステータス"STOP"が追加されました。アプリインストール後、一度も起動されていないアプリはSTOP状態となります。システムアプリを除いて、STOP状態のアプリはBroadcastIntentを受け取れない場合があります。概要はhttp://developer.android.com/sdk/android-3.1.htmlで紹介されています。今回は、アプリのSTOP状態について調査します。調査は下記のコードで実施しています。BOOT_BOMPLETEを受け取るだけのレシーバをAndroidManifestで静的に登録しているアプリです。onReceive")から判断します。手順は上から順番に実施。--exclude-stopped-package結果:反応あり/FLAG_INCLUDE_STOPPED_PACKAGES指定で受信さえすればSTOP状態は解除されるまとめ:一度でもアプリを起動すれば、再起動後でも受信可能アプリの更新でSTOP状態にはならないアプリの再インストールはSTOP状態になるFLAG_INCLUDE_STOPPED_PACKAGESで一度でも受信すればSTOP状態は解除されるAndroid4.x以降でもこれは有効です。「ブロードキャストを受信できない」といった不具合が出た場合、STOP状態となっていないか確認したほうがよいでしょう。本動作・仕様についてシステム側のソースコードを解析してみます。ブロードキャストインテント送信開始からのコードを追いました。IntentResolverでIntentを処理するコンポーネントを探索。}excludingStoppedはIntentフラグのFLAG_EXCLUDE_STOPPED_PACKAGESがONである場合True。isFilterStoppedは対象がSTOP状態である場合True。targe(アプリ)がSTOP状態と判断してIntent処理しない。対象のSTOP状態を調べるメソッドを追ってみます。false;}コメントを見るとシステムアプリはSTOP状態でもIntentの受信は可能のようです。ps.stoppedの設定元を追っていくとcom.android.server.pm.Settings.readStoppedLPw()の下記にたどり着きます。}なにやらXMLをパースして、pkgタグのname属性に記載されているパッケージのnl属性値が1であればパッケージSTOP状態としています。パースしているXMLは/data/system/packages-stopped.xmlのようです。yuki.broadcastアプリを一度も起動していないと下記のようなXMLの内容になります。true;となるルートは通らなくなります。これらのことから、下記手順を試してみます。android.intent.action.BOOT_COMPLETED結果:反応あり/STOP状態はpackages-stopped.xmlで管理されている以上です。ホーム人気の投稿Android:引数はthisか?getApplicationContextか?ActivityとApplicationの違いAndroidにはContextを引数にとるAPIが数多く存在しています。