2013-04-06 53 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