用常规的方法在AlertDialog的时候,会报错,大意是「can not add window in this view」。
原因是Service是没有界面的,只有Activity才能添加界面。
解决方法是使用系统的dialog,即全局性质的提示框。这个Dialog可能不只局限于Service里可以使用,而是在任何位置都可以悬浮。
具体可以模仿如下代码:
Builder builder = new AlertDialog.Builder(this); builder.setTitle("提示"); builder.setMessage("该下车了"); builder.setNegativeButton("取消", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.setPositiveButton("确定", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); final AlertDialog dialog = builder.create(); **//在dialog show方法之前添加如下代码,表示该dialog是一个系统的dialog** dialog.getWindow().setType((WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)); new Thread(){ public void run() { SystemClock.sleep(4000); hanlder.post(new Runnable() { @Override public void run() { dialog.show(); } }); }; }.start(); }
讨厌的一点是要加一个权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
另外,在Listener的匿名内部类中使用一个non-final的变量'msg'时,它提示了「Cannot refer to a non-final variable msg inside an inner class defined in a different method"。」但是在函数声明过程中加入final(public void handleMessage(final Message msg))好像是不行的,会报错。我加了一个中间语句:
final File msg1 = (File)msg.obj;
然后再使用msg1,就可以了。
解决问题的过程中还遇到了handler,final(《重载、覆写和继承》),以及super之类的知识,要学习handler。
参考:http://my.eoe.cn/cainiao1/archive/2345.html?f_section=similar