【问题标题】:Detect app is running or not on click of notification in android点击android中的通知检测应用程序是否正在运行
【发布时间】:2018-01-17 05:57:50
【问题描述】:

我想在点击通知时检测应用程序当前是否正在运行(即在后台或前台)。我已经实现了广播接收器,我想在其中检查应用程序状态(运行与否)。 我已经尝试过这个 check android application is in foreground or not? 。但它不能正常工作。 有没有其他方法可以检测到这一点?

【问题讨论】:

  • 在你分享的链接上有多种实现方式,哪一种不行?我认为使用 Application 类的人会工作。
  • @Kharda 这将检查应用程序是在前台还是后台,而不是应用程序是否正在运行
  • 如果启动了广播接收器,应用程序如何无法运行?

标签: android push-notification foreground


【解决方案1】:

您应该看看一个新组件Handling Lifecycles。您可以轻松检查活动、片段、服务甚至进程的当前状态ProcessLifecycleOwner

例如:

class CustomApplication extends Application {

    private static Lifecycle lifecycle;

    @Override
    public void onCreate() {
        super.onCreate();
        lifecycle = ProcessLifecycleOwner.get().getLifecycle();
    }

    public static Lifecycle.State getCurrentState (){
        return lifecycle.getCurrentState();
    }
}

然后你可以查看state

    if(customApplicationgetCurrentState().isAtLeast(Lifecycle.State.RESUMED)){
               //do something 
    }

你也可以添加一个观察者来监听变化。

public class CustomApplication extends Application {

private static Lifecycle lifecycle;

public static Lifecycle.State getCurrentState() {
    return lifecycle.getCurrentState();
}

@Override
public void onCreate() {
    super.onCreate();
    lifecycle = ProcessLifecycleOwner.get().getLifecycle();
    lifecycle.addObserver(new SomeObserver());
}

public static class SomeObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreate() {
        Log.d("Observer", ": onCreate");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop() {
        Log.d("Observer", ": onStop");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume() {
        Log.d("Observer", ": onResume");
    }
}
}

Adding Components to your Project

【讨论】:

    【解决方案2】:

    你可以像这样在activity中定义一个静态变量。

     class MainActivity extends Activity {
         public static boolean isAlive = false;
    
          @Override
          public void onStart() {
             super.onStart();
             isAlive = true;
          } 
    
          @Override
          public void onStop() {
             super.onStop();
             isAlive = false;
          }
    }
    

    您可以拨打MainActivity.isAlive查看活动是否正在运行。

    【讨论】:

    • 永远不要在 Activity 上设置静态字段 - 这会导致内存泄漏
    【解决方案3】:

    这种方式不起作用 - 如果您的应用程序没有运行,则应该启动(通过与往常相同的流程)。

    您可以将一些额外的意图从您的 BroadcastReceiver 传递到应用程序中,并且应该按照您需要的方式进行处理。

    这是唯一的方法。

    【讨论】:

    • 什么类型的额外,你能详细说明一下吗?我想检查应用程序是否正在运行。
    • 举个例子,如果应用程序正在运行,如果应用程序没有运行...
    • 我想在应用运行和应用关闭时打开不同的活动
    • 如果应用程序在前台和后台,我想打开假设一个 ActivityD,如果应用程序关闭,我想从启动器活动打开应用程序。
    • 我明白这一点,但是如果应用程序正在运行/未运行,您希望呈现什么功能。我想说的是,在开发 Android 应用程序的 9 年中,我从来没有必要这样做过——你的流程中有什么不对的地方
    【解决方案4】:

    当通知到来时,我可以建议你我做了什么。在您的活动中覆盖超级方法 onNewIntent(Intent Intent),您已通过待处理的意图,这意味着当用户按下通知时将打开所需的活动。在这里,当您的应用程序处于前台时,将调用此方法,如果您的应用程序被终止,则将调用所需的活动 onCreate()。还有一件事是让您的活动在 Manifest 中独占鳌头。

    In Manifest:        <activity
                android:name=".activities.TokenActivity"
                android:label="@string/app_name_short"
                android:launchMode="singleTop"/>
    
    In Activity:    @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            loadCouponFragment(intent.getExtras());
        }
    

    【讨论】:

    • 您的解决方案是合法的,但它发生在广播接收器已经启动应用程序之后......
    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2014-12-22
    • 2016-11-07
    • 2019-11-22
    • 1970-01-01
    相关资源
    最近更新 更多