4

私は本「Beginning Android 4 Development」に従っており、ボタンから次の機能を使用してサービスを制御しています。

public void startService(View view) {
    startService(new Intent(getBaseContext(), QOLService.class));
}

public void stopService(View view) {
    stopService(new Intent(getBaseContext(), QOLService.class));
}

QOLService.java に含まれるもの

public class QOLService extends Service {

    int counter = 0;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //Keep running service until stopped, so return sticky
        Timer timer=new Timer();
        TimerTask tt =new TimerTask() {
            @Override
            public void run() {
                Log.d("QOLService", String.valueOf(++counter));
                }
        };

        timer.scheduleAtFixedRate(tt, 0, 1000);

        Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service destroyed", Toast.LENGTH_LONG).show();
    }

意図したとおり、開始ボタンを押すと「サービスが開始されました」というトーストが表示され、logcat では 1 秒ごとに増加するメッセージが表示されます。これは、アプリケーションを閉じても、意図したとおりに続行されます。

サービスの停止ボタンをクリックすると、予想される「サービスが破棄されました」というメッセージも表示されますが、タイマーは生き続けます! アプリケーションを閉じても、引き続き続行します。サービスの停止ボタンをもう一度クリックすると、サービスが最初に正常に破棄されたかのように、サービスが破棄されたというメッセージが表示されません。

タイマーを不適切に呼び出していますか? もしそうなら、私は本が助言するようにそれを正確にやっているようです!

4

3 に答える 3

7

タイマーを不適切に呼び出していますか?

タイマーを停止することはありません。したがって、プロセスが終了するまで実行し続けます。でタイマーを停止する必要がありonDestroy()ます。

于 2012-08-24T23:59:20.647 に答える
4

CommonsWare に同意します。コードでタイマーを停止していません。この道を行くことをお勧めします、

public class QOLService extends Service {

    int counter = 0;
    Timer timer;
    TimerTask tt;

    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //Keep running service until stopped, so return sticky
        timer=new Timer();
        tt =new TimerTask() {
            @Override
            public void run() {
                Log.d("QOLService", String.valueOf(++counter));
                }
        };

        timer.scheduleAtFixedRate(tt, 0, 1000);

        Toast.makeText(this, "Service started", Toast.LENGTH_LONG).show();
        return START_STICKY;
    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service destroyed", Toast.LENGTH_LONG).show();
        tt.cancel();
        timer.cancel();
    }
}

cancel() メソッドはタイマーも停止します。

于 2012-08-25T03:03:47.530 に答える
0

START_STICKYから戻ってきたため、システムがサービスを再起動しようとしている可能性がありますonStartCommandSTART_NOT_STICKY代わりに戻ってみてください。

于 2012-08-24T23:58:46.017 に答える