服务中的 WindowManager 不会删除 ImageView

Ano*_*ous 5 android imageview android-windowmanager

我的应用程序有一个非常奇怪的问题。我有一项始终显示 ImageView 的服务。当用户与图像交互以使某些事情发生时,使用 onTouchListener。当服务关闭时,ImageView 将从窗口中删除(至少它应该如此)。

当我进行设置活动(这是一个片段)时,每次更改首选项时,我都会重新启动服务,以便在服务中进行更改。在重新启动期间,出于某种奇怪的原因,有时不会删除 ImageView。服务再次启动后,会在其顶部显示一个新的 ImageView。如果我完全关闭服务,“孤立” ImageView 只会停留在屏幕上,如果触摸它,应用程序就会崩溃。

这个错误是随机的。作为用户,我无法将它连接到特定的设置或操作;即使单击启用/禁用切换按钮几次,也可能发生错误。

设置片段

     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));
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

每当用户的首选项发生更改时,我都会使用此功能重新启动服务

    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);
        }

    }
Run Code Online (Sandbox Code Playgroud)

(我使用切换来重新启动服务而不是 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);
}
Run Code Online (Sandbox Code Playgroud)

仅此一个事实就让我摸不着头脑......

这是我的服务代码:

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){}
    }

}
Run Code Online (Sandbox Code Playgroud)

欢迎任何想法。提前谢谢所有想办法解决的人

zol*_*ish 0

这是因为onDestroy()在 Service 中并不能保证被调用。(请参阅当服务的 onDestroy() 方法没有被调用时的情况?)了解更多信息。

我正在运行与您类似的设置,但不幸的是我还没有找到一种方法来检测每次服务停止的时间。

如果我找不到更好的解决方法,我将在 Activity 的 onResume 中检查正在运行的服务,也许这也可以给您带来启发,但这不是一个完美的解决方案:如何检查服务是否正在运行