-4

Broadcast Receiver を使用して SMS を受信して​​います。正常に動作しています。ここで、サービスを使用して受信トレイからSMSを読みたいと思います(これはブロードキャストレシーバーによって受信されます)。

SERVICE を使用して受信トレイから SMS を取得したい。SMS の取得は、メイン スレッドではなくバックグラウンドで実行する必要があります。アクティビティは使用しないでください。// SMS を受信し、インテントを介してサービスを開始するためのブロードキャスト レシーバ public class SMSReceiver extends 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);
    }

}

}

Service public class MyService extends 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;


    }
}

}

4

1 に答える 1

0

受信トレイのメッセージは、ブロードキャストではないため、ブロードキャスト レシーバーによって受信されません。デバイス上のネイティブ データベースを読み取る必要があります。

こちらをご覧ください

編集:まず、サービスから何かを実行しても、バックグラウンド スレッドは自動的に生成されません。サービスはメイン スレッドで実行されます。

注意: サービスは、そのホスティング プロセスのメイン スレッドで実行されます。サービスは独自のスレッドを作成せず、別のプロセスで実行されません (特に指定しない限り)。これは、サービスが CPU を集中的に使用する作業やブロック操作 (MP3 の再生やネットワークなど) を行う場合、その作業を行うためにサービス内に新しいスレッドを作成する必要があることを意味します。別のスレッドを使用することで、アプリケーションが応答しない (ANR) エラーのリスクが軽減され、アプリケーションのメイン スレッドはアクティビティとのユーザー インタラクション専用のままにすることができます。

もちろん、自分でスレッドを生成したり、IntentServiceを使用したりできます。しかし、ここを読むことから始めてください。

于 2013-04-06T06:11:29.563 に答える