判断当前显示是否为桌面

最近一直都在研究启动啊,Intent,Action, Category之类的话题。
    最近在自己的项目中需要用到判断一个应用是否启动的功能。为了扩展一下知识点,就把题目定成了如果判断当前显示是否为桌面。

其实这个过程有三个知识点。
        1.如何找出正在运行的任务? Android系统是支持多任务的,找到所有运行的任务是关键。
        2.如何找出当前正在运行的任务?虽然android是多任务的系统,但是同时在前端运行的应用只会有一个。如何找出来呢?
        3.如何找出桌面?因为我们都知道android的桌面是可以定制的。我们怎么知道用户启用的是哪个桌面呢?

带着这些问题我们开始今天的讲解吧。

1. 找出正在运行的任务。正在运行的任务可能是前台的也可能是后台的。我们不管三七二十一,先找出来再说。
代码如下:
?
代码片段,双击复制
01
02
         ActivityManager manager = (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(Integer.MAX_VALUE);


2.找出前台运行的任务。我们找出了所有正在运行的任务,那么前台运行的任务就位于所以任务的最前面。

        RunningTaskInfo info = runningTaskInfos.get(0);

3. 找出桌面。桌面应用(Launcher)的启动页面包含了以下条件:、
        1.action为android.intent.action.MAIN,
        2.category包含android.intent.category.Home
        虽然说android可以定制桌面,但是我们显示桌面的时候,总是显示众多桌面中的一个。所以我判断的逻辑为:
                找出所有的桌面,如果有一个桌面应用在前台运行,则表示桌面显示中。
        
?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
         private List<String> getHomes() {  
                List<String> packages = new ArrayList<String>();  
                PackageManager packageManager = ListenService. this .getPackageManager();  
                Intent intent = new Intent(Intent.ACTION_MAIN);  
                intent.addCategory(Intent.CATEGORY_HOME);  
                List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,  
                                 PackageManager.MATCH_DEFAULT_ONLY);  
                for (ResolveInfo info : resolveInfo){  
                         packages.add(info.activityInfo.packageName);  
                         System.out.println(info.activityInfo.packageName);  
                }  
                return packages;  
         }

        
最后我们来看看完整的代码:
?
代码片段,双击复制
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
         public boolean isHome(){
                homes = getHomes();
                ActivityManager mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);  
                List<RunningTaskInfo> rti = mActivityManager.getRunningTasks( 1 );  
                return homes.contains(rti.get( 0 ).topActivity.getPackageName());  
         }
         private List<String> getHomes() {  
                List<String> packages = new ArrayList<String>();  
                PackageManager packageManager = ListenService. this .getPackageManager();  
                Intent intent = new Intent(Intent.ACTION_MAIN);  
                intent.addCategory(Intent.CATEGORY_HOME);  
                List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent,  
                                 PackageManager.MATCH_DEFAULT_ONLY);  
                for (ResolveInfo info : resolveInfo){  
                         packages.add(info.activityInfo.packageName);  
                         System.out.println(info.activityInfo.packageName);  
                }  
                return packages;  
         }


首发地址: http://www.krislq.com/2012/11/android_class_judge_whether_it_is_launcher/ 

转自 http://www.eoeandroid.com/thread-232636-1-1.html

谢谢作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值