【问题标题】:Determine whether App is visible when clicking on a notification判断点击通知时App是否可见
【发布时间】:2016-09-26 07:37:10
【问题描述】:

我有一个前台服务,可以通过单击通知中的“X”来停止它。

当前台服务停止时,应显示其他活动。

问题是,当单击“X”按钮时,我不知道应用程序是可见的还是在后台。当应用可见时,应更改活动。

【问题讨论】:

    标签: android notifications


    【解决方案1】:

    对于您的问题没有 100% 的保证解决方案。

    其中一个最简单的方法是在全局变量中跟踪可见活动:

    public void onResume(){
        super.onResume();
        App.visibleActivity = this; 
    }
    
    public void onPause(){
       super.onPause();
       App.visibleActivity = null;
    }
    

    但是有一些重要的事情:

    1) 不要忘记在 onPause 时释放 visibleActivity 以防止内存泄漏

    2) 当您的应用在技术上处于后台时,当前的 onPause 和下一个 onResume 之间存在时间间隔

    【讨论】:

      【解决方案2】:

      检查您的活动是否在前台运行?给你:

      public boolean isRunning(Context ctx) {
          try {
          ActivityManager am = (ActivityManager) context
                  .getSystemService(Context.ACTIVITY_SERVICE);
          // The first in the list of RunningTasks is always the foreground
          // task.
          RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
          String foregroundTaskPackageName = foregroundTaskInfo.topActivity
                  .getPackageName();// get the top fore ground activity
          PackageManager pm = context.getPackageManager();
          PackageInfo foregroundAppPackageInfo = pm.getPackageInfo(
                  foregroundTaskPackageName, 0);
      
          String foregroundTaskAppName = foregroundAppPackageInfo.applicationInfo
                  .loadLabel(pm).toString();
      
          // Log.e("", foregroundTaskAppName +"----------"+
          // foregroundTaskPackageName);
          if (!foregroundTaskAppName.equals("Your App name")) {
              return true;
          }
      } catch (Exception e) {
          Log.e("isAppSentToBackground", "" + e);
      }
      return false;
      }
      

      对于 API 级别 >= 21

      ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
      List<ActivityManager.AppTask> tasks = activityManager.getAppTasks();
      
      for (ActivityManager.AppTask task : tasks) {
          Log.d(TAG, "stackId: " + task.getTaskInfo().stackId);
      }
      

      【讨论】:

      • 如果活动在后台运行,我将获得 2 个任务,一个用于服务,一个用于活动。只有当活动被操作系统杀死时,只有一个任务。
      • @sativa : 是的,在这里你必须检查堆栈中的第一个任务是否总是在前台
      • @sativa 此代码不适用于 Andoid API Level >= 21,因为该方法已弃用 API Docs Link
      • @harsh201 :感谢您提到的要点!我在这里更新了答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2011-02-16
      • 2014-05-03
      • 1970-01-01
      • 2015-12-29
      相关资源
      最近更新 更多