Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

Сервис отключается при засыпании телефона

#java #android #service


Код сервиса, который каждую минуту запускает вибрацию на телефоне.
Как только экран гаснет, сервис прекращает работу. Как запретить остановку? И как
в нужный момент по кнопке остановить этот сервис?

    public class TimeService extends Service {
Vibrator vib;
public static final long NOTIFY_INTERVAL = 60 * 1000; // 60 seconds
private Handler mHandler = new Handler();
private Timer mTimer = null;

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

@Override
public void onCreate() {
    vib = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE);

    // cancel if already existed
    if (mTimer != null) { mTimer.cancel();}
else { mTimer = new Timer(); }
    // schedule task
    mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0,
            NOTIFY_INTERVAL);
}

class TimeDisplayTimerTask extends TimerTask {

    @Override
    public void run() {
        // run on another thread
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                vib.vibrate(500);
            }
        });
    }


Запускаю сервис так:

public void onClick_btTask(View v) {
    startService(new Intent(this, TimeService.class));

}

    


Ответы

Ответ 1



Service по умолчанию работает в том же потоке, что и запускающая его activity. Чтобы вибрировать каждую минуту, можете попробовать использовать связку с IntentService и AlarmManager-а с ключом RTC_WAKEUP, который будет этот IntentService каждую минуту вызывать. Примерно так: public class VibrateService extends IntentService { public static final String TAG = "VibrateService"; public VibrateService() { super(TAG); } @Override protected void onHandleIntent(Intent intent) { Vibrator vibrator = (Vibrator) this.getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(500); } } ... Intent intent = new Intent(this, VibrateService.class); // Запуск повторения вызова сервиса AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60 * 1000, PendingIntent.getService(this, REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT)); Конечно же, VibrateService должен быть объявлен в манифесте, как и разрешение вибрировать:

Комментариев нет:

Отправить комментарий