我的应用程序出现了一个非常奇怪的问题。我有一个始终显示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){}
}
}
任何想法都欢迎。提前感谢大家谁想到一个解决方案