2012-12-26 42 views
3

检测应用程序是否处于前景的原因有很多。例如,作为GCM/C2DM推送通知的触发器,很多应用程序在执行应用程序前台和后台的不同行为时都会有很好的理由。 其他原因可能是 - 打击耗费宝贵资源的服务,例如查询后台任务中的服务器。确定是否在前台应用程序 - 是否皱眉?

只要是明确的:定义(在我看来)的后台程序是
应用程序,它没有它的活动被调用的方法onStart(),却没有援引onStop()方法。这是因为活动仅在当时在其生命周期中对用户可见。

从另一方面 -

  • 似乎是谷歌不希望应用到home键的反应(这不是API的一部分)

  • 反应到onBackPressed()上“根/主“活动作为离开的指示器Activity当然不是好主意(因为很多用户使用主页按钮,而不是后退按钮)

  • API中没有方法允许de termine如果应用程序是前景(根据我的定义..)

,如果我没有错过API的东西,它是真正的情况 - 为什么没有为什么容易确定该应用程序是前景还是没有???? !!!!

什么,我知道我可以做以确定是否前台的应用在这个线程描述 - How to detect when an Android app goes to the background and come back to the foreground

但@Emil说 - 它需要特殊的权限,或者需要一些棘手的逻辑的,其速度非常快成为问题保持,它闻起来像坏的做法(虽然这是我在做什么,现在,因为我没有更好的主意......)

我的问题基本上都是

  • 有没有这样的API方法从好的理由?

  • 考虑到应用程序是否为前景是一种不好的方法?

  • 是否有任何其他方式知道应用程序是否为前景?

回答

5

是考虑到如果应用前景与否是个不错的办法?

考虑前景与背景是合理的。

是否有任何其他方式知道应用程序是否为前景?

可以大致可分为这样的场景分成两组:要在在前台/后台状态的变化立即采取行动

  1. 案件

  2. 的包装箱一些其他事件发生(AlarmManager报警,传入的系统广播等),并在此时根据您是否处于前景采取不同的行动

在前一种情况下,onUserLeaveHint()是您最可靠的简单选项。例如,我不能保证它会覆盖所有情况,但它应该处理HOME情景。您也欢迎您在静态数据成员中维护已启动活动的引用计数,并尝试使用它。

在后一种情况下,ordered broadcast可能会有用。

+0

你的回答确实在我的脑海中有所作为......我没有想到将有序广播作为第二种情况的解决方案。对于这种情况看起来很完美。关于第一种情况 - 我不熟悉 - onUserLeaveHint()方法。很高兴知道它存在,但正如你所说 - 它仍然没有涵盖所有..静态变量表明开始和不停止的活动的数量是我在做什么,并猜测在你的建议后,我将与此生活在一起解决方案没有感觉它这样一个不好的解决方案.. :) –

0

我有同样的问题。我想在我的活动不处于前景模式时显示推送通知。请通过下面的代码,你会得到你的答案。

Context ctx = context.getApplicationContext(); 

    ActivityManager am = (ActivityManager) context 
      .getSystemService(ACTIVITY_SERVICE); 

    // get the info from the currently running task 
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 

    PackageManager pm = this.getPackageManager(); 

    try { 
     /** 
     * take fore ground activity name 
     */ 
     ComponentName componentInfo = taskInfo.get(0).topActivity; 
     if (printLog == true) { 
      Log.d("Home", "CURRENT Activity ::" 
        + taskInfo.get(0).topActivity.getClassName()); 
      Log.d("Home", "Number Of Activities : " 
        + taskInfo.get(0).numRunning); 
      Log.d("Home", 
        "Componenet Info : " + componentInfo.getPackageName()); 
      Log.d("Home", 
        "Componenet Info : " + componentInfo.getClassName()); 
     } 
     /** 
     * All activities name of a package to compare with fore ground 
     * activity. if match found, no notification displayed. 
     */ 
     PackageInfo info = pm.getPackageInfo(
       "<PackageName>", 
       PackageManager.GET_ACTIVITIES); 
     ActivityInfo[] list = info.activities; 

     for (int i = 0; i < list.length; i++) { 
       Log.d("TAG","Activity : "+list[i].name); 
     } 

    } catch (NameNotFoundException e) { 
     e.printStackTrace(); 
    } 

要利用这一点,你必须采取许可,您manifest文件。

使用许可权的android:NAME = “android.permission.GET_TASKS”

请原谅我,如果我不能得到你的问题。

+0

感谢您的答案,但我附加了一个链接到另一个职位,显示该答案作为我已经知道abot。你可以在问题的主体中看到它.. –

0

如果你需要知道应用程序是在背景上运行的服务的背景还是前景(否则没有意义),那么你可以使用绑定,即 - 绑定到它上所有活动onResume,并解除所有活动onPause。那么在您的服务中,您不仅可以管理您的应用程序对用户的可见性,还可以随时管理哪些活动已打开。它也是防泄漏和稳定的,然后是一个静态变量(如果需要,可以进行清理),因为您正在使用android的API并依赖于android操作系统代码本身的正确性。

相关问题