72

私はここで同様の問題を探しましたが、何らかの理由で、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());
    }
}
}

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

4

9 に答える 9

172

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

どうぞ:

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

adbまたはadbシェルにはたくさんの素晴らしいコマンドが付属しています。やってみなよ

よろしくFlo

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

于 2012-04-11T11:31:49.557 に答える
157

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

したがって、権限を追加したと仮定します。

<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以降、すべてのアプリケーションは、インストール時に「停止」状態になります(これは、ユーザーが設定アプリケーションからアプリを強制的に停止した後にアプリケーションが終了するのと同じ状態です)。

Androidが停止した状態

「停止」状態の間、アプリケーションは、アクティビティを手動で起動する場合を除いて、何らかの理由で実行されません。(ユーザーがアプリを手動で実行するまで、登録したイベントに関係なく、no BroadcastRecevier(などが呼び出されます。)ACTION_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/activating-applications/

于 2013-11-08T10:03:38.603 に答える
58

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

于 2014-03-30T14:15:13.310 に答える
14

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

これは、の使用法を示すサンプルプロジェクトBOOT_COMPLETEDです。

于 2011-02-19T16:21:42.517 に答える
10

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

于 2011-02-19T20:04:26.513 に答える
6

これはこの問題の最前線のスレッドのように思われるので、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ツールに関するもう1つの簡単なヒント。ログの読みやすいバージョンを取得したい場合は、次のことを試してください。

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

これにより、logcatがテキストファイルにダンプされ、コマンドプロンプトウィンドウよりも少し簡単に開いて読み取ることができます。物事のカットアンドペーストも少し簡単になります。

于 2013-10-29T15:48:23.510 に答える
1

Android Kitkat 4.4.4_r2/r1を実行している一部のデバイスに関連します。

Androidには、android.intent.action.BOOT_COMPLETEDがブロードキャストされないバグがあるようです。

参照:
パッケージマネージャーサービスを準備するブート障害

ほとんどの場合、これはあなたの問題に対する答えではありませんが(おそらくパーミッションなどのため)、キットカットを実行している場合は、これが当てはまるかどうかを確認することができます。

私はこの問題を抱えていましたが、android.intent.action.BOOT_COMPLETEDは、起動したときにブロードキャストされなかっただけです。

于 2016-01-05T13:17:51.587 に答える
0

これをマニフェストファイルに追加<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>
于 2016-04-27T12:40:46.803 に答える
0

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

これが、私のように、この問題で何時間も苦労していた人に役立つことを願っています。さらに、誰かがこの振る舞いについて説明してくれれば、私はそれについてもっと知りたいと思っています。

于 2016-11-11T15:39:42.737 に答える