WindowManager在Service中不会删除ImageView

时间:2014-10-07 04:01:24

标签: android imageview android-windowmanager

我的应用程序出现了一个非常奇怪的问题。我有一个始终显示ImageView的服务。使用onTouchListener时,用户会与图像进行交互以使某些事情发生。当服务关闭时,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();因为出于某种原因,这种方式的问题不那么频繁)

如果我使用此函数重新启动服务,则每次执行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){}
    }

}

欢迎任何想法。 Thanx提前考虑解决方案的每个人

1 个答案:

答案 0 :(得分:0)

因为无法保证在服务中onDestroy()被调用。 (有关详细信息,请参阅Situations when a Service's onDestroy() method doesn't get called?)。

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

如果我找不到更好的解决方法,我将检查活动的onResume中正在运行的服务,也许这也是你可以从中受到启发的东西,但它不是一个完美的解决方案:how to check if service is running or not