Android 确定应用程序是否位于前台-是否不赞成?

Android 确定应用程序是否位于前台-是否不赞成?,android,activity-lifecycle,application-lifecycle,Android,Activity Lifecycle,Application Lifecycle,检测应用程序是否在前台有很多原因。 例如,作为GCM/C2DM推送通知的触发器,当应用程序处于前台和后台时,很多应用程序都有很好的理由实现不同的行为。 另一个原因可能是——关闭消耗宝贵资源的服务,例如在后台任务中查询服务器 需要明确的是:后台应用的定义(在我看来)是: 没有任何it活动通过onStart()方法调用的应用程序,尚未调用onStop()方法。 这是因为用户在it生命周期中只能在那个时候看到活动 另一方面— 谷歌似乎不希望应用程序对home按钮做出反应(它不是API的一部分) 对“

检测应用程序是否在前台有很多原因。 例如,作为GCM/C2DM推送通知的触发器,当应用程序处于前台和后台时,很多应用程序都有很好的理由实现不同的行为。 另一个原因可能是——关闭消耗宝贵资源的服务,例如在后台任务中查询服务器

需要明确的是:后台应用的定义(在我看来)是:
没有任何it活动通过
onStart()
方法调用的应用程序,尚未调用
onStop()
方法。 这是因为用户在it生命周期中只能在那个时候看到活动

另一方面—

  • 谷歌似乎不希望应用程序对home按钮做出反应(它不是API的一部分)

  • 对“root/main”活动上的
    onBackPressed()
    做出反应,作为离开
    活动的指示器肯定不是个好主意(因为很多用户使用home按钮,而不是back按钮)

  • API中没有允许确定应用程序是否为前台的方法(根据我的定义…)

如果我没有错过API中的某些内容,而且确实如此-为什么没有理由轻松确定应用程序是否处于前台

我知道我可以做什么来确定应用程序是否是前台应用程序,请参见本线程-

但正如@Emil所说,这需要特别的许可,或者需要一些复杂的逻辑,这些逻辑很快就会变得难以维护,而且闻起来很糟糕(虽然这就是我现在正在做的,因为我没有更好的想法……)

我的问题基本上是

  • 没有这样的API方法是有充分理由的吗

  • 考虑应用程序是否处于前台是一种不好的方法吗

  • 有没有其他方法可以知道应用程序是否是前台应用程序

考虑应用程序是否处于前台是一种不好的方法吗

考虑前景和背景是合理的

有没有其他方法可以知道应用程序是否是前台应用程序

您可以大致将此场景分为两组:

  • 您希望在前台/后台状态发生变化时立即采取行动的情况

  • 发生其他事件的情况(
    AlarmManager
    alarm、传入系统广播等),此时您希望根据您是否在前台采取不同的行动

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


    在后一种情况下,A可能很有用。

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

        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();
        }
    
    Context ctx=Context.getApplicationContext();
    ActivityManager am=(ActivityManager)上下文
    .getSystemService(活动和服务);
    //从当前正在运行的任务中获取信息
    List taskInfo=am.getRunningTasks(1);
    PackageManager pm=this.getPackageManager();
    试一试{
    /**
    *以地面活动名称为准
    */
    ComponentName componentInfo=taskInfo.get(0).topActivity;
    if(printLog==true){
    Log.d(“主页”,“当前活动:”
    +taskInfo.get(0.topActivity.getClassName());
    日志d(“主页”,“活动数量:”
    +taskInfo.get(0.numRunning);
    Log.d(“主页”,
    组件网信息:“+componentInfo.getPackageName());
    Log.d(“主页”,
    组件网信息:“+componentInfo.getClassName());
    }
    /**
    *要与fore ground进行比较的包的所有活动名称
    *活动。如果找到匹配项,则不显示通知。
    */
    PackageInfo=pm.getPackageInfo(
    "",
    PackageManager.GET_活动);
    ActivityInfo[]列表=info.activities;
    for(int i=0;i
    要使用它,您必须在
    清单
    文件中获得权限

    使用权限android:name=“android.permission.GET\u任务”


    如果我不能回答您的问题,请原谅。

    如果您需要知道应用程序是在后台运行的服务的后台还是前台(否则没有意义),那么您可以使用绑定,即在恢复时对所有活动绑定,在暂停时对所有活动解除绑定。然后,在您的服务中,您不仅可以管理应用程序对用户的可见性,还可以随时管理哪些活动处于打开状态。在使用安卓API并依赖安卓操作系统代码本身的正确性时,它比静态变量(必要时可以清除)更防泄漏、更稳定。

    有了新的安卓体系结构组件,就可以很容易地知道你的应用程序是在前台还是后台

    与activity scope lifecycle owner一样,有一个通用流程生命周期所有者,您可以订阅并获取生命周期更新

    例如:

    添加此代码以注册为生命周期观察者

    ProcessLifecycleOwner.get().lifecycle.addObserver(lifecycleListener)
    
    和此代码,以便接收相关回调

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onApplicationOnStartEvent() {
    
    }
    
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onApplicationOnStopEvent() {
    
    }
    
    <
    ProcessLifecycleOwner.get().getLifecycle().removeObserver(lifecycleListener);