3

私はこの投稿を読みました:ブロードキャストレシーバーonReceive()が複数回呼び出されます

しかし、私は必要な答えを見つけられませんでした。

BroadcastReceiverのonReceive()をオーバーライドし、特定の条件に基づいて着信呼び出しを拒否する小さなユーティリティ関数を作成しました(これは正常に機能します)。

すべての条件が満たされ、呼び出しを拒否したら、その番号をデータベースに保存します(これも簡単な作業です)。通話を拒否したら、その番号をデータベースに保存したいと思います。しかし、ログでは、着信コールがあると、onReceive関数が複数回呼び出されることがわかります。この場合、DBに複数のエントリを入れたくありません。

onReceive()が1回だけ呼び出される方法はありますか?または回避策はありますか?

助けてくれてありがとう

4

1 に答える 1

5

レシーバーは、呼び出し中、フック時、アイドル状態の3つの異なる状態で呼び出されます。

onReceiveで電話の状態を確認します。状態が鳴っている場合は、通話を切断してdbに保存することをお勧めします。

public void onReceive(final Context context, Intent intent) {
   Bundle bundle = intent.getExtras();

    if (null == bundle) {
        return;
    }

    String state = bundle.getString(TelephonyManager.EXTRA_STATE);

    if (TelephonyManager.EXTRA_STATE_RINGING.equalsIgnoreCase(state)) {
    //cut the call and store in db
    return;
    }


    } 
    if(TelephonyManager.EXTRA_STATE_IDLE.equalsIgnoreCase(state)) {
    return;
    }
     if(TelephonyManager.EXTRA_STATE_OFFHOOK.equalsIgnoreCase(state)){
     return;
     }

   }
于 2013-02-28T08:41:23.003 に答える