关于多线程:在单独的进程android中启动服务 您所在的位置:网站首页 运行启动服务命令 关于多线程:在单独的进程android中启动服务

关于多线程:在单独的进程android中启动服务

2023-03-23 16:59| 来源: 网络整理| 查看: 265

我想在一个单独的进程中启动服务(即当我在设置中转到我的应用程序管理器,然后转到正在运行的服务时,它应该在一个单独的进程中显示我的服务)。

我的Android清单如下:

123456789101112131415161718                                                    

我正在MainActivity中启动该服务,因此很明显,当我终止该应用程序时,该服务也会关闭。谁能告诉我如何以不同的方式启动服务。

相关讨论 您可能会发现使用adb shell ps命令或DDMS进程列表测试结果更为精确,因为该设置菜单显示似乎有些奇怪的"用户友好翻译"。

在AndroidManifest.xml中签出Service的process属性。您需要更改以:开头的android:process值。

http://developer.android.com/guide/topics/manifest/service-element.html

相关部分:

If the name assigned to this attribute begins with a colon (':'), a new process, private to the application, is created when it's needed and the service runs in that process. If the process name begins with a lowercase character, the service will run in a global process of that name, provided that it has permission to do so. This allows components in different applications to share a process, reducing resource usage.

提供的另一个答案并没有真正回答如何在单独的进程中启动服务的问题。

定义服务流程

android:process字段定义服务将在其中运行的进程的名称。通常,应用程序的所有组件都在为该应用程序创建的默认进程中运行。但是,组件可以使用其自己的进程属性覆盖默认值,从而使您可以将应用程序分布在多个进程中。

如果分配给此属性的名称以冒号(':')开头,则该服务将在其自己的单独进程中运行。

123

如果进程名称以小写字母开头,则该服务将在具有该名称的全局进程中运行,前提是它具有这样做的权限。这允许不同应用程序中的组件共享一个进程,从而减少资源使用。

相关讨论 当我尝试使用此方法绑定到服务时出现错误。 @ TheRealChx101,您不能在其他进程中直接绑定到服务。您将需要定义一个Android界面(AIDL)。看到这个答案:stackoverflow.com/a/42514893/4730000 在不同的进程中运行有什么用?在这种情况下,当原始应用程序被杀死时,它也将被杀死。 如果我在另一个过程中提供AIDL服务,是否必须调用它:remote或可以使用我想要的任何名称? android:process =":remote",这是常见的方法,所以我们知道它的远程名称,但可以是任何名称,对吗?

在单独的进程上运行不会解决您的问题。我遇到了同样的问题,这是Android的正常现象。启动Service(不是前景Service)时,即使它处于单独的进程中,操作系统也可以随时将其杀死。在您的情况下,如果关闭Activity /杀死Application,则OS通常会关闭服务,即使它们位于单独的进程中也是如此。您有两个选择:

1-作为前台Service启动服务。在这种情况下,由于几乎所有情况,Service都不会关闭。请注意,前台服务是为特定应用程序设计的,通知中心和状态栏将显示粘性通知。

2-将您的服务作为启动服务(而不是IntentService)。然后在服务的onStartCommand上,返回START_STICKY。这将告诉操作系统,是否由于某种原因需要关闭Service,并且在有足够资源的情况下再次运行它。在您的情况下,当用户关闭Activity / kill Application时,无论如何Service进程都会被终止,但是通常会重新打开。

相关讨论 如果要安装音乐播放器,该怎么用?我正在使用Service,但是即使我开始使用startForeground(),当我打开一些繁重的应用程序时,该服务也已关闭 将您的服务作为前台服务启动。 (developer.android.com/guide/components/services.html#Foregr??ound) @Amir如果我在另一个进程中创建服务但USER终止了该应用程序(清除了活动堆栈),该服务仍将运行吗?由于USER已终止,而不是OS,因此我想知道是否存在差异,并且如果用户取消了该应用程序而不是OS,该服务是否可以继续? @ j2emanue,首先,在android中,当您创建一个新进程时,它将是主应用程序进程内的一个子进程。它不是像其他操作系统那样独立的过程。其次,没有区别,当应用程序被用户或操作系统杀死时,所有子进程都将被杀死,然后,如果情况如上述答案所述,则可以重新启动 该进程具有其自己的进程ID。在android中,没有子流程的概念。如果您声明" android:process"标记,则只要两个应用程序都使用相同的证书签名,它将与现有(如果有)进程共享该进程。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有