2013-04-06 79 views
-4

我正在使用Broadcast Receiver接收短信。它工作正常。現在我想使用服務從收件箱中讀取短信(由廣播接收器接收)。如何使用服務讀取短信

我想使用SERVICE從收件箱中檢索短信。 SMS retreival必須在後臺進行,而不是在主線程中。不應使用任何活動。 //廣播接收機接收SMS和經由意圖啓動服務 公共類SMSReceiver延伸的BroadcastReceiver {

@Override 
public void onReceive(Context context, Intent intent) { 
    Bundle bundle = intent.getExtras(); 
    SmsMessage[] message = null; 
    String str = ""; 
    if(bundle != null){ 
     Object[] pdus = (Object[])bundle.get("pdus"); 
     message = new SmsMessage[pdus.length]; 
     for(int i = 0; i<message.length; i++){ 
      message[i] = SmsMessage.createFromPdu((byte[])pdus[i]); 
      str += "New SMS from cloudy contacts " + message[i].getOriginatingAddress(); 
     } 

     Toast.makeText(context, str, Toast.LENGTH_LONG).show(); 

     Intent intent1 = new Intent(context,MyService.class); 
     context.startService(intent1); 
    } 

} 

}

役 公共類爲MyService延伸服務{ ReadSMS readSMS;

@Override 
public IBinder onBind(Intent arg0) { 



    return null; 
} 

public void onCreate(Bundle savedInstanceState){ 
    Log.d("Service","inside onCreate of service"); 


} 

public void onDestroy(){ 
    Log.d("Service", "destroyed"); 

} 

public void onStart(){ 
    Log.d("Service","starting service to read sms from inbox"); 
    Toast.makeText(this,"Reading sms from inbox",Toast.LENGTH_LONG).show(); 
    readSMS = new ReadSMS(); 
    ArrayList list = readSMS.readSms("inbox"); 

} 

public class ReadSMS{ 



    public ArrayList readSms(String inbox){ 
     ArrayList sms = new ArrayList(); 
     Uri uri = Uri.parse("content://sms/inbox"); 
     Cursor cursor = getContentResolver().query(uri, new String[]{"_id","address","date","body"},null,null,null); 
     cursor.moveToLast(); 
     String address = cursor.getString(1); 
     String body = cursor.getString(3); 
     sms.add(address+" "+body); 
     return sms; 


    } 
} 

}

+0

請問您可以加些代碼 – 2013-04-06 06:38:37

回答

0

收件箱中的郵件不會被廣播接收器,因爲它不是一個廣播接收。您必須閱讀設備上的本地數據庫。

看看here

編輯:所有的 首先,從服務做的事情並不會自動產生一個後臺線程。該服務將在主線程上運行。

注意:服務在其宿主進程的主線程中運行 - 服務不會創建自己的線程,也不會在單獨的進程中運行(除非另有指定)。這意味着,如果您的服務將執行任何CPU密集型工作或阻止操作(例如MP3播放或網絡連接),則應該在服務中創建一個新線程來完成這項工作。通過使用單獨的線程,您將降低應用程序無響應(ANR)錯誤的風險,並且應用程序的主線程可以保持專用於用戶與您的活動進行交互。

然後,你當然可以自己產生一個線程,或使用IntentService。但從閱讀here開始。

+0

看看鏈接。 – jelgh 2013-04-06 06:33:52

+0

是的,你是正確的服務運行在主線程,我必須在服務內創建新的線程做任何工作。但請你能告訴我如何實現一個服務線程從收件箱讀取/獲取短信 – 2013-04-06 07:52:59