2014-10-07 73 views
1

我的应用程序出现了一个非常奇怪的问题。我有一个始终显示ImageView的服务。使用onTouchListener时,用户会与图像进行交互以使某些事情发生。当服务关闭时,ImageView会从窗口中移除(至少应该是这样)。WindowManager在服务中未删除ImageView

当我在我的设置活动(这是一个片段)时,在每个首选项更改中重新启动服务,以便在服务中进行更改。在重新启动期间,出于某种奇怪的原因,有时不会删除ImageView。服务启动后,新的ImageView将显示在其上。如果我完全关闭服务,那么“孤儿”ImageView会停留在屏幕上,如果它被触摸,则应用程序崩溃。

这个错误是随机的。我无法将它作为用户从我身边连接到特定的设置或操作;即使点击启用/禁用ToggleButton几次,也会发生错误。

设置片段

 ToggleButton enableToggle = (ToggleButton)v.findViewById(R.id.enable_toggle); 
    enableToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      // TODO Auto-generated method stub 
      prefs.edit().putBoolean("HotSpotEnabled", isChecked).commit(); 
      if(isChecked){ 
       getActivity().stopService(new Intent(getActivity(),mysService.class)); 
       getActivity().startService(new Intent(getActivity(),myService.class)); 
      } 
      else{ 
       getActivity().stopService(new Intent(getActivity(),myService.class)); 
      } 
     } 
    }); 

时间不限于用户的偏好做出改变我重新启动该服务具有这种功能

public void restartService(){ 
     if(myService.isRunning){ 
      enabledToggle.setChecked(false); 
      final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable(){ 
       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        enabledToggle.setChecked(true); 
       } 
      }, 1000); 
     } 

    } 

(ⅰ使用切换到重新启动该服务,而不是stopService(); -startService();因为出于某种原因,这个问题不太频繁)

如果我使用这个函数重新启动服务,每个SIN都会出现错误重启GLE执行()

public void restart(){ 
    getActivity().stopService(new Intent(getActivity(),mysService.class)); 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable(){ 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      getActivity().startService(new Intent(getActivity(),myService.class)); 
     } 
    }, 1000); 
} 

这个事实本身只是让我抓我的头....

这是我的服务代码:

public class myService extends Service { 
publis static boolean isRunning; 
ImageView img1; 
WindowManager.LayoutParams params 

@Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
      isRunning=true; 
      img1=new ImageView(this); 
      //create and set bitmap to img1 
      params = new WindowManager.LayoutParams(WindowManager.LayoutParams.TYPE_PHONE, 
        WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH| 
        WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH| 
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
        PixelFormat.TRANSLUCENT); 
      //set bitmap and 
      wm.addView(img1, params); 
      img1.setOnTouchListener(new View.OnTouchListener() { 
        . 
        . 
        . 
      }); 
      return START_STICKY; 
    } 

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     isRunning=false; 
     try{ wm.removeView(img1); img1 = null; }catch(Exception e){} 
    } 

} 

任何想法都欢迎。提前感谢大家谁想到一个解决方案

回答

0

因为onDestroy()在服务不保证被调用。 (请参阅Situations when a Service's onDestroy() method doesn't get called?)了解更多信息。

我正在运行一个类似的设置,但不幸的是我没有找到一种方法来检测每一次服务停止。

如果我不找到更好的解决方法,我将检查在活动的onResume正在运行的服务,也许这是你可以从太振奋精神,但它不是一个完美的解决方案:how to check if service is running or not