Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >adb shell顶部显示了我的应用程序在前台,但实际上它在后台。

adb shell顶部显示了我的应用程序在前台,但实际上它在后台。
EN

Stack Overflow用户
提问于 2015-09-21 09:27:18
回答 2查看 3K关注 0票数 2

我有Android应用程序,有一些绑定到某个进程的服务。

我发现adb shell top -n 1返回:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PID PR CPU% S  #THR     VSS     RSS PCY UID      Name
31647  0   1% S    70 1733640K  98960K  bg u0_a132  com.my.app.dev
31727  0   1% S    29 1523892K  62924K  fg u0_a132  com.my.app.dev:myService

即使我的应用程序处于后台,为什么top PCY 告诉 'fg' a.e。前台?

有人能在这个问题上宣传一下吗?

这是我的Manifest.xml:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
          package="com.my.app.dev" 
          android:versionName="4.0.1.6700000"
          android:versionCode="5033" >
    
    <uses-sdk android:minSdkVersion="10"
              android:targetSdkVersion="16" />
    
    
    
    
        
    <application android:icon="@drawable/icon" 
                 android:label="@string/config_app_name" 
                 android:theme="@style/Theme.NoActionBarAppCompat" 
                 android:name="com.my.app.Mine" > 
                 
        <!-- we would prefer the launchMode to be standard, but it causes a lot of problems. -->
        <activity android:name="com.my.ui.main.MineApp" 
                  android:label="@string/config_app_name"
                  android:launchMode="singleTask" 
                  android:clearTaskOnLaunch="true" 
                  android:theme="@style/Theme.Translucent.NoActionBarAppCompat" >

            <intent-filter>      
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="mine.action.HomeActivity" />
                
                <category android:name="android.intent.category.LAUNCHER" />
                <action android:name="android.intent.action.MAIN" />
            </intent-filter>
        </activity>
        
        
        
        <meta-data android:name="com.google.android.maps.v2.API_KEY"
                   android:value="xxxxxx" />
        
        <meta-data android:name="com.google.android.gms.version" 
                   android:value="@integer/google_play_services_version" />
        
        
        
        <uses-library android:name="com.google.android.maps" /> 
        
        
    
        
        <service android:name="com.my.engine.logic.EngineService" 
                 android:process=":myService">
            <intent-filter>
                
                <action android:name="com_my_RemoteService" />
                <action android:name="com_my_EngineService" />
            </intent-filter>
        </service>
        
        

        
                
        <receiver 
          android:name="com.my.engine.analytics.ReferrerReceiver" 
          android:exported="true" android:process=":myService">
            <intent-filter>
                <action 
              android:name="com.android.vending.INSTALL_REFERRER"/>
            </intent-filter>
        </receiver>
        
        <receiver 
              android:name="com.my.engine.BootBroadcastReceiver" 
              android:process=":myService">
            <intent-filter>
                <action 
android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

        <receiver 
             android:name="com.my.engine.util.MineWatcherReceiver" 
             android:process=":myServiceWatcher">
            <intent-filter>
                <action
       android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                <action   
       android:name="android.intent.action.BATTERY_OKAY" />
                <action 
       android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action 
       android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>
    
        <receiver 
           android:name="com.my.engine.logic.InitServiceReceiver" 
           android:exported="true" android:process=":myService">
            <intent-filter>
                <action android:name="initServiceCheck"/>
            </intent-filter>
        </receiver>

        <receiver 
            android:name="com.my.engine.logic.UpdateCounterReceiver" 
            android:exported="true" android:process=":myService">
            <intent-filter>
                <action android:name="updateCustomCounter"/>
            </intent-filter>
        </receiver>
        
        <receiver 
         android:name="com.my.engine.logic.PackageChangeReceiver" 
         android:process=":myService">
            <intent-filter>
                <action  
              android:name="android.intent.action.PACKAGE_ADDED"/>
                <action 
              android:name="android.intent.action.PACKAGE_REPLACED"/>
                <action 
              android:name="android.intent.action.PACKAGE_REMOVED"/>
                <action 
              android:name="android.intent.action.PACKAGE_INSTALL"/>
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>
        
        <!-- for notification try next action -->
        <service android:name="com.my.notifications.actions.TryNextNotificationActionService" />
        
        <receiver android:name="com.my.ui.base.EulaReminderReceiver">
            <intent-filter>
                <action android:name="eulaReminderAction" />         
            </intent-filter>
        </receiver>
        
        <receiver android:name="com.my.ui.base.MineGuiBroadcastReceiver">
            <intent-filter>
                <action android:name="finishStoppedActivities" /> 
            </intent-filter>
        </receiver>
        
        <service android:name="com.my.infra.motion.ActivityRecognitionService"
                 android:label="ActivityRecognitionService"
                 android:exported="true"
                 android:enabled="true"
                 android:process=":myService">
        </service>
        
    </application>
    
