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)
欢迎任何想法。提前谢谢所有想办法解决的人
这是因为onDestroy()在 Service 中并不能保证被调用。(请参阅当服务的 onDestroy() 方法没有被调用时的情况?)了解更多信息。
我正在运行与您类似的设置,但不幸的是我还没有找到一种方法来检测每次服务停止的时间。
如果我找不到更好的解决方法,我将在 Activity 的 onResume 中检查正在运行的服务,也许这也可以给您带来启发,但这不是一个完美的解决方案:如何检查服务是否正在运行
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |