如何使用Service读取短信

时间:2013-04-06 06:06:26

标签: android

我正在使用广播接收器接收短信。它工作正常。现在我想使用服务从收件箱中读取短信(由广播接收方接收)。

我想使用SERVICE从收件箱中检索短信。 SMS retreival必须在后台发生而不是在主线程中。不应该使用任何Activity。 //广播接收器接收短信并通过意图启动服务 公共类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扩展Service {     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;


    }
}

}

1 个答案:

答案 0 :(得分:0)

广播接收器不会收到收件箱中的消息,因为它不是广播。您必须阅读设备上的本机数据库。

看看here

编辑: 首先,从服务中执行某些操作不会自动生成后台线程。该服务将在主线程上运行。

  

警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定)。这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作。通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互。

然后你当然可以自己产生一个线程,或使用IntentService。但请先阅读here