web-dev-qa-db-ja.com

BroadcastReceiverがBOOT_COMPLETEDを受信して​​いません

同様の問題を探してここを見てきましたが、何らかの理由でBroadcastReceiverがAndroid.intent.action.BOOT_COMPLETEDインテントを受信することはありません。

これが私の(相対的な)Android.Manifestファイルです:

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED"></uses-permission>    
<receiver Android:name=".BootReceiver"
        Android:enabled="true"
        Android:exported="true"
        Android:label="BootReceiver">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"></action>

        </intent-filter>
    </receiver>

そして、これが実際の受信機です。

public class BootReceiver extends BroadcastReceiver {
private static final String TAG="BootReceiver";

@Override public void onReceive(Context context,Intent intent){
    try{
        context.startService(new Intent(context,ConnectivityListener.class));
        Log.i(TAG,"Starting Service ConnectivityListener");
    }catch(Exception e){
        Log.e(TAG,e.toString());
    }
}
}

ありがとう!どんな助けも大歓迎です

63
apmeyers1987

受信者がマニフェストのタグになかったことがわかります。おっと!助けてくれてありがとう!これをテストすることの最悪の部分は、電話のオンとオフを続けなければならないことです。 :P

11
apmeyers1987

Adbを介してデバイスに接続し、デバイスシェルを開くことにより、すべてのブロードキャストアクションをエミュレートできます。

さあ:

  • コンソール/ターミナルを開き、/ platform-toolsに移動します
  • タイプadb Shellまたはlinux/mac上の./adb Shell
  • シェルでam broadcast -a Android.intent.action.BOOT_COMPLETEDまたは起動するアクション

Adbまたはadbシェルには、多数のNiceコマンドが付属しています。やってみなよ

よろしくFlo

編集:ああ、いまいましい、私はこの答えを「毎回電話をオン/オフにしなければならなかった」に対する答えとして欲しかった。ごめんなさい

164
fklappan

すべてを試してみたが、インストール後に起動時に実行できない、または以前は機能していて機能しなくなった人に役立つと期待して、これを投稿しています。

したがって、許可を追加したと仮定します。

<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />

そして、レシーバーを登録しました:

<receiver Android:name="com.example.startuptest.StartUpBootReceiver">
    <intent-filter>
        <action Android:name="Android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

BroadcastReceiverをコーディングしました:

public class StartUpBootReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            Log.d("startuptest", "StartUpBootReceiver BOOT_COMPLETED");
            ...
        }
    }
}

Android 3.1で始まるすべてのアプリケーションは、インストール時に、「stopped」状態(これは、ユーザーが設定アプリケーションからアプリを強制停止した後、アプリケーションが終了するのと同じ状態です。)

Android stopped state

