【问题标题】:How to Repeat a function every Hour in Android Studio using Kotlin?如何使用 Kotlin 在 Android Studio 中每小时重复一个功能?
【发布时间】:2019-03-27 02:59:12
【问题描述】:

我想每隔一小时(例如)重复一个功能(或任何动作)(例如),即使应用程序没有运行。

【问题讨论】:

  • 这种类型的问题还应该包括尝试自己解决问题以及为什么这种尝试没有奏效。见stackoverflow.com/help/how-to-ask
  • 我绑定了很多代码,但没有一个有效,为什么我会输入错误的代码我想要一个新的方式一个新的想法
  • 您所说的是“我不明白我尝试使用的代码是做什么的”。所以也许你应该退后一步,加强你的基础?
  • 是的,我应该这样做,但我不是在谈论循环兄弟!

标签: android kotlin alarmmanager repeat


【解决方案1】:

我已经创建了一个演示项目,你可以看看它:

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
)

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

编辑

您可以使用context.registerReceiver(receiver, IntentFilter("something")) 注册您的BroadcastReceiver 然后添加到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(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

从 Android 5.1 开始,值将被强制增加到 60000;不要依赖这个来准确

【讨论】:

  • 这一行有问题:val mIntent = Intent(context, broadCastReceiver) 我用 val mIntent = Intent(this, broadCastReceiver) 但还是同样的问题
  • 请检查我的存储库,您必须将接收器添加到 manifest.xml
  • 这是另一个问题@WIKOSO,不,它没有,你必须编写一点代码来产生这个问题,如果你想创建一个不同的问题来解释你尝试了什么以及你想要什么实现了,我可以看看
  • 这个方法在模拟器上运行正常,但在真机上就不行了,怎么回事?
  • 没有错误,只是当我使用真实设备时它没有运行的 Toast
【解决方案2】:

如果您使用的是 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();

在app gradle文件中添加:

dependencies {
def work_version = 2.0.0

// (Java only)
implementation "androidx.work:work-runtime:$work_version"
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2020-07-03
  • 2012-07-03
  • 2021-12-29
相关资源
最近更新 更多