在单独的进程android中启动服务

时间:2014-03-19 18:00:32

标签: android multithreading service process

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

我的Android Manifest如下:

<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中启动服务,所以很明显当我杀死应用程序时服务也会关闭。任何人都可以告诉我如何将服务作为一个不同的过程启动。

2 个答案:

答案 0 :(得分:32)

process中查看service的{​​{1}}属性。您需要将AndroidManifest.xml值更改为以android:process开头。

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

相关部分:

  

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

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

定义服务流程

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

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

android:process

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

答案 1 :(得分:21)

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

1-以Foreground Service开始您的服务。在这种情况下,由于几乎任何条件,Service都不会关闭。请注意,前台服务是为特定应用程序设计的,您将在通知中心和状态栏中显示粘性通知。

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