</manifest> 

编辑1

我甚至停止了设置的通知,但是前台仍然是process=":myService

编辑2

来自资料来源

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (p == SP_BACKGROUND)
        strcpy(proc->policy, "bg");
    else if (p == SP_FOREGROUND)
        strcpy(proc->policy, "fg");
    else
        strcpy(proc->policy, "er");

来自其他问题的答案

用于PCY的 PCY --策略--决定Android的内存管理器应该如何对待应用程序 前台进程被认为是前台进程,不应该被终止以释放内存。 BG -背景进程被认为是一个后台进程(不活跃地在前台运行,可能会被终止以释放内存)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-21 11:25:24

详细阐述亚历克斯·P.的回答:

我相信PCY列是指流程分配给的cgroup。Android定义了两个cgroup组,SP_FOREGROUNDSP_BACKGROUNDSP_BACKGROUND的实际名称是bg_non_interactive。这些组分别用top表示,缩写为fgbg

您可以在整个框架中找到这些引用,特别是在Process.javaIPCThreadState.cppandroid_util_Process.cpp中的本机代码中,这些代码与Linux/proc文件系统接口,以管理正在运行的进程的各个方面。根据这些文件中注释的源代码,前台cgroup中的所有线程似乎都是用CPU的“正常”份额调度的,而后台cgroup中的线程则是用“缩减”份额调度的。

至于正常和简化的定义,博客指出,SP_BACKGROUND线程仅限于5%的CPU使用率。您可以通过查看正在运行的设备上的/dev/cpuctl/bg_non_interactive/cpu.shares来确认这一点。在我运行AOSP 5.1的Nexus 5上,我得到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@hammerhead:/ # cat /dev/cpuctl/bg_non_interactive/cpu.shares              
52
root@hammerhead:/ #

在这里,52是指cgroup中线程所允许的'CPU共享‘的数量,最多为1024个共享。因此,在这种情况下,确实允许bg_non_interactive线程对组中的所有线程最多使用5%的CPU。

无论如何,很明显前景和背景与安卓的活动生命周期以及前台和后台应用程序的概念没有什么关系。这就是安卓利用Linux的cgroups工具的方式。

票数 2
EN

Stack Overflow用户

发布于 2015-09-21 10:06:10

PCY代表scheduling policy。该列中的fg意味着进程获得比bg更高的优先级。这并不意味着进程正在前景中运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32701187

