2

アクティビティによって開始されるサービスをアプリケーションに実装しようとしています。サービスが開始されている場合、サービスは (アクティビティによって) 手動で停止されるまでバックグラウンドで実行されます。このサービスは、すべての着信 SMS をチェックして特別な文字列を確認する必要があります。メッセージに文字列が含まれている場合、サービスは別の SMS (自動応答システム (ARS) など) を送信して応答する必要があります。最初の問題は、サービスがシステムによって停止されることです。60分。さらに、システムがシャットダウンされる前にサービスが実行されていた場合、起動後にサービスを開始する必要があります。サービスのコードは次のとおりです: (ドイツ語のコメントで申し訳ありません。翻訳する時間がありませんでした。)

package [...]
import [...]

public class SMSReaderService extends Service {

public  static String searchString;
private SMSreceiver mSMSreceiver; 
private IntentFilter mIntentFilter; 
private static Messenger outMessenger;
private final Messenger inMessenger = new Messenger(new IncomingHandler());

@Override
public void onCreate() {
    super.onCreate();

    //SMS-received-event receiver 
    mSMSreceiver = new SMSreceiver(); 
    mIntentFilter = new IntentFilter(); 
    mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
    registerReceiver(mSMSreceiver, mIntentFilter);

    // Loggen, dass das Objekt erstellt wurde
    Log.d("SMSReaderService::Created", "SMSReaderService has been Created.");
}

@Override
public IBinder onBind(Intent intent) {
    [...] 
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    searchString = (String) intent.getExtras().get("SERCHVALUE");

    // Loggen, dass der Service gestartet wurde
    Log.d("SMSReaderService::Started", "SMSReaderService has Started.");

    return ???;

}

@Override
public void onDestroy() {
    // Unregister the SMS receiver
    unregisterReceiver(mSMSreceiver);

    // Loggen, dass das Objekt zerstört wurde
    Log.d("SMSReaderService::Object::Destroyed", "SMSReaderService has been destroyed.");

    super.onDestroy();
} 

private class SMSreceiver extends BroadcastReceiver {
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
        Bundle extras = intent.getExtras(); 
        if ( extras != null ) 
        { 
            [...]
        } 
    } 
}
}

編集: サービスが返されるようになりSTART_STICKYました。これはうまくいくと思いました。(実際にはそうしますが、エラーが発生します)。1 時間後、logcat には次の情報が表示されます。

08-03 16:31:29.345: E/AndroidRuntime(9885): java.lang.RuntimeException: Unable to start service de.[...].SMSReaderService@41912c88 with null: java.lang.NullPointerException
08-03 16:31:29.345: E/AndroidRuntime(9885):     at de.[...].SMSReaderService.onStartCommand(SMSReaderService.java:161)

08-03 16:32:20.940: E/AndroidRuntime(9933): java.lang.RuntimeException: Unable to start service de.[...].SMSReaderService@41913a30 with null: java.lang.NullPointerException
08-03 16:32:20.940: E/AndroidRuntime(9933):     at de.[...].SMSReaderService.onStartCommand(SMSReaderService.java:161)

「Anwendungsmanager」(英語でどう呼ばれているかわかりません...「アプリケーションマネージャー」のようなものかもしれません)で、サービスが実行されているのを確認できます... 1秒間。その後、すぐに停止し、再起動を試みます。2回試行すると実行されます。これは、logcat がエラーを記録している間でした。

161 行目: searchString = (String)intent.getExtras().get(GET_SEARCHSTRING_AFTER_START);

4

1 に答える 1

3

Service.START_STICKYドキュメントは、メソッドから戻りたいことを示唆していますonStartCommand()。これにより、以前にランタイムによって強制終了された場合、リソースが利用可能になったときにサービスが再開されます。

ブート時にサービスを開始する場合、ランタイムによって送信されるシステム ブート インテントBroadcastReceiverをリッスンする を作成できます。がを受信したら、 を起動できます。デバイスがシャットダウンされた後にのみ起動する必要がある場合は、同様のことを行ってシャットダウン インテントをリッスンし、 (実行中かどうかにかかわらず)の状態を保持できます。IntentBroadcastReceiverServiceServiceService

追加の注意として、BootCompleted パーミッションを有効にする必要があります。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
于 2012-08-03T13:09:58.347 に答える