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

SoH*_*SoH 30 service multithreading android 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>
Run Code Online (Sandbox Code Playgroud)

我在MainActivity中启动服务,所以当我杀死应用程序时,服务也会关闭.任何人都可以告诉我如何将服务作为一个不同的过程启动.

ada*_*000 34

查看in 的process属性.您需要更改您的值以开始.serviceAndroidManifest.xmlandroid:process:

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

相关部分:

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

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


定义服务流程

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

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

<service
  android:name="com.example.appName"
  android:process=":externalProcess" />
Run Code Online (Sandbox Code Playgroud)

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

  • @ TheRealChx101,您不能在其他过程中直接绑定到服务。您将需要定义一个Android界面(AIDL)。看到这个答案:/sf/answers/2976042541/ (2认同)
  • 在不同的进程中运行有什么用?在这种情况下,当原始应用程序被杀死时,它也会被杀死。 (2认同)

Ami*_*mir 23

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

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

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