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

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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值