在做Android上面的悬浮窗的时候,一般需要去判断一种情况,即当前是否是在桌面上(即按下Home键时回到的手机界面):
1)在桌面上,才展示悬浮窗
2)不在桌面上,则隐藏悬浮窗
桌面(Home),其实本质上也是一个应用程序,也是由Activity组成的,所以一个手机里面有可能装有多个桌面应用,这是第一点。
第二点,要判断当前是否在桌面上,其实也就是要判断当前显示的这个Activity,是不是属于一个桌面应用,所以必须先获取当前应用的包名来判断。
在Android中,可通过以下几个步骤来判断当前是否在桌面上:
1)获取所有桌面应用的包名,可通过PackageManager来实现。
List<String> names = new ArrayList<String>();
PackageManager packageManager = this.getPackageManager();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
for(ResolveInfo resolveInfo : list){
names.add(resolveInfo.activityInfo.packageName);
}
桌面应用有可能不只包含一个Activity的,那就要找到的是Intent.ACTION_MAIN所对应的那个Activity,才是启动桌面的第一个Activity,才是我们看到的桌面。其次其对应的的Category必须是CATEGORY_HOME的,不然系统可没法辨别出其是不是桌面应用。
所以要将对应的Intent,传给PackageManager.queryIntentActivities方法,从而获取所有能够解析这个Intent的桌面应用,然后将对应的Activity的包名给拿出来。
ResolveInfo,其实存放的就是的对应的每一个Activity的信息。
2)要获取当前Activity(桌面)的包名,然后判断其是否在第一步所包含的Home Activity列表中。
ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> list = activityManager.getRunningTasks(1);
isHome = names.contains(list.get(0).topActivity.getPackageName());
利用ActivityManager获取当前运行的众多Task,然后拿出第一个Task(get(0))中最顶的一个Activity(topActivty),然后判断其包名是否在Names中,如果是,表明当前的确是在某一个桌面(的activity)上面。
3)最后,获取当前Task是需要权限的,所以需要在AndroidManifest.xml中添加权限。
<uses-permission android:name="android.permission.GET_TASKS" />