2016-02-23 3 views
2

Я пытаюсь запустить таймер процесса, чтобы он работал в фоновом режиме на андроиде (начинается с нажатия кнопки).Фоновый процесс таймера на android

Таймер должен находиться на 30 секунд и должен продолжать расти в фоновом режиме (с кнопкой дома и выключением питания/экрана).

Как это сделать? Я попытался с обслуживанием и обработчиком, но не работает ...

EDIT

Моя служба отслеживания (процесс с 30 сек)

public class TrackingService extends IntentService { 

    private Handler mHandler; 
    private Runnable mRunnable; 

    public TrackingService() { 

     super("TrackingService"); 

    } 

    public TrackingService(String name) { 

     super(name); 

    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     long timer = 30000; 

     mHandler = new Handler(); 
     mRunnable = new Runnable() { 

      @Override 
      public void run() { 

        //TODO - process with update timer for new 30 sec 

        mHandler.postDelayed(this, timer); 

      } 
     }; 

     mHandler.postDelayed(mRunnable, timer); 

    } 

} 

Мой щелчок кнопки:

mButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     //TODO - start first time and it continued every 30 seconds and continue in the background 
     startService(Intent intent = new Intent(this, TrackingService.class)); 

    } 
}); 
+0

Добро пожаловать в StackOverflow! Если вы ищете ответ на свой вопрос, вам следует сначала дать нам свой подход, чтобы мы могли помочь вам понять, что вы делаете неправильно/что делать. – YounesM

+0

Вы не можете запускать что-либо на выключенном устройстве. Кроме этого, проверьте «AlarmManager» и/или «JobScheduler» – F43nd1r

+0

Что-то, что нужно помнить о том, чтобы что-то запускать в фоновом режиме, ОС Android оставляет за собой право убить фоновый процесс в любое время, если сочтет это необходимым. Если это критический таймер, который нужно назвать, вы можете пересмотреть свой подход. –

ответ

7

Хорошо, в первую очередь, я действительно не знаю, правильно ли получил ваш вопрос. Но я думаю, что вам нужен таймер, который выполняется каждые 30 секунд, верно? Если да, то следующим образом:

AlarmManager

Примечание: Этот класс обеспечивает доступ к услугам системы сигнализации. Это позволяет планировать запуск приложения в определенный момент в будущем. Когда будильник погаснет, намерение, которое было зарегистрировано для него, транслируется системой, автоматически запуская целевое приложение, если оно уже , а не. Зарегистрированные аварийные сигналы сохраняются, когда устройство находится в , засыпая (и при необходимости может активировать устройство, если оно выключено в течение этого времени), но будет очищен, если он выключен и перезагружен.

Пример:

в вашем onClick() зарегистрировать таймер:

int repeatTime = 30; //Repeat alarm time in seconds 
AlarmManager processTimer = (AlarmManager)getSystemService(ALARM_SERVICE); 
Intent intent = new Intent(this, processTimerReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
//Repeat alarm every second 
processTimer.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),repeatTime*1000, pendingIntent); 

И ваш processTimerReceiver класс:

//This is called every second (depends on repeatTime) 
public class processTimerReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //Do something every 30 seconds 
    } 
} 

Не забудьте зарегистрировать приемник в вашем Manifest.xml

<receiver android:name="processTimer" > 
    <intent-filter> 
     <action android:name="processTimerReceiver" > 
     </action> 
    </intent-filter> 
</receiver> 

Если вы когда-либо хотите отменить сигнал: использовать это где-то в коде:

//Cancel the alarm 
Intent intent = new Intent(this, processTimerReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
alarmManager.cancel(pendingIntent); 

Надеется, что это помогает U из ,

PS: Если это не совсем то, что вам нужно, оставьте его в комментариях, или если кто-то хочет отредактировать это, пожалуйста, сделайте это.

0

О боже, никогда не используйте AlarmManager для таймеров 30 секунд.Это своего рода перебор, а также значительный ресурс ресурсов устройства (аккумулятор, процессор ...).

Возможно, вы могли бы попробовать использовать реальную справочную службу вместо IntentService, поскольку IntentService имеет тенденцию закрываться, когда заканчивается работа. Не уверен, что это так, но стоит попробовать.

+0

Я согласен, **, но ** он хочет, чтобы его таймер продолжался, несмотря ни на что, поэтому «AlarmManager» - лучший вариант, рассказать о дренаже батареи. для лучшего ответа прочитайте [this] (http://stackoverflow.com/a/7820613/4782930). – Strider

+0

Да, но если вам нужно повторить 30-секундный таймер в фоновом режиме, даже если приложение не работает, то это плохой дизайн приложения. Запуск тревоги каждые 30 секунд - это действительно плохой дизайн. –

+0

Правда, но я не знаю, получил ли я его вопрос правильно: P. Возможно, это даже не то, чего он хочет. Что ты сделал с его вопросом? Я только хотел подтолкнуть его в правильном направлении. – Strider

Смежные вопросы