2

着信 SMS をリッスンするアプリケーションを作成しています。そこで、そのために BroadcastReceiver を起動するサービスを作成しました。サービスはアプリケーションによって開始されますが、後者が破棄されると、サービスは何もリッスンしていないようです。このサービスの目的は着信 SMS をリッスンすることであるため、「永久に」実行する必要があります (または、メモリ管理のために再起動する必要があります)。

ここにいくつかのコードがあります:

public class SmsService extends Service {

    private final static String TAG = SmsService.class.getSimpleName();
    public static boolean SMS_SERVICE_STARTED = false;
    private boolean mRegistered = false;
    public final static String SMS_PORT = "port";

    private SMSReceiver mSmsReceiver = null; // this is the BroadcastReceiver listening to SMS

    public SmsService() {
        super();
        Log.d(TAG, "SmsService");
    }

    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate");
        SMS_SERVICE_STARTED = true;
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        stopListenSms();
        SMS_SERVICE_STARTED = false;
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind");
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "onStartCommand");

        if (intent != null && intent.hasExtra(SMS_PORT)) {
            Log.d(TAG, "we got extra!");
            short port = intent.getShortExtra(SMS_PORT, (short) 0);
            startListenSms(port);
        } else {
            Log.d(TAG, "no extra :(");
        }

        return START_STICKY;
    }

    private void startListenSms(short port) {
        Log.d(TAG, "startListenSms on port " + port);

        mSmsReceiver = new SMSReceiver();
        IntentFilter filter = new IntentFilter(
                "android.intent.action.DATA_SMS_RECEIVED");
        filter.addDataScheme("sms");
        String strPort = String.valueOf(port);
        filter.addDataAuthority("localhost", strPort);
        registerReceiver(mSmsReceiver, filter);
        mRegistered = true;
    }

    private void stopListenSms() {
        Log.d(TAG, "stopListenSms");
        if (mSmsReceiver != null) {
            if (mRegistered)
                unregisterReceiver(mSmsReceiver);
            mSmsReceiver = null;
        }
    }
}

そのアクティビティが破棄されると、onStartCommand が null インテントで呼び出されることがわかりました。アクティビティが破棄されると、なぜ私のサービスが停止するのか分かりますか? そして、それを「永久に」実行するにはどうすればよいですか?

前もってありがとう、乾杯。

4

2 に答える 2

5

着信 SMS をリッスンするサービスを実行する必要があるのはなぜですか。ブロードキャスト レシーバー自体が目的を果たします。レシーバーの登録中にインテント フィルターで構成すると、着信メッセージをリッスンし続けます。ブロードキャスト レシーバーと SMS リッスンの例はたくさんあります。これらの例を調べて、コードを効率的に構築してください

于 2013-01-28T21:54:14.860 に答える
0

サービスにもライフサイクルがあり、システムによって終了できます。これを防ぐことはできませんが、サービスをフォアグラウンドに置くことはできますが、システムがサービスを終了するのが難しくなります。それにもかかわらず、それはまだ可能です。サービスは永久に実行できません。サービスのライフサイクルを見てみましょう: http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle

必要なのは、SMS インテントをリッスンする BroadcastReceiver です (正確にはわかりません)。BroadcastReceiver は、特定のインテント (着信 SMS など) を登録でき、そのようなインテントがシステムによって送信されると開始されます。http://developer.android.com/reference/android/content/BroadcastReceiver.htmlを参照してください。

于 2013-01-28T21:50:34.397 に答える