转载请注明出处
最近实验室要增加一个需求,需要一个在应用内部显示的悬浮球,因为这个悬浮球只与本应用相关,当应用只在后台运行时,这个悬浮球要隐藏掉,不得影响用户的其他操作。在网上搜索了一下,也没有找到相关的实现,于是自己想了一下,实现了隐藏和显示的逻辑。
悬浮球的实现直接借用了该博文中的方法 http://blog.csdn.net/stevenhu_223/article/details/8504058
关于悬浮球的实现就不再赘述了,网络上也有很多写的很好的demo,主要是使用WindowManager来实现。我主要介绍如何隐藏和恢复悬浮窗。
由于打开app之后会在各种Activity之间切换,要保证悬浮窗始终在顶层显示,需要将悬浮窗的实现逻辑放在Service中,并且该Service不应该是绑定的。可以考虑在Service中设置一个用来表示当前应用处于前台的活跃状态的Activity的数目的标识activeNumber,一般情况下为1,如果应用完全位于后台,activeNumber的值为零,此时应该隐藏悬浮窗;如果应用重新被从后台打开,悬浮窗应该恢复。还要在Service中注册一个BroadcastReceiver,用来接收各个Activity发来的广播,以修改activeNumber的值。
以下是FloatWindowService的具体实现
public class FloatWindowService extends Service
{
private static final String TAG = "FloatWindowService";
private static final String UPDATE_ACTION="com.liang.lib.ACTIVE_NUMBER";
//标识当前app有几个activity处于前台活跃状态
private static int activeNumber=1;
Button mFloatView;
//定义浮动窗口布局
LinearLayout mFloatLayout;
WindowManager.LayoutParams wmParams;
//创建浮动窗口设置布局参数的对象
WindowManager mWindowManager;
MyReceiver myReceiver;
//表示悬浮窗的显示状态
private boolean mHasShown;
@Override
public void onCreate()
{
super.onCreate();
Log.e(TAG, "oncreat");
//注册BroadCastReceiver
myReceiver=new MyReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction(UPDATE_ACTION);
registerReceiver(myReceiver,filter);
//初始化悬浮窗UI
createFloatView();
}
@Override
public IBinder onBind(Intent intent)
{
return null;
}
public void createFloatView()
{
wmParams = new WindowManager.LayoutParams();