已经很长时间没有写博客了,这段时间不是项目忙就是忙着找工作,还忙着过年,总之很忙。年后的工作时做launcher,这对我这个新手来说,又是各种挑战,网上关于launcher的开发资料不再像以前那么全面以及泛滥,搜到最多的也是对于launcher的框架分析,那么对于launher的框架在此就不再赘述,推荐阅读以下博客http://www.oschina.net/android/317/android-launcher,http://blog.csdn.net/internetman/article/details/7201165
我今天就是总结下我这几天的劳动成果,也就是大家基于原生4.0的launcher做修改时可能会遇到的一些小功能修改及添加。
一:打开应用抽屉;
其实,这个方法系统已经封装好了,在launcher类中的showAllApps()方法可以很方便的在任何你需要的地方使用。
二:打开屏幕预览;
这个方法如上面是系统就已经封装好的,在launcher类中,showPreviews()方法。
三:通知栏的开启和关闭;
由于通知栏是framework层的布局,我们在上层无法直接进行控制,一种方法是修改framework层的代码,但是这对于上层应用来说代价有点高,所以我们另辟蹊径,我采用的方法是使得应用程序全屏显示,launcher也是作为一个单独的应用程序,所以这种方式也是可行的,整个launcher中只有一个activity,那就是launcher类,所以可以执行以下代码
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
这段代码大家应该很熟悉,全屏之后就会发现通知栏隐藏了,但是想要让他再显示该如何处理,笔者最初采用的是逆向思维,你前面不是设置全屏了嘛,那我就在需要显示的地方在设置一次布局,由于launcher.xml中最外层的布局的width和hight的值都是match_parent,于是笔者用了以下代码
getWindow().setFlags(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams. MATCH_PARENT);
可是最后发现这两行代码的结果是导致程序报错退出,所以我们在此该做的不是重置布局,而是退出当前全屏模式,所以正确的代码应该是下面这个
finalWindowManager.LayoutParams attrs = getWindow() .getAttributes(); attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setAttributes(attrs); getWindow().clearFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
这样便能退出全屏,也就能再显示通知栏了。
四:展开通知栏;
这个原生操作就是手势下滑通知栏实现展开通知栏。可以用以下代码实现,
try { Object service =getSystemService("statusbar"); if (service != null) { Method expand =service.getClass().getMethod("expand"); expand.invoke(service); } } catch (Exception e) { }
由于要获得SystemService的数据,所以需要捕获下异常。
五:最近使用程序;
这是修改launcher过程中遇到的比较难解决的问题,原生的操作是长按home键便出现最近使用程序列表,但是home键是机器系统权限最高的按键,我们无法在上层实现监听,所以那个系统级的最近使用程序页面我还没有实现,暂时的解决方法是拿到最近使用程序的list,然后自己写布局显示,不过这样实在不好,界面难看不说,也没有系统那种好的用户体验,比如左右滑动可以从列表中删除并同时关闭程序。关于这一点,如果有哪位高人实现过系统级的那个最近使用程序界面,请赐教,不胜感激,此处我贴出获得最近使用程序list的方法
ActivityManager result =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); ArrayList<RecentTaskInfo>apps = (ArrayList<RecentTaskInfo>) result.getRecentTasks(10,ActivityManager.RECENT_WITH_EXCLUDED);
六:一键实现workspace页面跳转
原生的操作是左右滑动,
int curPage = mWorkspace.getCurrentPage(); if (curPage != 0) { mWorkspace.snapToPage(0); }
在workspace类中实现了对当前页面数的判断,也封装了跳转的方式,只需要传入你想跳转的页面数即可,图上面的代码,传入0跳转进入第一个页面。
七:打开系统搜索;
直接调用系统方法,onSearchRequested()。在launcher类中
八:语音搜索
Android从2.3开始支持谷歌Android语音搜索,前提是必须安装google语音搜索应用,你可以直接用调用其他应用程序的方法调用这个功能,代码如下,
PackageManager packageManager = Launcher.this.getPackageManager(); Intentintent = newIntent(); intent= packageManager .getLaunchIntentForPackage("com.google.android.voicesearch"); if (intent == null) { Toast.makeText(Launcher.this, "未安装goole语音搜索软件,请安装!", Toast.LENGTH_SHORT).show(); }else{ startActivity(intent); }
九:屏幕下部的区域隐藏与现实,
屏幕下方的dock区域只是个普通的view,他的隐藏和显示就是简单的view的显隐,这里就不多说了。
今天先暂时写到这里,今天总结的多是一些小的系统功能,不过是冰山的一小角而已。随着日后开发的深入,我会继续进行完善,最最希望的是做过launcher的前辈能留言指教一二,我现在过程中遇到较多的问题,希望与之交流。