首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保存上次执行后台进程时的日期和时间

如何保存上次执行后台进程时的日期和时间
EN

Stack Overflow用户
提问于 2022-01-01 16:24:25
回答 1查看 75关注 0票数 1

当检测到新邮件时,我的应用程序检查收到的新电子邮件,发送通知。目前,我一直在检查邮件是否在过去30分钟内收到,以显示邮件,但WorkManager有时会在后台停止工作(如果您知道为什么请告诉我,是安卓以某种方式杀死了进程,还是我的配置不好?)还会错过邮件通知。不知何故,我需要保存上次通知显示时的数据和时间(执行后台进程),但当WorkManager由于某种原因而停止工作时,我不知道如何将数据保存在WorkManager中。

WorkManager调用功能:

代码语言:javascript
复制
  @SuppressLint("RestrictedApi")
private fun startWorker(email: String, password: String) {

    if (enableMailNotifications == 1) {


        val constraints = Constraints.Builder()
            .setRequiredNetworkType(NetworkType.CONNECTED).build()

        val data = Data.Builder()
        data.put("email", email)
        data.put("password", password)


        val build: PeriodicWorkRequest = PeriodicWorkRequest.Builder(
            WorkerMan::class.java,
            15,
            TimeUnit.MINUTES,
            15,
            TimeUnit.MINUTES,

            )

            .addTag("WorkManager")
            .setInputData(data.build())
            .setConstraints(constraints)
            .build()

        WorkManager.getInstance(this)
            .enqueueUniquePeriodicWork("WorkManager", ExistingPeriodicWorkPolicy.REPLACE, build)
    }else{
        println("WorkManager not called: Mail Notifications are turned off")
    }
}

WorkManager类:

代码语言:javascript
复制
class WorkerMan(private val mContext: Context, workerParameters: WorkerParameters) :
    Worker(mContext, workerParameters) {


    @SuppressLint("RestrictedApi", "CheckResult")
    val email = inputData.getString("email")
    val password = inputData.getString("password")

    @SuppressLint("RestrictedApi")
    override fun doWork(): Result {


        println("WorkManager: Work called")
        Thread.sleep(5000)


        val session = Session.getDefaultInstance(Properties())
        val store = session.getStore("imaps")
        store.connect(
            "*****************",
            993,
            email,
            password
        )
        val inbox = store.getFolder("INBOX")
        inbox.open(Folder.READ_ONLY)


        val messages = inbox.search(
            FlagTerm(Flags(Flags.Flag.SEEN), false)
        )


        Arrays.sort(
            messages
        ) { m1: Message, m2: Message ->
            try {
                return@sort m2.sentDate.compareTo(m1.sentDate)
            } catch (e: MessagingException) {
                throw RuntimeException(e)
            }
        }





        Thread.sleep(1000)
        println("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ")
        println("WorkManager Started")
        println("WorkMananager email: " + email)
        val current = LocalTime.now()
        println("WorkMananager time: " + current)
        println("Messages amount: " + messages.size)
        println("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ")

        for (message in messages) {


            if (message.receivedDate.toInstant() >= Instant.now().minusMillis(1000 * 33 * 60)) {


                Thread.sleep(3000)
                println("=====================================================")
                println("NOTIFIKACIJA")

                var title = ""
                for (element in message.from) {
                    title += element.toString().substringAfter("<").substringBefore(">")
                    title += " "
                }
                println("Title :" + title)
                println("Subject :" + message.subject)
                println("Datum i vreme : " + message.receivedDate)

                title.replace("[", "")
                title.replace("]", "")



                FirebaseMessaging.getInstance().token.addOnSuccessListener { token: String ->
                    if (!TextUtils.isEmpty(token)) {
                        Log.d("TAG", "retrieve token successful : $token")
                        try {
                            send(token, message.subject, title)
                        } catch (e: MessagingException) {
                            e.printStackTrace()
                        }
                    } else {
                        Log.w("TAG", "token should not be null...")
                    }
                }.addOnFailureListener { e: Exception? -> }.addOnCanceledListener {}
                    .addOnCompleteListener { task: Task<String> ->
                        Log.v(
                            "TAG",
                            "This is the token : " + task.result
                        )
                    }


//
            }


        }
        println("=====================================================")
        Log.d("WorkManager", "Job finished")

        return Result.Success();
    }

}


fun send(to: String?, body: String?, title: String?): String? {
    try {
        val apiKey =
            "*******************************************"
        val url = URL("https://fcm.googleapis.com/fcm/send")
        val conn = url.openConnection() as HttpURLConnection
        conn.doOutput = true
        conn.requestMethod = "POST"
        conn.setRequestProperty("Content-Type", "application/json")
        conn.setRequestProperty("Authorization", "key=$apiKey")
        conn.doOutput = true
        val message = JSONObject()
        message.put("to", to)
        message.put("priority", "high")
        val notification = JSONObject()
        notification.put("title", title)
        notification.put("body", body)
        message.put("notification", notification)
        val os = conn.outputStream
        os.write(message.toString().toByteArray())
        os.flush()
        os.close()
        val responseCode = conn.responseCode
        println("\nSending 'POST' request to URL : $url")
        println("Post parameters : $message")
        println("Response Code : $responseCode")
        println("Response Code : " + conn.responseMessage)
        val `in` = BufferedReader(InputStreamReader(conn.inputStream))
        var inputLine: String?
        val response = StringBuffer()
        while (`in`.readLine().also { inputLine = it } != null) {
            response.append(inputLine)
        }
        `in`.close()

        // print result
        println(response.toString())
        return response.toString()
    } catch (e: Exception) {
        e.printStackTrace()
    }
    return "error"
}
EN

回答 1

Stack Overflow用户

发布于 2022-01-02 01:33:01

我看到了很多线程::doWork方法中的睡眠调用。doWork执行会占用您多长时间?

您应该注意,它有一个限制- 10分钟,从java文档:

给工作人员最多十分钟的时间来完成其执行并返回{@link androidx.work.ListenableWorker.Result}。在这段时间结束后,工人将被通知停止工作。

此外,在没有开始工作的情况下,可能会发生以下情况:

当工作的所有先决条件都完成时,它就有资格执行。如果其中任何一个先决条件失败或被取消,工作将永远不会运行。

所以也许你的案子还没开始呢?

关于保存时间戳,您可以将其保存到永久存储,如数据库或共享偏好

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70550168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档