停止Android服务

时间:2015-07-20 22:59:43

标签: android

我正在尝试创建一个可以打开和关闭移动数据的应用程序,当屏幕显示时,移动数据也应该打开。所以我试图在用户打开屏幕时停止服务。我有一个调用SwitchService类的主要活动,有没有办法从服务本身内部停止服务?我做了很多谷歌搜索,但没有任何工作,onDestroy(),stopSelf().....是什么问题?

public class SwitchService extends Service {

Handler mHandler;

@Override
public void onCreate() {

}

private void switchOff() {


    scheduleNext(10*1000);
    setMobileDataEnabled(this,false);



}
private void switchOn() {


    scheduleNext2(10*1000);
    setMobileDataEnabled(this,true);
    System.out.println("still runnin");



}

private void scheduleNext(int time) {
    mHandler.postDelayed(new Runnable() {
        public void run() {

            switchOn();

        }
    },time);
}
private void scheduleNext2(int time) {
    mHandler.postDelayed(new Runnable() {
        public void run() {

            switchOff();
        }
    },time);
}


@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    mHandler = new android.os.Handler();
    switchOn();

    new Thread(new Runnable(){

        @Override
        public void run() {
            checkLock();

        }

    }).start();


    return START_STICKY;
}


private void checkLock() {


    scheduleNextLockCheck(1*1000);

    PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    boolean isScreenOn = powerManager.isScreenOn();


    if (isScreenOn) {

        System.out.println("Screen onnn");
        setMobileDataEnabled(this,true);
        SwitchService.this.onDestroy();
    }




}

private void scheduleNextLockCheck(int time) {
    mHandler.postDelayed(new Runnable() {
        public void run() {

            checkLock();

        }
    },time);
}

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


}

@Override
public IBinder onBind(Intent intent) {

    return null;
}

private void setMobileDataEnabled(Context context, boolean enabled) {
    final ConnectivityManager conman = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    Class conmanClass;
    try {
        conmanClass = Class.forName(conman.getClass().getName());

        final Field iConnectivityManagerField = conmanClass
                .getDeclaredField("mService");

        iConnectivityManagerField.setAccessible(true);
        final Object iConnectivityManager = iConnectivityManagerField
                .get(conman);
        final Class iConnectivityManagerClass = Class
                .forName(iConnectivityManager.getClass().getName());
        @SuppressWarnings("unchecked")
        final Method setMobileDataEnabledMethod = iConnectivityManagerClass
                .getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
        setMobileDataEnabledMethod.setAccessible(true);

        setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

1 个答案:

答案 0 :(得分:2)

stopSelf将停止服务,但这并不会停止服务所拥有的处理程序,线程等。你必须在onDestroy方法中手动完成。