如何创建与内容提供商交互的服务?

时间:2013-06-28 07:47:42

标签: android android-service android-contentprovider calllog

    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次尝试无法到达用户时,如果手机静音,它将设置铃声。

2 个答案:

答案 0 :(得分: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中,执行所需的查询,设置音量等。

答案 1 :(得分:0)

解决!我可能会把你弄糊涂我的问题。我做的是创建了一个Started服务类。在从MainActivity类调用startService(intent)之后覆盖myService类中的onStartCommand(),并创建一个扩展ContentObserver的新类,然后覆盖我的ContentObserver类中的onChange()方法。