多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
在这一小节里将介绍另外一种创建窗口的方法,并以此为切入点来开始对Android控件系统的探讨。 这个例子将会在屏幕中央显示一个按钮,它会浮在所有应用之上,直到用户点击它为止。市面上某些应用的悬浮窗就是如此实现的。 - 首先,读者使用Eclipse建立一个新的Android工程,并新建一个Service。然后在这个Service中增加如下代码: ``` // 将按钮作为一个窗口添加到WMS中 private void installFloatingWindow() { // ① 获取一个WindowManager实例 finalWindowManager wm = (WindowManager)getSystemService(Context.WINDOW_SERVICE); // ② 新建一个按钮控件 finalButton btn = new Button(this.getBaseContext()); btn.setText("Click me to dismiss!"); // ③ 生成一个WindowManager.LayoutParams,用以描述窗口的类型与位置信息 LayoutParams lp = createLayoutParams(); // ④ 通过WindowManager.addView()方法将按钮作为一个窗口添加到系统中 wm.addView(btn, lp); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // ⑤当用户点击按钮时,将按钮从系统中删除 wm.removeView(btn); stopSelf(); } }); } privateLayoutParams createLayoutParams() { LayoutParams lp = new WindowManager.LayoutParams(); lp.type = LayoutParams.TYPE_PHONE; lp.gravity = Gravity.CENTER; lp.width = LayoutParams.WRAP_CONTENT; lp.height = LayoutParams.WRAP_CONTENT; lp.flags = LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCH_MODAL; return lp; } ``` - 然后在新建的Service的onStartCommand()函数中增加对installFloatingWindow()的调用。 - 在应用程序的主Activity的onCreate()函数中调用startService()以启动这个服务。 - 在应用程序的AndroidManifest.xml中增加对权限android.permission.SYSTEM\_ALERT\_WINDOW的使用声明。 当完成这些工作之后,运行这个应用即可得到如图6-1所示的效果。一个名为“Clickme to dismiss!”的按钮浮在其他应用之上。而点击这个按钮后,它便消失了。 :-: ![](http://img.blog.csdn.net/20150814133430983?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 图 6 - 1浮动窗口例子的运行效果 读者可以将本例与第4章的例子SampleWindow做一个对比。它们的实现效果是大同小异的。而然,本章的这个例子无论是从最终效果、代码量、API的复杂度或可读性上都有很大的优势。这得益于对控件系统的使用。在这里,控件Button托管了窗口的绘制过程,并且将输入事件封装为了更具可读性的回调。并且添加窗口时所使用的WindowManager实例掩盖了客户端与WMS交互的复杂性。更重要的是,本例所使用的接口都来自公开的API,也就是说可以脱离Android源码进行编译。这无疑会带来更方便的开发过程以及更好的程序兼容性。 因此,除非需要进行很底层的窗口控制,使用本例所介绍的方法向系统中添加窗口是最优的选择。