Android的窗口体系中,WindowManager占有非常重要的地位,它封装了添加、移除、更新窗口的方法,它是Activity、View的更加底层的管理类,使用WindowManager的其中一个例子就是制作悬浮窗或悬浮球之类的悬浮组件,这种悬浮组件不依赖某个Activity,它可以在任何界面显示(只要你愿意)。
这篇文章将对如何使用悬浮球做简单总结,即使在android6.0下(android6.0使用动态权限管理),它也可以正常工作。
1.使用ButterKnife
ButterKnife可以方便的获取到xml中定义的view的实例,比findViewById方便多了,使用ButterKnife非常简单,可以总结为3步吧:
- 添加对应依赖
compile 'com.jakewharton:butterknife:7.0.0'
- 声明id与对应的View
<pre style="font-family: 宋体; font-size: 9pt; background-color: rgb(255, 255, 255);"><pre name="code" class="java"> @Bind(R.id.start) Button start; @Bind(R.id.stop) Button stop; @Bind(R.id.bind) Button bind; @Bind(R.id.unbind) Button unbind;
- 获取View
在onCreate中调用它就可以。通过这句调用,start,stop,bind,unbind几个Button都被实例化了。ButterKnife.bind(this);
2.使用Service
我希望悬浮窗是在Service中被显示出来的,并且它的管理也在Service中实现。Service有两种启动方式,对应了不同的用途,使用bindService方式启动的Service可以过得一个Ibinder的实例,使用这个实例可以操作Service的所有Public方法,一般用于Activity和Service交互比较频繁的场合下,所以我们这里使用startService启动Service比较合理。
分析清楚以后,开始实现代码:
2.1Service
public class FlowWindowService extends Service {
private final String TAG = "FlowWindowService";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG,"onCreate");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG,"onBind");
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG,"onStartCommand");
showFlowWindow();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG,"onDestroy");
}
public void showFlowWindow(){
Log.v(TAG,"showFlowWindow");
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
Button button = new Button(getApplicationContext());
button.setText("flow");
button.setBackgro