【问题标题】:Broadcast Receiver that isn't tied to Activity Lifecycle与活动生命周期无关的广播接收器
【发布时间】:2018-01-01 02:37:12
【问题描述】:

我正在尝试使用广播接收器来实现一个应用程序,该应用程序可以计算我的手机屏幕全天打开的时间。

我在我的广播接收器中声明Action_Screen_Off/Action_Screen_On,因为我无法在我的清单中声明它,并且我一直在讨论处理存储我的屏幕开启时间量的最佳方法。

由于我不能在清单中声明它,我应该在我的活动中的 onCreate 内声明广播接收器吗?我担心的是,如果我的理解是正确的,那么我的接收器将与活动的生命周期相关联,并且我只能在活动处于活动状态时存储开/关时间。

应用程序的重点在于它在后台运行,然后在活动处于前台时显示使用图表。

这让我认为服务可能是处理广播接收器的最佳选择,但 Google 现在似乎建议我们不要使用后台服务,而只使用有界和前台服务。

如何确保我的应用正在接收开/关 Intent,而没有声明接收器处于前台的 Activity,并且接收器不依赖于该 Activity 的生命周期?

【问题讨论】:

    标签: android android-intent broadcastreceiver android-service


    【解决方案1】:

    您需要背景Service 才能使用此功能。您的 Service 不需要实际执行任何操作,但它需要始终处于活动状态,以便您有一些东西可以将您的 BroadcastReceiver 锚定到。在ServiceonCreate() 中,创建BroadcastReceiver 的实例并注册屏幕开/关事件。确保从onStartCommand()Service 中返回START_STICKY。这将确保Service 始终处于活动状态,并且如果Service 杀死您的进程(无论出于何种原因),Android 将重新启动它。 BroadcastReceiver 可以将开/关事件的时间戳写入文件、SQLite 数据库或SharedPreferences,然后您的Activity 可以读取这些数据并显示图表或其他内容。

    【讨论】:

    • 我不知道为什么我的印象是服务通常会写入本地商店,而不是BroadcastReceiver。出于这个原因,我打算将Service 锚定到BroadcastReceiver
    • 我不明白你的评论。您需要更多帮助吗?
    • 请。所以我对这种方式的最大担忧是,如果我杀死了应用程序,那么它就不再检测到屏幕的开启或关闭。如果用户启动应用程序,并且应用程序在后台,它会运行,但一旦他们从活动应用程序中清除它,它就会停止运行。
    • 你在什么手机上测试这个?
    • Moto g 5 plus 跑步棉花糖
    猜你喜欢
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多