Лучшая практика для запуска фонового таймера внутри службы и после запуска кода? - PullRequest
0 голосов
/ 14 января 2019

Всего лишь несколько вопросов, которые нужно указать в правильном направлении, и покажите мою работу.

Моя цель:

  • Пользователь вводит значение (минуты) в EditText в окне Activity и нажимает кнопку OK.
  • Активность закрывается, а затем по истечении заданного промежутка времени появляется новое диалоговое окно «Активность».

Мой вопрос (ы):

  • Должен ли я использовать Сервис (или) IntentService?
  • В Службе, выполняющей таймер, должен ли я использовать поток для запуска кода внутри него? Кроме того, если да, следует ли мне запускать таймер внутри одного потока, а затем запускать новый код в другом потоке?

  • Для кода таймера в Сервисе я должен просто использовать AlarmManager (ИЛИ) a CountdownTimer (ИЛИ) , если я использую какой-то PendingIntent (ИЛИ) какой-то ASyncTask (ИЛИ) , использующий системные часы для определения истекшего фактического времени? Я не уверен, что лучший способ сделать это, есть так много способов.

Моя работа до сих пор:

  • В коде кнопки я преобразую значение, введенное в editText, в целое число, представляющее время, введенное в минутах, а затем обратно в строку, чтобы его можно было передать в службу с помощью putExtra с намерением.

    // ИДЕНТИФИКАЦИЯ EditText EditText editText_timerValue; editText_timerValue = (EditText) findViewById (R.id.editText_timerValue);

    // MAKE SURE A VALUE HAS BEEN ENTERED, AND AVOID NullPointerException
    if (editText_timerValue != null) {
    
        // CONVERT USER-DATA FROM THE EditText TO AN INT
        int int_timerValue_Ms;
        int_timerValue_Ms = Integer.parseInt(editText_timerValue.getText().toString());
        // CONVERT USER-DATA FROM (Integer = MilliSeconds) TO (Minutes)
        int int_timerValue_Min;
        int_timerValue_Min = int_timerValue_Ms * 60000;
    
        // CONVERT INT BACK TO A STRING SO IT CAN BE PASSED USING putExtra
        String string_timerValue_Min;
        string_timerValue_Min = String.valueOf(int_timerValue_Min);
    
        // DECLARE INTENT FOR STARTING THE TIMER SERVICE
        Intent intent = new Intent(this, TimerService.class);
    
        // PASS THE VALUE OF THE EditText WITH THE INTENT THAT STARTS SERVICE
        intent.putExtra("TIMER_VALUE", string_timerValue_Min);
    
        // START TIMER SERVICE (RUNS BACKGROUND TIMER, PERFORMS ACTIONS WHEN EXPIRED)
        startService(intent);
    
        // CLOSE THE CURRENT ACTIVITY, AS THE TIMER SERVICE RUNS IN THE BACKGROUND
        finish();
    
        // IF NO VALUE HAS BEEN ENTERED INTO THE EditText
        } else {
    
        Toast.makeText(MainActivity.this, "Please enter a Value in Minutes!", Toast.LENGTH_LONG).show();
    }
    

Меня не слишком беспокоит показанная мной работа - меня больше волнует, как мне следует настроить таймер, поскольку, как я понял, есть несколько способов сделать это.

...