采得百花成蜜后,为谁辛苦为谁甜。这篇文章主要讲述Android4.2.2 动态显示隐藏屏幕底部的导航栏(对系统源码进行修改)相关的知识,希望能为你提供帮助。
需求如题。
在android4.2.2中,导航栏(也就是屏幕底部的三个按钮,home,back,recentapp)是系统应用SystemUi.apk的一部分,简言之,我们的需求就是让我们的app来控制SystemUi.apk,达到动态显示隐藏屏幕底部导航栏的效果。我们可以在SystemUi.apk的源码中留下接口便于我们控制导航栏的显示和隐藏,我们可以通过广播的接收与发送的方式来实现这个接口。
app------->
发送广播(hide/show)
SystemUi.apk
------>
监听广播 (hide-隐藏导航栏,show-显示导航栏)
SystemUi.apk是系统应用,它在Android文件系统中的路径是:/system/app/;它在android源码中的路径是:frameworks/base/packages/SystemUI/;
我们只需修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.Java
<
1>
显示方法使用addNavigationBar()(原有):
[java]
view plain
copy
- private void addNavigationBar() {
- if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
- if (mNavigationBarView == null) return;
- prepareNavigationBarView();
- mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
- }
< 2> 隐藏方法定义如下(新加):
[java] view plain copy
- private void removeNavigationBar() {
- if (mNavigationBarView == null) return;
- mWindowManager.removeView(mNavigationBarView);
- sp; }
【Android4.2.2 动态显示隐藏屏幕底部的导航栏(对系统源码进行修改)】
[java] view plain copy
- IntentFilter filter1 = new IntentFilter();
- filter1.addAction("MyRecv_action");
- context.registerReceiver(mBroadcastReceiver1, filter1);
< 4> 广播监听及处理
[java] view plain copy
- private BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (isOrderedBroadcast()) {
- if (action.equals("MyRecv_Action")) {
- String cmd = intent.getStringExtra("cmd");
- //布尔标志isDisplayNavBar保存当前导航栏的状态
- if(cmd.equals("hide")& & isDisplayNavBar){
- isDisplayNavBar=false;
- removeNavigationBar();
- }else if(cmd.equals("show")& & !isDisplayNavBar){
- addNavigationBar();
- isDisplayNavBar=true;
- }
- }
- this.abortBroadcast();
- }
- }
- ;
至此修改完毕,编译完毕之后产生新的SystemUi.apk ,替换原文件系统的SystemUi.apk 后重启即可。
在我们的app里面,如果想要隐藏导航栏:
[java] view plain copy
- Intent intent=new Intent();
- intent.setAction("MyRecv_action");
- intent.putExtra("cmd","hide");
- this.sendOrderedBroadcast(intent,null);
如果想要显示导航栏:
[java] view plain copy
- Intent intent=new Intent();
- intent.setAction("MyRecv_action");
- intent.putExtra("cmd","show");
- this.sendOrderedBroadcast(intent,null);
推荐阅读
- C#使用Xamarin开发可移植移动应用进阶篇(8.打包生成安卓APK并精简大小),附源码
- 实现QQ微信新浪微博和百度第三方登录(Android Studio)
- Appium常见报错问题解决方法-2
- Appium常见报错问题解决方法-1
- Java EE: XML Schemas for Java EE Deployment Descriptors(Java Web的web.xml头web-app标签上的XML模式)
- AppCompatActivity
- mybatis mapper动态代理
- Android TextView加下划线的几种方式
- Unity5.5.4使用IL2CPP构建Android真机版本