2017-02-14 28 views
0

サービスを使用してデータを収集するアプリケーションと、サービスからデータを取得してテキストフィールドに書き込むカスタムキーボードの2つのアプリケーションを作成しています選択された。すべてこれはうまく動作している私の唯一の問題は、サービスバインディングです。今では、bindを呼び出すときに、どのアプリからでもサービスが開始されます。それは私が持っていたい行動ではありません。データ収集アプリケーションは、アクティビティを介してサービスを開始/停止する唯一のサービスである必要があります。サービスが実行されている場合、キーボードはバインドされません。私が行う必要があるのは、バインドを呼び出す前にサービスが実行されているかどうかをチェックすることです。とにかくキーボードアプリからのステータスを確認するために私はありますか?サービスの存在を知らせるロックがありますか?私が今見つけたのは、サービスが開始されたクラス名とコンテキストを必要とするメソッドで、それは私のためには機能しません。他のアプリケーションからサービスが実行されているかどうかを確認する

+0

2つのアプリケーションは別ですか?異なるプロセスですか? – yosriz

+0

@yosrizはい、1つはキーボード、もう1つはサービス+コントロールビューです。 – TheBrash

+0

0フラグ(最後のパラメータ)で 'bindService'を呼び出すだけです。サービスが既に起動されている場合は、それが起動されていなければバインディングは起こりません – pskink

答えて

1

は基本的に3つの可能性で終了しました。

方法1:(方法2は良好であるが、私は、イベントと一緒に行ったもの)

public static boolean isServiceRunning(Context queryingContext) { 
    try { 
     ActivityManager manager = (ActivityManager) queryingContext.getSystemService(Context.ACTIVITY_SERVICE); 
     for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
      if ("com.example.myservice".equals(service.service.getClassName())) 
       return true; 
     } 
    } catch (Exception ex) { 
     Toast.makeText(queryingContext, "Error checking service status", Toast.LENGTH_SHORT).show(); 
    } 
    return false; 
} 

方法2:pskink等

フラグ0のみ問題ととともに使用bindService上記で示唆これはメソッドが接続されているかどうかにかかわらず常にtrueを返します。何が起こったのかを知る別の方法を見つける必要があります(失敗した場合はサービスハンドルを受け取りません)

方法3:

他のアプリケーションは、サービスの状態を確認し、知っているステータスフラグを停止するyosriz使用SharedPreferenceによって提案されました。

0

サービスは既に開始されているかどうか確認できません。Androidサービスは複数のクライアントを処理するように設計されています。

これを明示的に開始するか、存在しない場合は新しいものを作成するbind()とのバインドサービス接続を作成することができます。

しかし、この機能をさまざまな方法で実現することができます。たとえば、サービスが「実行中」の状態をいくつかの共有設定で保存し、サービスにバインドする前にチェックします。 (SharedPreferenceは同じユーザーIDの2つのプロセス間で共有できます)

関連する問題