Создание фонового (переднего плана?) Сервиса, который считает время и обновляет пользовательский интерфейс на протяжении всей жизни приложения (как в endomondo) - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу сделать секундомер как в endomondo. Когда мы запускаем приложение, оно должно считать время и обновлять textView в основной деятельности (на самом деле это фрагмент).

Я сделал фоновый сервис (например, здесь ), но он не работал. Когда я изменил действие на другое, сервис считал время с 0. Вопрос в том, как правильно это реализовать? Теперь я, возможно, должен воспроизвести поведение, аналогичное счетчику endomondo, что когда мы начинаем обучение, оно все время считает, независимо от того, изменим ли мы активность или минимизируем ли приложение. Я также пытался сделать это с помощью службы переднего плана, но, к сожалению, я прочитал, что я не могу обновить интерфейс от него. Я работаю над API уровня 24.

Как правильно справиться с этим?

1 Ответ

1 голос
/ 07 ноября 2019

создать службу переднего плана и использовать таймер countDown. затем каждую 1 секунду отправлять трансляцию, чтобы изменить пользовательский интерфейс. если вы хотите, чтобы ваше приложение работало в фоновом режиме на android 8 и выше, вы должны отправить уведомление с сервисом, чтобы показать пользователю, ваше приложение выполняет задачу.

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



    int milliseconds = 100* 1000;

    new CountDownTimer(milliseconds, 1000) {

        @Override
        public void onTick(long millisUntilFinished) {

            Intent intent = new Intent("timer_tracking");
            intent.putExtra("timer", millisUntilFinished);
            LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent);

        }

        @Override
        public void onFinish() {

            stopSelf();
        }
    }.start();


    return START_STICKY;
}

и в активности / фрагменте после регистрации broadcast_receiver используйте этот код.

 public BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @SuppressLint("DefaultLocale")
    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(MainActivity.this, "broad", Toast.LENGTH_LONG).show();

        long millisUntilFinished = intent.getLongExtra("timer", 0);

        String counter = String.format("%02d:%02d:%02d",
                TimeUnit.MILLISECONDS.toHours(millisUntilFinished),
                TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished),
                TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished) -
                        TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished)));


        textView.setText(counter);
    }
};
...