2012-03-16 6 views
4

アプリケーションが停止しても実行され続けるサービスをどのように作成しますか?Android:アプリケーション停止時に実行されるサービスを作成する

<service 
    android:name="com.example.myservice" 
    android:process=":remoteservice" /> 

私もサービスのonStartCommandでSTART_STICKYを返しています:

@Override 
public in onStartCommand(Intent intent, int flags, int startId){ 
    return Service.START_STICKY; 
} 
+0

私は同じ問題があります。 ソリューションを見つけましたか? – Mixer

答えて

4

私はandroid:process属性を使用しません。これは実際にサービスを別のプロセスで実行し、共有設定のようなことをするのを困難にします。あなたのアプリケーションが死んだときにあなたのサービスが死ぬことを心配する必要はありません。サービスは続行します(つまり、サービスのポイントです)。バインディングサービスが必要ないのは、バインディングが開始され、バインディングが終了したときに終了するためです。ことでは、言った:

<service 
    android:enabled="true" 
    android:exported="true" 
    android:name=".MyService" 
    android:label="@string/my_service_label" 
    android:description="@string/my_service_description" 
    <intent-filter> 
     <action android:name="com.package.name.START_SERVICE" /> 
    </intent-filter> 
</service> 

あなたは(システムによって起動することはできません - アクティビティなければならない)サービスを開始する意図のために、独自のアクションを定義することができます。私はシステムが私のサービスをインスタンス化することができるように "有効"を設定し、他のアプリケーションがインテントを送信して自分のサービスとやりとりできるように "エクスポート"することが好きです。この詳細についてはhereをご覧ください。

<action android:name="com.package.name.IRemoteConnection" /> 

あなたの活動からサービスを開始するには:

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Intent serviceIntent = new Intent("com.package.name.START_SERVICE"); 
     this.startService(serviceIntent); 

     // You can finish your activity here or keep going... 
    } 
} 

また、あなたがこれを行う場合だけのようなバインダーに追加して、意図、バインディングを使用して、長時間実行されるサービスを行うことができますサービスのための今

public class MyService extends Service { 

    @Override 
    public IBinder onBind(Intent intent) { 
     // This is triggered by the binder action intent. 
     // You can return your binder here if you want... 
     return null; 
    } 


    @Override 
    public void onCreate() { 
     // Called when your service is first created. 
    } 

    @Override 
    public in onStartCommand(Intent intent, int flags, int startId) { 
     // This is triggered by the service action start intent 
     return super.onStartCommand(intent, flags, startId); 
    } 
} 

今、あなたのサービスを実行する必要があります。長寿を助けるためにいくつかのトリックがあります。フォアグラウンドサービスとして実行するようにします(サービスでこれを行います)。これによりステータスバーにスティッキーな通知アイコンが作成されます。また、あなたのアプリケーションをAndroidによって殺される可能性が低くなるようにHEAPのライトを保持してください。

また、DVMを終了するとサービスが停止するため、[設定] - > [アプリケーション]に移動してアプリケーションを停止すると、DVMが強制終了され、サービスが強制終了されます。あなたのアプリケーションが設定で実行されているのを見るだけで、アクティビティが実行中であることを意味するものではありません。アクティビティとサービスはライフサイクルが異なりますが、DVMを共有できます。必要がなければあなたの活動を殺す必要はなく、単にAndroidにそれを処理させるように心がけてください。

これが役に立ちます。

+0

私のアプリケーションが死んだときに私のサービスが死ぬことを100%確信しています。私のアプリケーションが実行されているときは、設定 - >アプリケーション - >実行中のサービスの下にあります。私が私のアプリケーションを殺すと、サービスはもはやそこにはありません。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+0

フォアグラウンドサービスとして実行し、アプリケーションコンテキストではなくシステムコンテキストでサービスがインスタンス化されるようにenabled属性を設定してみてください。 – jjNford

+0

私はtrueに設定してフォアグラウンドサービスにしましたが、問題はアプリケーションのコンテキストで開始していると思います。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

-8

スタート次のコードを使用してサービス:

startService(new Intent(this, YourServiceClass.class)); 
を私はマニフェストファイルに別のプロセスでサービスを作成しています

ActivitieのonStop()またはどこでも好きな場所で実行してください!

+1

私はサービスを開始する方法を知っています。私はそれをアプリケーションのライフサイクルの外で実行し続けることを目指しています。アクティビティのonStop()でそれを呼び出すことは何もしません。アプリケーションが終了すると、サービスは強制終了されます。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

関連する問題