bugfix> android > 投稿

私はマニフェストが android.intent.action.PHONE_STATE のブロードキャストを宣言しましたおよび android.intent.action.NEW_OUTGOING_CALL 。 [最近使用したアプリ]画面からアプリを削除した後、アプリをテストしました。 2台の電話でテストしました。

  1. MOTO G4 Play(Nougat)-この電話の最近のアプリ画面からアプリを削除した後、ブロードキャストを受信して​​いました。
  2. ASUS(Lollipop)-この電話の最近のアプリ画面からアプリを削除した後、ブロードキャストを受信して​​いませんでした。

私が得たSOでそのような質問を読んだ後の1つの方法は、スティッキーサービスを開始することでそれができるので、それがすることは私のプロセスを終了せず、ブロードキャストを取得し続けることです。

サービスを使用せずにすべての電話でブロードキャストを受信するには、どうすればよいですか?

編集-1:マニフェストで次のようにブロードキャストを登録します

`
        <receiver android:name=".PhonecallReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"
                    android:enabled="true"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"
                    android:enabled="true"/>
            </intent-filter>
        </receiver>
    `
     @Override
    public void onReceive(Context context, Intent intent) {
            Log.e("onReceive ","Called"); //This is how I check whether broadcast was called or not
            //... other code
    }

回答 1 件
  • アプリの通知を生成するために使用できる通知ブロードキャストを考えてください。したがって、ブロードキャストはかなり信頼できます。

    広範宣言されたマニフェストを使用しているため、理論的には、アプリがフォアグラウンドかバックグラウンドかに関係なくブロードキャストを受信できるはずです(アプリは同じAPIをターゲットとするため、すべての電話で同様の動作が期待されていました)。しかし、モバイルデバイスがいくつかの契約を無視/バグした結果、予期される動作が中断する場合がありました。 ASUSベースのテストでも同様のことが発生した可能性が非常に高いです。 ブロードキャストマネージャーのドキュメントから、

    If you declare a broadcast receiver in your manifest, the system launches your app (if the app is not already running) when the broadcast is sent.

    ただし、例外があります。Androidには、この機能の一部を制限するために、最近この動作に関するいくつかの更新があります。

    Note: If your app targets API level 26 or higher, you cannot use the manifest to declare a receiver for implicit broadcasts (broadcasts that do not target your app specifically), except for a few implicit broadcasts that are exempted from that restriction. In most cases, you can use scheduled jobs instead.

    したがって、アプリがアクティブかどうかに関係なく、26未満のAPIレベルをターゲットにしている限り、すべてのブロードキャストを受信する必要があると思います。 API 26以降に進むと、上記の引用に従って明示的または免除されたブロードキャストである場合にのみ、ブロードキャストを受信します。

    おそらく発生するはずのないデバイス固有の問題です。これを除外するには、さらにいくつかのデバイスでテストしてみてください。

    より明確にするためにこれを読むことをお勧めします。

    追伸 Log.e("onReceive ","Called"); のような情報/デバッグのエラーログを使用しないでください  

あなたの答え