【问题标题】:Service running in the background后台运行的服务
【发布时间】:2018-07-25 12:52:41
【问题描述】:

我想要实现的是创建一个服务(?),它在安装应用程序后启动/注册,并将监控项存储在数组中。这些商品是有到期日的产品,所以如果今天是到期日,我想显示关于它的通知,无论应用程序当前是否正在运行。

我已经在互联网和 Android 开发者网站上搜索了答案,以下是我了解到的:

  1. 我需要创建一个服务,它在 onStartCommand 返回“START_STICKY”并在我的 android Manifest.xml 文件中指定 Activity 处于 SingleTop 启动模式。
  2. 我需要将此 Service 与我的 Activity 绑定,以便以一种或另一种方式传递数据。

我不知道该怎么做:

  1. 在哪里启动服务,所以只有 1 个实例?
  2. 如何检查存储在数组中(在服务或活动中)的到期日期,例如每天一次?
  3. 包含产品的数组,它应该是静态的,以便可以从 Activity 和 Service 访问,还是我应该创建它的单独实例并通过 Binder 相应地传递数据?

一般来说,我知道基础知识以及它应该如何工作,但我缺乏如何实施它以便它有效的概念。

感谢所有回答! :)

// 编辑

目前我的自定义服务的一些代码:

class ExpiryMonitorService : Service() {

private val productsArray: ArrayList<ProductEntry> = ArrayList()

// Binder which will be given to clients
private val mBinder: IBinder = LocalBinder()

inner class LocalBinder : Binder() {

    fun getService() : ExpiryMonitorService {

        // Return this instance of ExpiryMonitorService so clients can call public methods
        return this@ExpiryMonitorService

    }
}

override fun onBind(intent: Intent?): IBinder {

    return mBinder
}

override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
    return START_STICKY // Restart this service if it gets killed by the system
}


}

【问题讨论】:

    标签: android service background-process android-binder


    【解决方案1】:

    答案不是服务。它是一个警报管理器(或 JobScheduler)设置为接近到期项目的到期时间,以及一个项目和到期日期的数据库。当作业停止时,它会发送通知并根据数据库中的数据安排下一个警报/作业。

    服务不是答案,因为服务可以随时终止以获取资源。此外,在现代版本的 Android 上,服务在被杀死之前可以进行多少后台处理是有限制的。这些都不是一个好的监控解决方案。幸运的是,您实际上并不需要监控,您只需要在特定时间收到警报,这非常适合警报。

    【讨论】:

    • 谢谢,这是我一直在寻找的答案。 :) 我将尝试使用 AlarmManager 或 JobSheduler 来实现它,这取决于我的需要(我需要先检查一下:D)并在需要时发布任何问题。
    • @BartoszKubacki 两者的角色相同,但 JobScheduler 更新且更易于使用。它只是较旧的手机不会有它。它们允许您安排在给定时间唤醒您的应用并启动特定的 BroadcastReceiver(JobScheduler 上有许多附加选项,使其更易于使用)。
    • 我相信我已经使用 JobSheduler 成功实施了解决方案,但我找不到任何好的方法来安排一天一次的特定时间的活动,比如早上 8 点。我错了还是应该用警报管理器来完成?
    • @BartoszKubacki JobScheduler 就足够了。应该有一个定期选项。或者在最坏的情况下,一项工作可以安排下一项工作。
    • 也许你是对的,但如何实施呢?定期作业将以特定的时间间隔完成,但是,例如,如果我将安排一个以 24 小时为间隔的任务,我无法控制它将在什么时间执行——尤其是在同时重新启动设备的情况下。 AlarmManager 似乎是一个真正的答案,因为它提供了指定执行任务的确切时间的功能。
    猜你喜欢
    • 1970-01-01
    • 2014-04-11
    • 2012-10-21
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    相关资源
    最近更新 更多