2010-12-14 42 views
18

Androidサービスが動作しているかどうかを確認するにはどうすればよいでしょうか?私はActivityManager APIを知っていますが、私のようなシナリオ(source)ではAPIの使用は推奨されていないようです。また、グローバル/永続変数を使用してサービスの状態を維持する可能性についても認識しています。Android:経由でサービスが実行されているかどうかを確認してください。 bindService

私は0に設定フラグをbindServiceを使用しようとしましたが、私は(唯一の例外は、私は地元のサービスとbindServiceをしようとしていた、あった)ソースリンク上の人と同じ問題を得ました。

次の呼び出し

getApplicationContext().bindService(new Intent(getApplicationContext(), 
     MyService.class), mServiceConnection, 0); 

は常にtrueを返しますが、接続されません。これは期待される行動ですか?私にはbindServiceが、サービスがまだ実行されていない(それがチェックされていない)場合、またはBIND_AUTO_CREATEフラグがセットされていない場合(再び、そうではありません)、falseを返すようです。

答えて

10

私は同じ問題があります。最もよく知られている解決策は、WhateverServiceにpublic static booleanを作成し、onCreate(またはonStartCommand、あなたの選択)中にtrueに設定し、onDestroy中にfalseに設定することです。同じapk内の他のクラスからアクセスできます。しかしこれは競争力があるかもしれない。 http://groups.google.com/group/android-developers/browse_thread/thread/8c4bd731681b8331/bf3ae8ef79cad75dを参照してください

競合状態は、OSが(別のプロセスで)いつでもリモートサービスを強制終了する可能性があると考えられます。上記のように、ローカルサービス(同じプロセス)をチェックすることは、私にはレースフリーではないようです.OSがサービスを殺すと、ステータスをチェックしたものはすべて殺します。

0

サービスが実行中/実行中でない場合、何をする予定ですか?なぜstartService()に電話をかけてください。それは実行されていない場合はそれを作成し、そうであればonStart()メソッドを呼び出します。

+1

を使用してそれを行って、私の場合には、あなたのサービス のインスタンスを使用してそれを確認することができます「サービスが実行中です」または「サービスが実行されていません」というメッセージを印刷するようにします。そのため、サービスが稼動しているかどうかに関わらず、情報を入手する必要があります。私はstartServiceを呼び出すことでそれを行うことはできません。 – Igor

+0

しかし、なぜこのメッセージを印刷する必要がありますか?サービスが実行されていない場合に行うことができるのは2つのみです。起動するかしないか。 – Falmarri

+1

サービスが実行されているかどうかをユーザーに通知したいからです。ユーザーはサービスを手動で開始し、停止する必要があります(ボタンを押すなど)。ユーザーがアクティビティを閉じると(BACKボタン)、サービスは実行されたままになります。アクティビティは、次回にユーザーがサービスを開始したときに、サービスがすでに実行されていることを認識する必要があります。 – Igor

1

私は同じ必要性があり、既にバインドされた.bindServiceを実行するとエラーが発生することが判明しました。私はこれを実行する前に正しく実行しました.bindService

try{ 
    context.unbindService(fetch_connection); 
} catch (IllegalArgumentException e){ 
    System.out.println("Unbinding didn't work. little surprise"); 
} 
+0

これは、サービスにバインドされているかどうかを確認するだけです。開始されたかどうかは関係ありません。 – Falmarri

11

はフラグを実行しているサービスを保存するために、共有プリファレンスを使用してください。

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    int res = super.onStartCommand(intent, flags, startId); 
    setRunning(true); 
    return res; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    setRunning(false); 
} 

private void setRunning(boolean running) { 
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    SharedPreferences.Editor editor = pref.edit(); 

    editor.putBoolean(PREF_IS_RUNNING, running); 
    editor.apply(); 
} 

public static boolean isRunning(Context ctx) { 
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx.getApplicationContext()); 
    return pref.getBoolean(PREF_IS_RUNNING, false); 
} 
+4

これは良い考えではありません。SharedPreferencesは不揮発性ストレージに保存されています。何らかの理由でデバイスがクラッシュしたり電源が切れた場合、 'onDestroy'は呼び出されず、次に起動するとアプリケーションはサービスが動作していると思いますそうではないにもかかわらず。 – satur9nine

+0

はい、同意します。 SharedPreferencesはそのためのものではありません。しかし、prefを実行しているサービスは、アプリの起動時に削除することができます。別の方法:bool varを実行しているサービスをApplicationオブジェクトに格納する。 –

+0

onDestroyは常に – Nepster

2

別の方法:あなたの活動の

public static boolean isServiceRunning(Context ctx, String serviceClassName) { 
    ActivityManager manager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (TrackingService.class.getName().equals(serviceClassName)) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

上記のコードを使用すると、サービスを実行しているシステムのみの情報が表示されます。私は作成したサービスを含め、すべてのサービスを探しています – user1810931

0

Uは単に私がのは、私はだろうと言ってみましょう

button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      Intent intent=new Intent(MainActivity.this, MyService.class); 
      //startService(intent); 
      bindService(intent,serviceConnection,BIND_AUTO_CREATE); 
      if (myService!=null) 
      { 
       myService.RecData(editText.getText().toString()); 
      } 
     } 
    }); 
} 

ServiceConnection serviceConnection=new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) { 
     Toast.makeText(MainActivity.this,"onServiceConnected called",Toast.LENGTH_SHORT).show(); 
     MyService.MyBinder myBinder= (MyService.MyBinder) iBinder; 
     myService= myBinder.getServiceInstant(); 
     myService.SetActivity(MainActivity.this); 
     myService.RecData(editText.getText().toString()); 
    } 
関連する問題