Страницы

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

вторник, 27 ноября 2018 г.

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

Код сервиса, который каждую минуту запускает вибрацию на телефоне. Как только экран гаснет, сервис прекращает работу. Как запретить остановку? И как в нужный момент по кнопке остановить этот сервис?
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));
}


Ответ

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 должен быть объявлен в манифесте, как и разрешение вибрировать:

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

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