我似乎无法阻止自己的服务

时间:2012-10-24 22:29:43

标签: android android-service

我有一个服务,在屏幕上放置一个红色矩形,并有一个看起来像这样的onDestroy()

@Override
    public void onDestroy() {

      Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
}

从我的一项活动中,我打算像这样杀死这项服务:

 stopService(new Intent(this, assNavOverrideService.class));

我看到吐司出现说onDestroy()已被调用,但我仍然看到红色矩形并且它仍在运行..

我的清单正在使用:

<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" >

为myService

public class assNavOverrideService extends Service {

    Timer timer;
    WindowManager.LayoutParams handleParams;

    View screenBlock;
    View disableStatusBar;
    WindowManager winMgr;
    @Override
    public void onCreate() {

        winMgr = (WindowManager)getSystemService(WINDOW_SERVICE); 
    }

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

        disableStatusBar = new TableLayout(getApplicationContext());
        handleParams = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.FILL_PARENT,
                50, 
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                 // this is to keep button presses going to the background window
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH |
                 // this is to enable the notification to recieve touch events
                WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                 // Draws over status bar
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                PixelFormat.TRANSPARENT);

         handleParams.gravity = Gravity.TOP;
         handleParams.y = 750;

         disableStatusBar.setBackgroundResource(R.drawable.fake_nav);

         winMgr.addView(disableStatusBar, handleParams);

         timer = new Timer();
         uiCheckTask tTask = new uiCheckTask();
         tTask.setService(this);
         timer.schedule(tTask, 50, 10);

        // If we get killed, after returning from here, restart
         return START_REDELIVER_INTENT;
    }

    @Override
    public IBinder onBind(Intent intent) {
        // We don't provide binding, so return null
        return null;
    }

    @Override
    public void onDestroy() {

      Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show(); 
    }



    class uiCheckTask extends TimerTask {
        Boolean secDialog = false;
        assNavOverrideService myService;


       public void setService(assNavOverrideService mS){
           myService = mS;
       }


        public void run() {

                Log.v("TICK","TOCKKKKKKKKKKK");


        }



    }



}

2 个答案:

答案 0 :(得分:0)

首先,您无需拥有该权限即可停止您创建的服务。我经常使用服务(启动和停止),我向你保证我不会使用该许可。

即:

Intent service = new Intent(myContext,Service.class);


    startService(service);


    stopService(service);

就是你所需要的。

当然,您的服务确实需要在Android Manifest中声明。

现在影响您活动的任何事情都会使用该活动中的上下文。因此,终止您的服务不会改变UI上的内容。在Destroy中的服务中,您应该以某种方式引用矩形对象并以这种方式将其删除。

我不知道你是如何创建矩形的。但是如果它是一个视图,你可以将它设置为VISIBILITY.GONE,或者如果它是一个ViewStub,你可以放气它,如果它是一个对象你可以清除它等等。

如果您在调用停止服务功能后仍然说您的服务仍在运行,则其他错误。即使看起来你正在停止服务。

----------------------------- EDIT ----------------- -------------------------------------------------- --------------------------------------- 您的服务也可能与您的活动绑定。如果您这样做,则需要释放绑定。

Here's类似问题的链接:

我希望这会对你有所帮助! 干杯

答案 1 :(得分:0)

解决了,在我的服务中onDestroy()我必须停止计时器任务,然后关闭服务......