2014-10-07 59 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