2013-06-28 44 views
1
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次嘗試未能到達用戶時,如果手機靜音,它將設置振鈴器。如何創建與內容提供商交互的服務?

+0

你有沒有試過這種方式http://developer.android.com/training/run-background-service/create-service.html? – sandrstar

+0

nope。我仍然要閱讀它。謝謝。 – Marss

回答

0

解決了!我可能已經把我的問題弄糊塗了。我做的是我創建了一個開始服務類。在調用MainActivity類的startService(intent)之後,覆蓋myService類中的onStartCommand(),並創建一個擴展ContentObserver的新類,然後在我的ContentObserver類中覆蓋onChange()方法。

0

檢查文檔AlarmManager,BroadcastReceiverIntentService。您將需要所有這些服務,因爲:

  • 您可能不希望您的服務一直運行,而是定期運行(例如每2分鐘運行一次)。爲此,您需要使用AlarmManager註冊廣播,BroadcastReceiver會定期收聽。
  • 您將訪問ContentProvider,並且您始終在工作線程(而不是主線程)上執行此操作,以避免出現「應用程序未響應」錯誤。在接收廣播時啓動IntentService將確保您在工作線程中執行查詢(以及生成的操作)(IntentService.onHandleIntent()保證以脫離主線程的方式運行),並且因爲它也是一個真正的Android Service您的應用程序保證在您處理時保持活躍狀態​​。

我會去做這樣的事情:

  • 創建監聽BOOT_COMPLETED和自己定義的廣播ACTION一個BroadcastReceiver。
  • 收到BOOT_COMPLETED後,用AlarmManager註冊您的廣播動作。讓它定期觸發(AlarmManager.setRepeating())。
  • 在您的BroadcastReceiver中接收到具有自定義ACTION的廣播後,啓動您的IntentService(Context.startService())。
  • 在你IntentService,執行所需的查詢,設置音量等
+0

我仍然是Android上的初學者。我真的不知道從哪裏開始編碼您提供的信息。我會盡力消化你發佈的每個細節。謝謝。 – Marss