android - Service中的ImageView没有被WindowManager移除

标签 android imageview android-windowmanager

我的应用程序遇到了一个非常奇怪的问题。我有一项始终显示 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/

相关文章:

android - RecyclerView - 更改单击项目上的文本

android - 库 .so 文件中 `const char *` 存储的奇怪行为

java - 创建对话框时出现 android.view.WindowManager$BadTokenException 错误

android - 如何从 InputMethodService 获取窗口?

java - 重启后恢复报警计数器

android - Firebase 手机身份验证和华为应用程序库

android - 使用 picasso 将相同的图像设置为 ImageView 的背景

java - 将位图设置为 ImageView

Android:如何获取可绘制图像名称

android - 如何修复 android 中的 BadTokenException 错误?