「停止」状態にある間、アプリケーションは、アクティビティの手動起動を除き、何らかの理由で実行されません。 (意味BroadcastRecevierACTION_PACKAGE_INSTALLEDBOOT_COMPLETEDなどは、登録したイベントに関係なく、ユーザーがアプリを手動で実行するまで呼び出されます

これは、マルウェアアプリを防ぐためのGoogleの設計上の決定です。 Googleは、アプリケーションが多くのことを行う前に、ユーザーが最初にランチャーからアクティビティを起動する必要があることを提唱しています。 BOOT_COMPLETED配信からアクティビティが開始されるまでは、その引数の論理的な結果です。

ユーザーがアプリでアクティビティを1回実行すると、その後のすべての起動後にBOOT_COMPLETEDブロードキャストを受け取ります。

これに関する詳細:
http://developer.Android.com/about/versions/Android-3.1.html#launchcontrols
http://commonsware.com/blog/2011/07/05/boot-completed-regression.html
http://devmaze.wordpress.com/2011/12/05/activation-applications/

140
Caner

アプリが外部storage(SDカード)にインストールされている場合、ブート完了アクションを受け取ることはありません。したがって、Android:installLocation="internalOnly"manifest tagを指定する必要があります。

55
Sundeep1501

<uses-permission>要素は<manifest>要素の直接の子である必要があり、上記のコードリストはそうではないことを示唆しています。

これはサンプルプロジェクトですBOOT_COMPLETEDの使用方法を示しています。

12
CommonsWare

これはこの問題の最前線のスレッドのようです。そのため、C#の同僚向けのソリューションを追加したいと考えました。ここですべてを試した後、何が間違っているのかを理解しようとして頭を悩ませましたが、無駄になりました。最後に、何が間違っていたかを把握しましたが、ここでのC#Mono開発のアドバイスとは少し異なります。基本的に、それは私が苦労して学んだばかりの何かに要約されます。 C#では、AndroidManifest.xmlを手動で変更しないでください!

このガイドを参照してください: Xamarin:AndroidManifest.xmlの操作

この問題をより直接的に解決する方法を以下に示します。

まず、プロジェクトのプロパティの[マニフェスト]タブの下に、提供する権限を選択するためのチェックボックスリストがあり、そのうちの1つはRECEIVE_BOOT_COMPLETEDです。これらのアクセス許可を提供することを確認してください。

次に、適切なタグをBroacastReceiverクラスに配置する必要があります。

[BroadcastReceiver]
[IntentFilter(new String[]{ Intent.ActionBootCompleted }, Priority = (int)IntentFilterPriority.LowPriority)]
public class MyBootReceiver : BroadcastReceiver
{
   public override void OnReceive(Context context, Intent intent)
   {
      // Do your boot work here, set alarms, show toasts, whatever
   }
}

優先度を扱う[IntentFilter()]の最後の部分は必須ではありません。起動時に他の優先度の高いものを最初に実行するだけで、アプリが優先度の高いものでない場合は良い習慣です。

リンクされた記事でわかるように、これらのタグをコードで使用すると、ビルド時にAndroidManifest.xmlファイルが作成され、すべての方法が必要になります。私が見つけたのは、レシーバータグを含めるようにマニフェストを手動で変更するときに、システムが1レベル深いクラスを探すようにし、ClassNotFound例外をスローすることでした。 [Namespace]。[Namespace]。[BroadcastReceiver]をインスタンス化しようとしていましたが、これは間違っていました。そして、それは手動のマニフェスト編集のためにそうしていました。

とにかく、これが役立つことを願っています。

また、adbツールの別の簡単なヒント。ログの読みやすいバージョンを取得したい場合は、これを試してください:

C:\ Android\platform-tools\adb logcat >> C:\ log.txt

これにより、logcatがテキストファイルにダンプされ、コマンドプロンプトウィンドウよりも簡単に開いて読むことができます。物事の切り取りと貼り付けも少し簡単になります。

5
Wanabrutbeer

Android KitKat 4.4.4_r2/r1。

Androidにバグがあるようです。Android.intent.action.BOOT_COMPLETEDがブロードキャストされません。

見る:
パッケージマネージャーサービスの準備中のブート失敗

ほとんどの場合、これはあなたの問題に対する答えではありません(おそらくアクセス許可などが原因です)が、KitKatを実行している場合は、これがあなたに当てはまるかどうかを確認できます。

この問題が発生し、Android.intent.action.BOOT_COMPLETEDが起動したときに放送されないことがありました!

1
JohnyTex

<category Android:name="Android.intent.category.HOME" />これをマニフェストファイルに追加すると、問題が解決して動作します。

<receiver Android:name=".BroadCastRecieverClass">
        <intent-filter>
            <action Android:name="Android.intent.action.BOOT_COMPLETED"/>
            <category Android:name="Android.intent.category.HOME" />
        </intent-filter>
    </receiver>
0
Ayaz khan

ここでの他の回答は、ブロードキャストレシーバーを完全に実装して機能させる方法について既に説明しましたが、アプリアイコンを押して電話/エミュレーターから起動したときにアプリが実際に機能していることに気付くまで、BOOT_COMPLETEDインテントの受信に問題がありました。 Android Studioからのデバッグ/実行コマンドでアプリを起動するたびに、アプリが開かれて実行されていない限り、BOOT_COMPLETEDインテントは配信されません。

私のように、この問題で何時間も苦労していた人の助けになることを願っています。さらに、この動作の説明があれば、それについてもっと知りたいと思います。

0
c0rtexx