我的應用程序出現了一個非常奇怪的問題。我有一個始終顯示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){}
}
}
任何想法都歡迎。提前感謝大家誰想到一個解決方案