0
    String strOrder = android.provider.CallLog.Calls.DATE + " DESC";

    Cursor mCallCursor = getContentResolver().query(
            CallLog.Calls.CONTENT_URI, null, CallLog.Calls.TYPE + "=?",
            new String[] { String.valueOf(CallLog.Calls.MISSED_TYPE) },
            strOrder);

    // get start of cursor
    if (mCallCursor.moveToFirst()) {

        // loop through cursor
        do {

            mCall = mCallCursor.getString(mCallCursor
                    .getColumnIndex(CallLog.Calls.NUMBER));

            Toast.makeText(getBaseContext(), mCall + " ",
                    Toast.LENGTH_SHORT).show();

        } while (mCallCursor.moveToNext());

    }

サービスを使用してアプリをバックグラウンドで実行する必要がありますが、その方法がわかりません。コール ログ コンテンツ プロバイダ、特に不在着信にアクセスするためのクラスを作成しました。これにより、特定の番号が 3 回連続してユーザーに到達できなかった場合、電話が無音の場合に呼び出し音がオンに設定されます。

4

2 に答える 2

0

AlarmManagerBroadcastReceiver、およびIntentServiceのドキュメントを確認してください。次の理由により、それらすべてが必要になります。

  • Service を常に実行するのではなく、定期的に (たとえば 2 分に 1 回) 実行することをお勧めします。このためには、BroadcastReceiver が定期的にピックアップする AlarmManager にブロードキャストを登録する必要があります。
  • ContentProvider にアクセスし、「アプリケーションが応答していません」エラーを回避するために、常に (メイン スレッドではなく) ワーカー スレッドでアクセスします。ブロードキャストの受信時に IntentService を開始すると、ワーカー スレッドでクエリ (および結果のアクション) を実行することが保証されます (IntentService.onHandleIntent() はメイン スレッド外で実行されることが保証されています)。これは真の Android サービスでもあるため、アプリあなたが処理している間、生き続けることが保証されています。

私は次のようにそれについて行きます:

  • BOOT_COMPLETED と独自に定義したブロードキャスト ACTION をリッスンする BroadcastReceiver を作成します。
  • BOOT_COMPLETED を受信したら、ブロードキャスト ACTION を AlarmManager に登録します。定期的に発火させます (AlarmManager.setRepeating())。
  • BroadcastReceiver で独自のカスタム ACTION を使用してブロードキャストを受信したら、IntentService (Context.startService()) を開始します。
  • IntentService で、必要なクエリを実行し、ボリュームを設定します。
于 2013-06-28T09:02:29.747 に答える