2

私はよく検索し、いくつかの方法を試しましたが、エラーを回避するものは見つかりませんでした.

私は学習用のアプリに取り組んでいます.MainActivityの文字列で、サービスでそれを呼び出します. 私はこのようなことを試しました:

この次のものは myService.class に入ります

// Service を拡張する myService.class 内

public class myService extends Service{

AlarmManager manager;
PendingIntent pintent;
String te;


@Override
public void onCreate()
{
    manager = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE));
    pintent = PendingIntent.getBroadcast( this, 0, new Intent("blahblah"), 0 );}

@Override
public int onStartCommand(Intent intent, int flags, int startid)
{

    super.onStartCommand(intent, flags, startid);
            te = intent.getStringExtra("tst"); //if I change this line to te = "something", everything goes fine
    BroadcastReceiver receiver = new BroadcastReceiver() {
           @Override 
            public void onReceive( Context context, Intent intent )
           {
                Toast.makeText(getApplicationContext(),te, Toast.LENGTH_SHORT).show();
           }
    };
            this.registerReceiver(receiver, new IntentFilter("blahblah") );

            // set alarm to fire 30 min and waits 2 min
                 manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*30*60, 1000*2*60, pintent);
    return START_STICKY;}

public IBinder onBind(Intent p1)
{
    // TODO: Implement this method
    return null;
}

}

ここでコードは完全に実行されますが、アプリを終了するとクラッシュします。1 分後、アプリがクラッシュしたことがデバイスに再び表示され、アプリが「正常に」バックグラウンドに移行したことが確認されました。それの何が問題なのですか?また、サービスの代わりに IntentService を使用できることも学びました。長いタスクにはどちらが適していますか?それらの違いは何ですか?

編集***

次のエラーを受け取りました: java.lang.NullPointerExeption. だから私はこれを変更します:

te = インテント.getStringExtra("tst");

これに:

試してみてください { te = intent.getStringExtra("tst"); } catch(NullPointerException e) {}

変更すると、アプリはエラーで動作しますが、問題は次のとおりです。MainActivity から文字列を取得する必要があります。アプリを閉じると、サービスはエラーなしで実行されますが、「te」文字列は null 値を取得します。どうすればよいですかサービスに文字列を「保存」し、それを使用してアプリを閉じた後も「動作中」のメッセージを表示し続けるには?SharedPreferences を使用する必要がありますか?

私が明確だったことを願っています。

4

1 に答える 1

1

IntentServiceとは異なりServiceます。

IntentService Self は、タスクを終了するときにサービスを強制終了します。Service は、強制終了しない限り、永久に実行されます。

私のコーディング経験では、数秒間実行される小さなタスクにのみ IntentService を使用し、長時間実行されるタスクには Service を使用してStopSelf()、必要に応じて呼び出します。

ログを投稿して問題に答えてください

于 2013-07-15T08:44:01.903 に答える