复制
相关文章
Activemq获取消费者数量(consumerCount)
最近开始学习activemq系统的使用,关于如何在activemq中时实获取一个主题/队列(topic/queue)的订阅/消费者数量,让我花了挺多时间才搞明白: 在activemq中,可以通过订阅主题或队列对应的消息管理主题,从而获取咨询消息(Advisory Message), 每当新增/减少订阅者时都会收到相关的咨询消息。 Advisory Message中就包含了一些我们想要的数据(包含在consumerCount属性中)。 关于Advisory Message的详细说明参见官方文档: http://activemq.apache.org/advisory-message.html
10km
2020/02/13
2.5K2
ActiveMQ学习之SpringBoot整合ActiveMQ------>主题生产者和消费者
一、pom <!--聚合工程集成关系--> <!--统一整合第三方框架依赖信息--> <parent> <groupId>org.springframework.boot</grou
用户5899361
2020/12/07
3430
ActiveMQ学习之SpringBoot整合ActiveMQ------>队列生产者和消费者
一、pom <!--聚合工程集成关系--> <!--统一整合第三方框架依赖信息--> <parent> <groupId>org.springframework.boot</grou
用户5899361
2020/12/07
5350
ActiveMQ多个消费者消费不均匀问题
如果客户端处理很慢的话,Broker会在之前发送消息的反馈之前,继续发送新的消息到客户端。如果客户端依旧很慢的话,没有得到确认反馈的消息会持续增长。在这种情况下,Broker有可能会停止发送消息给消费者。当未被反馈的消息达到了prefetch limit设置的数字时,Broker将会停止给消费者发送新的消息。除非消费者开始给与反馈,否则得不到任何消息。
java架构师
2019/04/09
1.7K0
ActiveMQ多个消费者消费不均匀问题
activemq之消费者消费解析与高可用策略(三)
有两种方法可以接收消息,一种是使用同步阻塞的MessageConsumer#receive方法。另一种是使用消息监听器MessageListener。这里需要注意的是,在同一个session下,这两者不能同时工作,也就是说不能针对不同消息采用不同的接收方式。否则会抛出异常。
周杰伦本人
2022/10/25
8100
activemq之消费者消费解析与高可用策略(三)
activeMQ
activeMQ 是学习java消息队列的实现项目,使用jfinal + jfinal-ext + activeMQ + quartz快速构建。 1.消息队列 消息队列,其实是一种基于数据结构实现的服务。而java语言中的实现,有apache的activeMQ,比较主流。 2.环境搭建 首先去apache的官网下载apache-activeMQ-...-.zip的包,解压后,运行bin中的activeMQ服务。 在浏览器中输入http://localhost:8186/admin,出现登陆界面输入admin
用户1220053
2018/02/09
9330
activeMQ
activemq学习之activemq功能(一)
消息中间件是值利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。 通过提供消息传递和消息排队模型,可以在分布式架构下扩展进程之间的通信。
周杰伦本人
2022/10/25
1.1K0
activemq学习之activemq功能(一)
ActiveMQ入门
Apache ActiveMQ是当前最流行的开源的,支持多协议的,基于Java的消息中间件,官网的原话是:Apache ActiveMQ™ is the most popular open source, multi-protocol, Java-based messaging server.
CodingDiray
2020/04/24
9711
ActiveMQ入门
ActiveMQ学习总结------Spring整合ActiveMQ 04
注:本文将省略一部分与ActiveMQ无关的spring、mvc等代码,学习者需有SSM框架基础
Arebirth
2020/06/19
5690
ActiveMQ学习之java代码调用ActiveMQ队列
queue:在点对点消息传递域中,目的地被称为队列(一对一)
用户5899361
2020/12/07
6910
ActiveMQ学习之java代码调用ActiveMQ队列
深入讲解ActiveMQ5.X消息的持久性
我经常被问到一些基本的关于解释消息存储在ActiveMQ中是如何工作的问题。在这里我将做一个高层面的解释。注意,上下文环境是它是在JMS范围内。如果你使用的是ActiveMQ的非JMS客户端(e.g.,STOMP,AMQP,MQTT,等),那么它的行为在一些案例中会有所不同。 ActiveMQ JMS的持久性保证对于被标记为“持久的”而不能丢失的消息而言是非常强大的. 让我们看下它在ActiveMQ中是如何被运用的. 主题 主题使用了一个广播机制. 它允许我们在JMS领域使用发布订阅语义模型. 但当我们将一
用户1263954
2018/01/30
7690
深入讲解ActiveMQ5.X消息的持久性
高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理
在现代应用系统中,缓存是提高性能和减少数据库负载的重要手段之一。然而,缓存的数据在某些情况下可能会过期或者变得无效,因此需要及时进行清理。在复杂的应用系统中,可能有多个系统、多个模块产生缓存清理需求,而这些系统、模块之间的清理任务需要高效的协作,以避免数据竞争和资源浪费的问题。
修己xj
2023/08/25
1880
高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理
activeMQ 原
ActiveMQ 消费者接收消息两种方式 1.使用同步方式:消费者会一直等待生产者发送消息或者超市。因其是阻塞式接收消息,故当第一次接收生产者发送过来的消息并消费后,第二次生产者提供的消息不再消费。 2.使用异步监听方式:消费者通过注册监听器,每当生产者有新的消息提供过来是会触发MessageListener的回调方法onMessage()方法。便于后续消息处理。 小结:使用同步方式相当于一次性消费,在实际生产环境中不可能采用这种方式,不至于每次推送数据都重启不服务,不符合实际运用场景,推荐使用注册
wuweixiang
2018/08/14
5230
ActiveMQ详解(1)——ActiveMQ简介与入门程序
ActiveMQ是Apache发布的一款功能强大的消息中间件,它基于JMS 1.1 和 J2EE 1.4规范,目前使用十分广泛。
张申傲
2020/09/03
1.2K0
ActiveMQ 入门
1. 下载 ActiveMQ , 到 activemq 官网上下载 Windows 或者 Linux 对应的安装包
北漂的我
2019/05/29
5350
ActiveMQ介绍
1、ActiveMQ服务器工作模型       通过ActiveMQ消息服务交换消息。消息生产者将消息发送至消息服务,消息消费者则从消息服务接收这些消息。这些消息传送操作是使用一组实现 ActiveMQ应用编程接口 (API) 的对象来执行的。       ActiveMQ客户端使用 ConnectionFactory 对象创建一个连接,向消息服务发送消息以及从消息服务接收消息均是通过此连接来进行。Connection 是客户端与消息服务的活动连接。创建连接时,将分配通信资源以及验证客户端。这是一个相当重要
小帅丶
2018/02/08
1.1K0
初识ActiveMQ
①.消息传递方式介绍: Activemq支持两种方式的消息传递:     广播模式:1-n的方式,是一种发布订阅模式,像腾讯新闻那样,只要我们微信关注了腾讯新闻,那么每个人都会收到推送的新闻     队列模式:1-1的方式,只能有一个消费者端消费生产者生产的数据 ②.消息类型介绍:         Activemq提供了两种消息类型:持久化和非持久化:         消息生产者使用持久(persistent)传递模式发送消息的时候,Producer.send() 方法会被阻塞,直到 broker 发送一个
用户1215919
2018/02/27
2.1K0
安装ActiveMQ
接着进入到与系统位数对应的目录下,使用管理员身份运行activemq.bat,就可以直接启动了:
端碗吹水
2020/09/23
7460
安装ActiveMQ
ActiveMQ学习之linux下ActiveMQ环境搭建
https://activemq.apache.org/components/classic/download/
用户5899361
2020/12/07
6180
ActiveMQ学习之linux下ActiveMQ环境搭建
ActiveMQ学习之java代码调用ActiveMQ主题
queue:在点对点消息传递域中,目的地被称为队列(一对一)
用户5899361
2020/12/07
4090
ActiveMQ学习之java代码调用ActiveMQ主题

相似问题

ASIHTTPRequest似乎总是缓存JSON数据

20

芭乐缓存'expireAfterWrite‘似乎并不总是有效

14

ActiveMQ:慢速处理消费者

12

ActiveMQ -平衡消费者人数

11

当我不想让FireFox缓存表单时,它似乎总是缓存它

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文