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

查看AlarmManagerBroadcastReceiverIntentService的文档。您将需要所有这些,因为:

  • 您可能不希望您的服务一直运行,而是定期运行(例如每 2 分钟一次)。为此,您需要向 AlarmManager 注册一个广播,您的 BroadcastReceiver 将定期接收该广播。
  • 您将访问 ContentProvider,并且始终在工作线程(而不是主线程)上执行此操作以避免“应用程序无响应”错误。在接收到广播时启动 IntentService 将确保您在工作线程中执行查询(和产生的操作)(保证 IntentService.onHandleIntent() 在主线程外运行),并且因为它也是您的应用程序的真正 Android 服务保证在您处理时保持活跃。

我会这样做:

  • 创建一个侦听 BOOT_COMPLETED 和您自己定义的广播 ACTION 的 BroadcastReceiver。
  • 收到 BOOT_COMPLETED 后,向 AlarmManager 注册您的广播 ACTION。让它定期触发(AlarmManager.setRepeating())。
  • 在您的 BroadcastReceiver 中使用您自己的自定义 ACTION 接收到广播后,启动您的 IntentService (Context.startService())。
  • 在您的 IntentService 中,执行所需的查询、设置音量等。
于 2013-06-28T09:02:29.747 回答
0

解决了!我的问题可能让你感到困惑。我所做的是创建了一个 Started 服务类。从 MainActivity 类调用 startService(intent) 后覆盖 myService 类中的 onStartCommand() 并创建一个扩展 ContentObserver 的新类,然后覆盖我的 ContentObserver 类中的 onChange() 方法。

于 2013-07-19T05:34:50.450 回答