我的应用程序遇到了一个非常奇怪的问题。我有一项始终显示 ImageView 的服务。当用户与图像交互以使某些事情发生时,使用 onTouchListener。当服务关闭时,ImageView 将从窗口中删除(至少应该如此)。
当我处于设置 Activity (这是一个 fragment )时,每次首选项更改时,我都会重新启动服务,以便在服务中进行更改。在重新启动期间,由于某种奇怪的原因,有时 ImageView 不会被删除。服务再次启动后,一个新的 ImageView 会显示在其顶部。如果我完全关闭服务,“孤立”ImageView 只会保留在屏幕上,如果触摸它,应用程序就会崩溃。
此错误是随机的。我无法将其连接到我作为用户的特定设置或操作;即使单击启用/禁用切换按钮几次,也可能会发生错误。
设置 fragment
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(); 因为由于某种原因,这种方式出现问题的频率较低)
如果我使用此函数重新启动服务,则每次执行 restart() 时都会发生错误
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){}
}
}
欢迎任何想法。提前感谢所有费心思考解决方案的人
最佳答案
因为Service中的onDestroy()
不保证被调用。 (参见 Situations when a Service's onDestroy() method doesn't get called? )了解更多信息。
我正在运行与您类似的设置,但不幸的是我还没有找到一种方法来检测每次服务停止的情况。
如果我找不到更好的解决方法,我将在 Activity 的 onResume 中检查正在运行的服务,也许这也可以给您带来启发,但这不是一个完美的解决方案:how to check if service is running or not
关于android - Service中的ImageView没有被WindowManager移除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26228351/