2017-03-01 11 views
0

まず、バックグラウンドで作業する必要のあるアプリケーションを作成します(ユーザーがアプリケーションを終了した場合でも)。私はブルートゥースサーバー(ラズベリーパイ)を持っていて、私のアプリはそのサーバーのクライアントのように行動するはずです。接続が確立されたら、私はそれを生かしておく必要があります。ユーザーがあまりにも多くのpromサーバーまたはサーバーから特定の切断コマンドを送信した場合にのみ切断する必要があります。だから私は単にBluetoothChatExampleを見つけ、サービスからすべてのコードをサービスに入れました(ユーザーがアプリケーションを殺しても、私のサービスは私の主な活動とは独立していなくてもコミュニケーションが必要なので)。あなたは私がSTART_STICKYとして私のサービスを始めたが、ここで私は、「最近使用したアプリ」リストからアプリケーションを殺していたときに問題だ見ることができるようにここでアクティビティの破棄後にAndroidサービスが再作成される

は私のサービスからのいくつかのコードスニペットだから

public class BluetoothCommunicationService extends Service { 
    public BluetoothCommunicationService() { 

    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

    //.... 
    //.... 
    //.... 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if(intent.getAction.equals("stop") { 
      stopSelf(); 
     } 
     return START_STICKY; 
    } 

private class AcceptThread extends Thread { 
      //.... 
} 

private class ConnectThread extends Thread { 
    //.... 
} 

private class ConnectedThread extends Thread { 
    //.... 
} 

@Override 
    public void onDestroy() { 
     super.onDestroy(); 

} 

} です私もサービスを殺しています(onDestroy()が呼び出されていなくても!!!)、もう一度onCreateが呼び出され、サービスは最初から開始されます。しかし、ブルートゥース通信はソケットに基づいているため、再作成され、接続が失われます。私も試みたSTART_NOT_STICKYしかし、私のアプリケーションを閉じるとすぐに私のサービスは破壊され、決して再作成されません。ユーザーが自分のアプリを閉じた後でもサービスを生きたままにして(それを再作成しないように)できますか?

答えて

1

まず、私がバックグラウンドで作業している必要があるアプリケーションを作成しています(ユーザーがアプリケーションを終了したとしても)。

あなたがシステムアプリでない限りそうではありません。 Androidのアプリモデルは非常に明確です。アプリは正当な理由で、アプリが連続して動作するよう強制できません。あなたの携帯電話に多数のアプリがそうすることにしたならどうしますか?モバイルデバイスはデスクトップコンピュータではありません。彼らは電池を持っており、バックグラウンドで連続的に回転しているプロセスでは妥当な電池寿命を達成できません。妥当なバッテリー寿命を得るために、Androidは何も起こっていないときにCPUをスリープ状態にすることができるということに依存しています。

さらに、ユーザーがあなたのアクティビティをスワイプした場合、そのアプリは非アクティブな状態になります。これは、ブロードキャスト(アラームマネージャウェイクアップを含む)を受信できないことを意味し、ランチャーからアクティビティを開始するユーザー、アクティビティの1つを開始する別のアプリ、またはアプリ内のサービスを開始する別のアプリによってのみ再開できます。これは新しくインストールされたアプリにも当てはまります。明示的に使用するまでは実行できません。

システム以外のアプリの場合、できることはstartForeground() + START_STICKYです。これはあなたのサービスが重要であり、殺されるべきではないというAndroidへの最も強い指標です。

システムアプリケーションは、マニフェストで永続的に宣言することができ、プロセスは決して殺されません。 Android distをビルドして、それを自分で点滅させない限り、これはオプションではありません。

1

サービスが強制終了されないことを保証することはできません。それはある時点で終了することができ、終了すると、すべてのアプリを閉じるとサービスが破棄されます。 START_STICKYから得られる唯一の利点は、後でサービスを再開しようとすることです。

1

これは設計通りです。最近のアプリでアプリをスワイプすると、アプリケーション全体が強制終了されます。これには、バックグラウンドサービスが含まれます。

0

はい、サービスを有効にすることは可能です。

<service android:name=".BluetoothCommunicationService" 
      android:process=":nameNewProcessThatYourServiceWillUseHere"/> 

サービスは、最初のアプリプロセスよりも独立したプロセスで動作します。

+0

サービスを別のプロセスで実行しても、サービスをシャットダウンするかプロセスを終了するかのAndroidの決定には影響しません。 –

+0

はい、アプリのプロセスを終了してサービスを稼働させたい場合は、別のプロセスを作成する必要があります。アプリを殺すプロセスとアプリケーションのみが、サービスのプロセスに影響を与えません。私が理解する限り、彼らは独立して働き、それはDavidが求めていたものです。 –

+0

ユーザーが手作業でプロセスを強制終了することについて話していただけの場合、その答えは「しないでください」となります。 –

0

サービスは、以前に開始されているかSTART_STICKYまたはSTART_REDELIVER_INTENTで返され、マニフェストで宣言されていればしばらくすると再起動する必要があります。 Androidはその時間を決定し、それをモニターコンソールに記録します。あなたは、Android Studioでこのメッセージを見たい場合は

Scheduling restart of crashed service com.company.app/MyService in 1000ms 

ああ、あなたは冗長とフィルタなしにAndroidのモニターlogcatを設定してください:それはのようなものを言います。最初に、あなたのサービスが実行されていることを確認し、

Android Studio logcat

そして再び:あなたのサービスのクラス名によるフィルタリングもそうのように、役立ちます。マニフェストで宣言しなければ、それは開始しません。

+0

"あなたのサービスは再起動するべきです" - まさにそうすべきですが、通常はそうなりますが、Androidはそれを保証せず、これを永続的に実行するのに役立ちません。 –

+0

さて、あなたは本当に他のチャンスを持っていないので、あなたのアプリが閉じられたときに何かを実行し続けるのが最善です。 –

+0

実際にあなたができる最高のものではありません。私の記事を見て、アンドロイドのドキュメントを参照してください。 –

関連する問題