2

大家好我已经在我的5个应用中实现了GCM我仍然对GCM在后台运行的应用程序行为有疑问,可能对应用程序的前景和后台运行风格有点困惑。当我们的应用程序安装并注册了设备ID后,我在应用程序中的“已下载”部分下方列出了我的应用程序,然后按下后退键。他们不会在“Running”部分下列出。当有消息(通知)时,他们来到“正在运行”部分,当通知生成并显示在通知栏中时,他们将从“正在运行”中清除。然而,如果我点击“下载”部分,我看到一个“强制停止”按钮被激活(我认为这对大多数应用程序来说)意味着正在运行。 我的问题是,如果我在我的应用程序中使用GCM,我的应用程序正在运行并占用手机资源,而没有任何活动打开? 是否有一个服务在后台运行,如果是的话,他们为什么没有在“Running”中列出所有其他应用程序?GCM是否在后台运行

+0

您的应用程序没有运行谷歌...播放服务正在运行,它只是广播意向,如果你的应用是否符合意图过滤 – Selvin

+0

好吧,那么为什么它显示“强制停止”当我在“下载”部分点击我的应用程序在应用程序管理器中设置? – Saty

+0

,因为您的应用程序recive广播后它必须运行一些代码...和android系统不会杀死应用程序进程,直到它真的需要 – Selvin

回答

3

强制停止应用程序并不意味着它在您强制停止它之前正在运行。这只是一种让用户告诉Android他们不希望应用程序再次启动的方式,直到用户再次手动启动它。

如果您强制停止应用程序,它将无法接收GCM消息,直到用户再次手动启动它为止,因为GCM后台服务将无法自动启动它。

这种行为是在安卓3.1引入了Launch Controls

启动控制上停止应用

在Android 3.1开始,系统的软件包管理器保持的是处于停止状态的应用程序跟踪并提供了从后台进程和其他应用程序控制其启动的手段。

请注意,应用程序的停止状态与活动的停止状态不同。系统分别管理这两个停止状态。

该平台定义了两个新的intent标志,让发件人指定是否允许Intent激活已停止的应用程序中的组件。

FLAG_INCLUDE_STOPPED_PACKAGES - 包括在解决对潜在目标名单停止应用程序的意图过滤器。

FLAG_EXCLUDE_STOPPED_PACKAGES - 排除从潜在目标名单>停止应用程序的意图过滤器。

当这些标志没有或两者的意图被定义,默认的行为是包括在潜在目标名单停止应用程序的过滤器。

注意,系统将FLAG_EXCLUDE_STOPPED_PACKAGES到所有的广播意图。它可以防止来自后台服务的广播无意或不必要地启动停止的应用程序组件。后台服务或应用程序可以通过添加FLAG_INCLUDE_STOPPED_PACKAGES标志来覆盖应该允许激活停止的应用程序的广播意图来覆盖此行为。

应用程序在首次安装但尚未启动以及用户手动停止时(在“管理应用程序”中)处于停止状态。

GCM在后台运行的进程,但它是服务于设备上的所有applkication,所以在安装使用GCM对运行后台进程的数量并没有影响其他应用程式的过程。

1

它就像询问呼叫应用程序或消息应用程序是否总是继续运行,等待电话或短信。那么,有一些名为BroadCastReceivers的Android框架组件。操作系统在收到呼叫,收到消息,检测到低电量时,发出警报并且即使收到通知时也会发送意图消息。

然后我们有各种应用程序被注册接收一些操作系统触发的广播消息。这是在应用程序Manifest(通常)中完成的。因此,如果您的应用注册为接收广播消息,GCM消息,您的应用将收到它。

只需在您的Manifest中删除GCM的广播接收器即可。您的应用将不再响应GCM。接下来应用程序如何区分单个设备上的多个GCM接收器? 我的意思是如何区分通知GCM是用于应用A还是应用B?

这与您在GCM中注册的APP_ID有关。这可以映射到您的应用程序包名称。我们在注册GCM时提供软件包名称

+0

对不起在中断之间我不想解释有关广播接收器,我知道,我是什么想知道为什么包括我的应用程序在内的几乎所有应用程序在很久之前离开它们时都有一个“强制停止”按钮,并且它们也未在“正在运行”中列出。这是否意味着所有应用程序都有背景? – Saty

+0

以开放的心态阅读答案。我认为这会清除你的疑问,或者提供更多的意见来澄清你的观点! :) –