如何使用 Kotlin 在 Android Studio 中每小时重复一个函数?

How to Repeat a function every Hour in Android Studio using Kotlin?

我想每隔一小时(例如)重复一个功能(或任何操作),即使该应用不是 运行。

我创建了一个演示项目,您可以看一下:

https://github.com/joancolmenerodev/BroadcastReceiverAndAlarmManagerInKotlin


你首先要创建一个BroadcastReceiver, and then using 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
)

然后即使应用已关闭,您也可以看到 Toast。

编辑

您可以使用 context.registerReceiver(receiver, IntentFilter("something")) 注册您的 BroadcastReceiver 然后添加到 mIntent 和 "something" 的操作。

如果您不喜欢这种方式,您可以创建一个名为 MyReceiver 的新 class 来扩展 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(this, 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

Value will be forced up to 60000 as of Android 5.1; don't rely on this to be exact

如果您使用的是 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"
}