在Android中,如何判断当前是否在桌面上

来源:互联网 发布:淘宝网韩都衣舍旗舰店 编辑:程序博客网 时间:2024/04/29 04:48

在做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" />


0 0