web-dev-qa-db-ja.com

別のプロセスでサービスを開始するandroid

別のプロセスでサービスを開始したい(つまり、設定でアプリケーションマネージャーに移動してからサービスを実行すると、別のプロセスでサービスが表示されます)。

My 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でサービスを開始しているので、明らかにアプリケーションを強制終了すると、サービスもシャットダウンします。別のプロセスとしてサービスを開始する方法を教えてください。

28
SoH

AndroidManifest.xmlprocessservice属性を確認してください。 Android:processで始まるように:値を変更する必要があります。

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

関連セクション:

この属性に割り当てられた名前がコロン(「:」)で始まる場合、アプリケーション専用の新しいプロセスが必要に応じて作成され、そのプロセスでサービスが実行されます。プロセス名が小文字で始まる場合、サービスはその名前のグローバルプロセスで実行されますが、許可されている場合に限ります。これにより、さまざまなアプリケーションのコンポーネントがプロセスを共有できるようになり、リソースの使用量が削減されます。

提供される他の答えは、別のプロセスでサービスを開始する方法の質問には実際には答えません。


サービスのプロセスを定義する

Android:processフィールドは、サービスを実行するプロセスの名前を定義します。通常、アプリケーションのすべてのコンポーネントは、そのアプリケーション用に作成されたデフォルトプロセスで実行されます。ただし、コンポーネントは独自のプロセス属性でデフォルトをオーバーライドできるため、アプリケーションを複数のプロセスに分散させることができます。

この属性に割り当てられた名前がコロン(「:」)で始まる場合、サービスは独自の個別のプロセスで実行されます。

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

プロセス名が小文字で始まる場合、サービスはその名前のグローバルプロセスで実行されますが、許可されている場合に限ります。これにより、さまざまなアプリケーションのコンポーネントがプロセスを共有できるようになり、リソースの使用量が削減されます。

33
adao7000

別のプロセスで実行しても問題は解決しません。同じ問題が発生しましたが、これはAndroidの通常の動作です。 Service(フォアグラウンドServiceではなく)を起動すると、たとえ別のプロセスにある場合でも、OSはいつでもそれを強制終了できます。あなたの場合、Activity(s)を閉じる/ Applicationを殺すと、OSは通常、それらが別々のプロセスにある場合でもサービスを閉じます。次の2つのオプションがあります。

1- Foreground Service としてサービスを開始します。この場合、Serviceはほとんどすべての条件により閉じられません。フォアグラウンドサービスは特定のアプリケーション向けに設計されており、通知センターとステータスバーにスティッキー通知が表示されることに注意してください。

2-サービスを開始サービス(IntentServiceではなく)として作成します。次に、サービスのonStartCommandで、START_STICKY。何らかの理由でServiceを閉じる必要がある場合、十分なリソースがあるときにもう一度実行する必要がある場合、OSに通知します。あなたの場合、ユーザーがActivity/killを閉じたときにApplicationがとにかくServiceプロセスは強制終了されますが、通常は再び開きます。

23
Amir