Stop service in an activity

寵の児 提交于 2019-12-02 04:41:28

问题


I'm using following code to stop my service

Intent intent = new Intent(MainActivity.this, UsageRecorderService.class);
stopService(intent);

And this is my service that works indefinitely

public class UsageRecorderService extends IntentService {

  public UsageRecorderService() {
      super("UsageRecorder");
  }

  @Override
  protected void onHandleIntent(Intent intent) {

      while (true) {

          UsageRecorder.recordUsages(this, false);

          SystemClock.sleep(10000);
      }
   }
}

Why does not stop my service?


回答1:


This code would work

public class UsageRecorderService extends IntentService {

    private boolean mStop = false;

    public UsageRecorderService() {
        super("UsageRecorder");
    }

    public final Object sLock = new Object();

    public void onDestroy() {
        synchronized (sLock) {
            mStop = true;
        }
    }


    @Override
    protected void onHandleIntent(Intent intent) {
        while (true) {
            synchronized (sLock) {
                if (mStop) break;
            }
            UsageRecorder.recordUsages(this, false);
            SystemClock.sleep(10000);
        }
    }

}

You can use stopService

Intent intent = new Intent(MainActivity.this, UsageRecorderService.class);
stopService(intent);

Also I recommend to read Services guide to understand what is going there.




回答2:


Activity:

sendBroadcast(new Intent(ACTION_STOP));

IntentService

public class UsageRecorderService extends IntentService {
  private static final String TAG  = "UsageRecorderService";
  String ACTION_STOP = "com.xxx.UsageRecorderService.ACTION_STOP";
  boolean stop;

  public UsageRecorderService() {
    super("UsageRecorder");
  }

  private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override public void onReceive(Context context, Intent intent) {
      if (ACTION_STOP.equals(intent.getAction())) {
        stop = true;
      }
    }
  };

  @Override public void onCreate() {
    super.onCreate();
    IntentFilter intentFilter = new IntentFilter(ACTION_STOP);
    registerReceiver(receiver, intentFilter);
  }

  @Override
  protected void onHandleIntent(Intent intent) {
    Log.i(TAG,"onHandleIntent");
    while (true && !stop) {
      Log.i(TAG,"----running----");
      //UsageRecorder.recordUsages(this, false);
      SystemClock.sleep(10000);
    }
  }

  @Override public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(receiver);
  }
}



回答3:


An IntentService is designed to stop itself only when all the requests present in the work queue have been handled.Android stops the service after all start requests have been handled.



来源:https://stackoverflow.com/questions/27459885/stop-service-in-an-activity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!