2016-01-30 2 views
2

У меня есть приложение, которое создает бесконечное фоновое обслуживание. Служба запускается при запуске приложения. Когда приложение убито (например, пользователем), служба отправляет запрос на широковещание, который перезапустит его после его уничтожения. Вопрос: когда я перезапускаю приложение, как узнать, работает ли служба уже запущена? Наивно я думал, что, перезапустив службу при повторном запуске приложения, она остановила бы существующую службу, но этого не произойдет. Следующий код показывает, что если я это сделаю, одновременно будут работать две службы (распечатка в таймере перемещается с каждой секунды до каждой половины секунды). Большое спасибоAndroid: Как обнаружить фоновый сервис при перезапуске приложения?

public class MainActivity extends AppCompatActivity { 
     static Intent mServiceIntent; 
     private SensorService mSensorService; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      ctx=this; 
      setContentView(R.layout.activity_main); 
      mSensorService= new SensorService(getCtx()); 
      mServiceIntent = new Intent(getCtx(), mSensorService.getClass()); 
      startService(mServiceIntent); 
     } 

     Context ctx; 

     public Context getCtx() { 
      return ctx; 
     } 



     @Override 
     protected void onDestroy() { 
      stopService(mServiceIntent); 
      Log.i("MAINACT", "onDestroy!"); 
      super.onDestroy(); 

     } 
    } 

public class SensorService extends Service { 

    public int counter=0; 

    public SensorService(Context applicationContext) { 
     super(); 
     Log.i("HERE", "here I am!"); 

    } 

    public SensorService() { 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     startTimer(); 
     return START_STICKY; 
    } 


    private Timer timer; 
    private TimerTask timerTask; 

    long oldTime=0; 

    public void startTimer() { 
     //set a new Timer 
     timer = new Timer(); 

     //initialize the TimerTask's job 
     initializeTimerTask(); 

     //schedule the timer, to check if the service is there in 25s 
     timer.schedule(timerTask, 1000, 1000); // 
    } 

    /** 
    * it sets the timer to check in x seconds if the sensorsService is active. If not it will start the service 
    */ 
    public void initializeTimerTask() { 
     timerTask = new TimerTask() { 
      public void run() { 
       long time= System.currentTimeMillis(); 
       Log.i("in timer", "in timer ++ "+(time-oldTime)+" ++ "+ (counter++)); 
       oldTime= time; 
      } 
     }; 
    } 

    /** 
    * not needed 
    */ 
    public void stoptimertask() { 
     //stop the timer, if it's not already null 
     if (timer != null) { 
      timer.cancel(); 
      timer = null; 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.i("EXIT", "ondestroy!"); 
     Intent broadcastIntent = new Intent("uk.ac.shef.oak.ActivityRecognition.RestartSensor"); 
     sendBroadcast(broadcastIntent); 
     stoptimertask(); 
    } 

     @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

public class SensorRestarterBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.i(SensorRestarterBroadcastReceiver.class.getSimpleName(), "Service Stops! Oooooooooooooppppssssss!!!!"); 

     context.startService(new Intent(context, SensorService.class));; 
    } 

} 
+1

Проверьте этот ответ на этот вопрос http://stackoverflow.com/questions/600207/how-to -check-if-a-service-is-running-on-android/5921190 # 5921190 –

+0

Спасибо, Джордж, это действительно правильно. Спасибо, что указал мне в правильном направлении! – FabioC

+0

, если вы напишете официального андерсера, я приму его – FabioC

ответ

3
private boolean isMyServiceRunning(Class<?> serviceClass) { 
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (serviceClass.getName().equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
} 

, а затем использовать

isMyServiceRunning(MyService.class) 

Credit

+1

Большое спасибо Джордж. Я изменил приведенный выше код и дал полное объяснение. Все доступно в [моем личном блоге] (http://fabcirablog.weebly.com/) – FabioC

Смежные вопросы