警报广播接收器如何检查特定包运行中是否没有活动

时间:2015-04-19 05:38:22

标签: android

目前,我有一个股票市场应用程序。当股票市场应用程序“退出”时,它将启动AlarmBroadcastReceiver,以监控背景中的股票市场。

此代码看起来像这样。

// Code from main activity.
@Override
public void onPause() {
    super.onPause();
    ConnectivityChangeBroadcastReceiver.startAlarmBroadcastReceiver(this);

然而,这里有一个棘手的部分。当应用程序“退出”时,很难说出来。

从最终用户的角度来看,“退出”的确意味着,当屏幕上显示应用包中没有Activity屏幕时。

在以下情况下会触发

onPause

  • 按下后退按钮。 - 应该开始AlarmBroadcastReceiver
  • 按下主页按钮。 - 应该开始AlarmBroadcastReceiver
  • 从主Activity启动另一个Activity(与设置首选项活动类似)。 - 我不希望。但它将使用当前代码
  • 启动AlarmBroadcastReceiver

从主Activity启动另一个Activity

使用isFinishing对我的情况不起作用,因为它只在按下后退按钮时返回true,而不是按下主页按钮

因此,我决定在AlarmBroadcastReceiver onReceive的早期安装以下逻辑

public class AlarmBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // If the current on screen activity, is *SAME* application package
        // as AlarmBroadcastReceiver. This mean our app is not "quit" yet.
        // We should return early without performing anything else.

然而,我意识到这不是一件容易的事,正如我从

中看到的那样

How to get current foreground activity context in android?

  • ActivityManager的{​​{1}}在Android 5中被弃用。
  • 或者,根据gezdy的回答,您需要在应用程序的每个活动中使用“hacky”代码来更新全局静态变量。

建议的解决方案对我来说看起来并不那么优雅和可维护。

我想知道,对于我的情况,有没有更好的解决方法?因此,当屏幕上仍然可以看到同一个包中的其他getRunningTasks时,我可以阻止AlarmBroadcastReceiver运行其逻辑代码。

1 个答案:

答案 0 :(得分:1)

希望在某种程度上有所帮助。这是我在谷歌搜索时发现的。

  1. 您可以使用registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback)注册活动生命周期 ,但在 API Level 14。

  2. 中引入
  3. Steve Liles - Is my Android app currently foreground or background使用ActivityLifecycleCallbacks

  4. 撰写的博客