Как повторять функцию каждый час в Android Studio, используя Kotlin? - PullRequest
0 голосов
/ 26 марта 2019

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

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Если вы используете библиотеку AndroidX (JetPack), то лучше использовать Workmanager

Простой пример:

public class MyWorker extends Worker {

    static final String TAG = "workmng";

    @NonNull
    @Override
    public WorkerResult doWork() {
        Log.d(TAG, "doWork: start");

       //Do your job here

        Log.d(TAG, "doWork: end");

       return WorkerResult.SUCCESS;
    }
}

И начните так, чтобы выполнять свою работукаждый час:

PeriodicWorkRequest myWorkRequest = new PeriodicWorkRequest.Builder(MyWorker.class, 60, TimeUnit.MINUTES)
   .build();

Добавить в файл gradle приложения:

dependencies {
def work_version = 2.0.0

// (Java only)
implementation "androidx.work:work-runtime:$work_version"
}
0 голосов
/ 26 марта 2019

Я создал демонстрационный проект, чтобы вы могли на него взглянуть:

https://github.com/joancolmenerodev/BroadcastReceiverAndAlarmManagerInKotlin


Сначала вы должны создать BroadcastReceiver, а затем, используя AlarmManager, вы можете выбрать интервал времени, в который вы хотите позвонить.

Создать BroadcastReceiver вы можете сделать это следующим образом:

val broadCastReceiver = object : BroadcastReceiver() {
     override fun onReceive(contxt: Context?, intent: Intent?) {
         toast("This toast will be shown every X minutes")
     }
}

А затем у вас есть этот метод, чтобы начать работу:

val mIntent = Intent(context, broadCastReceiver)

val mPendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, mIntent, 0)
val mAlarmManager = context
    .getSystemService(Context.ALARM_SERVICE) as AlarmManager
mAlarmManager.setRepeating(
    AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis(),
    CHANGETOYOURDESIREDSECONDS, mPendingIntent
)

И тогда вы сможете увидеть тост, даже если приложение закрыто.

Редактировать

Вы можете зарегистрировать BroadcastReceiver, используя context.registerReceiver(receiver, IntentFilter("something")) и затем добавление к mIntent и действия для «чего-то».

Если вам не нравится этот способ, вы можете создать новый класс с именем MyReceiver, который расширяет BradcastReceiver следующим образом:

class MyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        Toast.makeText(context,"This toast will be shown every X minutes", Toast.LENGTH_SHORT).show()
    }
}

А затем включите сигнализацию следующим образом:

val mIntent = Intent (это MyReceiver :: class.java)

val mPendingIntent = PendingIntent.getBroadcast(this, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT)
        val mAlarmManager = this
            .getSystemService(Context.ALARM_SERVICE) as AlarmManager
        mAlarmManager.setRepeating(
            AlarmManager.RTC_WAKEUP, System.currentTimeMillis(),
            WHATEVERYOUWANT, mPendingIntent
        )

Примечание. По умолчанию установлено значение 60000

.

Значение будет увеличено до 60000 с Android 5.1; не полагайтесь на это, чтобы быть точным

...