我的应用程序出现了一个非常奇怪的问题。我有一个始终显示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提前考虑解决方案的每个人
答案 0 :(得分:0)
因为无法保证在服务中onDestroy()
被调用。 (有关详细信息,请参阅Situations when a Service's onDestroy() method doesn't get called?)。
我正在运行与您类似的设置,但遗憾的是我还没有找到一种方法来检测每次服务停止。
如果我找不到更好的解决方法,我将检查活动的onResume中正在运行的服务,也许这也是你可以从中受到启发的东西,但它不是一个完美的解决方案:how to check if service is running or not