【问题标题】:Start a service in a separate process android在单独的进程android中启动服务
【发布时间】:2014-04-26 04:48:30
【问题描述】:

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

我的 Android 清单如下:

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="com.example.timerapp.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <service android:name="com.example.timerapp.WorkerThread"
        android:process="com.moizali"></service>
</application>

我在 MainActivity 中启动服务,所以很明显,当我终止应用程序时,服务也会关闭。谁能告诉我如何将服务作为不同的进程启动。

【问题讨论】:

  • 您可能会发现使用 adb shell ps 命令或 DDMS 进程列表测试结果更精确,因为设置菜单显示似乎有一些奇怪的“用户友好翻译”。跨度>

标签: android multithreading service process


【解决方案1】:

查看AndroidManifest.xmlserviceprocess 属性。您需要将您的 android:process 值更改为以 : 开头。

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

相关部分:

如果分配给此属性的名称以冒号 (':') 开头,则在需要时会创建一个专用于应用程序的新进程,并且服务会在该进程中运行。如果进程名称以小写字符开头,则服务将在该名称的全局进程中运行,前提是它有权这样做。这允许不同应用程序中的组件共享一个进程,从而减少资源使用。

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


定义服务流程

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

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

<service
  android:name="com.example.appName"
  android:process=":externalProcess" />

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

【讨论】:

  • 当我尝试使用此方法绑定到服务时出现错误。
  • @TheRealChx101 您不能直接绑定到不同进程中的服务。您将需要定义一个 Android 接口 (AIDL)。看到这个答案:stackoverflow.com/a/42514893/4730000
  • 不同进程运行有什么用?在这种情况下,当原始应用程序被杀死时,它也会被杀死。
  • 如果我在另一个进程中创建 AIDL 服务,它必须调用:remote 还是我可以使用我想要的任何名称? android:process=":remote",这只是常见的方式,所以我们知道它的远程但它可以是任何名称吗?
  • 我不太了解 manifest - 在 android:name=" com.example.appName" 的地方写什么好,因为它说我必须添加我的应用程序的名称,即package="com.example.doghowlapp" 但是当我写 doghowlapp 时它不起作用
【解决方案2】:

在单独的进程上运行不会解决您的问题。我有同样的问题,这是 Android 的正常行为。当您启动Service(不是前台Service)时,即使它位于单独的进程中,操作系统也可以随时杀死它。在您的情况下,如果您关闭 Activity(s)/kill Application,操作系统通常会关闭服务,即使它们位于不同的进程中。你有两个选择:

1- 以Foreground Service 身份启动您的服务。在这种情况下,Service 几乎不会因为任何情况而关闭。请注意,前台服务是为特定应用程序设计的,您将在通知中心和状态栏中有一个粘性通知。

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

【讨论】:

  • 如果我正在实现音乐播放器,该使用什么?我正在使用服务,但即使我开始使用 startForeground(),当我打开一些繁重的应用程序时它也会关闭
  • 将您的服务作为前台服务启动。 (developer.android.com/guide/components/services.html#Foreground)
  • @Amir 如果我在另一个进程中创建服务但 USER 终止了应用程序(清除活动堆栈),该服务还会运行吗?由于用户终止而不是操作系统,我想知道是否有区别,如果用户杀死应用程序而不是操作系统,服务是否可以继续?
  • @j2emanue,首先,在android中,当您创建一个新进程时,它将是主应用程序进程中的一个子进程。它不像其他操作系统那样是一个单独的进程。其次,没有区别,当app被用户或操作系统杀死时,所有子进程都会被杀死,然后如果情况按照上面的答案,它可以重新启动
  • 进程获取自己的进程ID。在android中没有子进程的概念。如果您声明“android:process”标签,那么它将与现有(如果有)进程共享该进程,前提是两个应用程序都使用相同的证书进行签名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多