需求如题。

在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
  1. private void addNavigationBar() {
  2. if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
  3. if (mNavigationBarView == null) return;
  4. prepareNavigationBarView();
  5. mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
  6. }

<2>隐藏方法定义如下(新加):

[java] view plain copy
  1. private void removeNavigationBar() {
  2. if (mNavigationBarView == null) return;
  3. mWindowManager.removeView(mNavigationBarView);
  4. sp;}

<3>广播的注册

[java] view plain copy
  1. IntentFilter filter1 = new IntentFilter();
  2. filter1.addAction("MyRecv_action");
  3. context.registerReceiver(mBroadcastReceiver1, filter1);

<4>广播监听及处理

[java] view plain copy
  1. private BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. String action = intent.getAction();
  5. if (isOrderedBroadcast()) {
  6. if (action.equals("MyRecv_Action")) {
  7. String cmd = intent.getStringExtra("cmd");
  8. //布尔标志isDisplayNavBar保存当前导航栏的状态
  9. if(cmd.equals("hide")&&isDisplayNavBar){
  10. isDisplayNavBar=false;
  11. removeNavigationBar();
  12. }else if(cmd.equals("show")&&!isDisplayNavBar){
  13. addNavigationBar();
  14. isDisplayNavBar=true;
  15. }
  16. }
  17. this.abortBroadcast();
  18. }
  19. }
  20. ;

至此修改完毕,编译完毕之后产生新的SystemUi.apk ,替换原文件系统的SystemUi.apk 后重启即可。

在我们的app里面,如果想要隐藏导航栏:

[java] view plain copy
  1. Intent intent=new Intent();
  2. intent.setAction("MyRecv_action");
  3. intent.putExtra("cmd","hide");
  4. this.sendOrderedBroadcast(intent,null);

如果想要显示导航栏:

[java] view plain copy
  1. Intent intent=new Intent();
  2. intent.setAction("MyRecv_action");
  3. intent.putExtra("cmd","show");
  4. this.sendOrderedBroadcast(intent,null);

Android4.2.2 动态显示隐藏屏幕底部的导航栏(对系统源码进行修改)的更多相关文章

  1. Android隐藏状态栏、导航栏

    Android隐藏状态栏.导航栏 private void hideStatusNavigationBar(){ if(Build.VERSION.SDK_INT<16){ this.getWi ...

  2. 移动端webapp如何隐藏浏览器的导航栏

    webapp如何隐藏浏览器的导航栏 在webapp开发中,手机浏览器的导航栏会让我们的页面看起来很怪异,这个时候我们就需要将导航栏给隐藏起来,隐藏的方法十分简单,只需要在head头中加入以下几行代码就 ...

  3. vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改

    vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改.vue <div class="commonHeader" v-bind:class=" ...

  4. Android App 隐藏标题栏+状态栏+导航栏

    1. 隐藏当前Activity标题栏 在当前Activity中调用:this.requestWindowFeature(Window.FEATURE_NO_TITLE); 2. 隐藏当前Activit ...

  5. iOS 7.1的Safari为meta标签新增minimal-ui属性,在网页加载时隐藏地址栏与导航栏

    在 iOS 7.1 的 Safari 中为 meta 标签新增 minimal-ui 属性,让网页在加载时便可隐藏顶部的地址栏与底部的导航栏. 如何实现?你只需将“minimal-ui”加入 view ...

  6. Android4.4系统源码百度网盘下载

    众所周知.Android如今非常火,肯定也有非常多android开发人员像我一样想研究android系统的源码.可是假设依照Google官方站点http://source.android.com/so ...

  7. 多个精美的导航样式web2.0源码

    效果体验:http://keleyi.com/keleyi/phtml/divcss/6.htm 兼容多浏览器,例如IE,Chrome,火狐 等. 完整代码,保存到htm文件打开也可以查看效果: &l ...

  8. Ros学习——移动机器人Ros导航详解及源码解析

    1 执行过程 1.运行仿真机器人fake_turtlebot.launch:加载机器人模型——启动机器人仿真器——发布机器人状态 2.运行amcl节点fake_amcl.launch:加载地图节点ma ...

  9. iOS开发中的错误整理,导航控制器的导航栏取消系统渲染的错误

随机推荐

  1. [CF] 180 E. Cubes

    对同类元素双指针扫描 #include<iostream> #include<cstring> #include<cstdio> #include<vecto ...

  2. C#基础-数组-ArrayList

    数组ArrayList using System.Collections; //表示引入集合的命名空间 数组ArrayList容量本身是不固定的,根据存储的数据动态变化 // 声明一个ArrayLis ...

  3. Python数据分析【炼数成金15周完整课程】

    点击了解更多Python课程>>> Python数据分析[炼数成金15周完整课程] 课程简介: Python是一种面向对象.直译式计算机程序设计语言.也是一种功能强大而完善的通用型语 ...

  4. 移动端H5前端性能优化指南:

    分享地址:https://isux.tencent.com/h5-performance.html

  5. 详解wordpress如何把文件保存到阿里云OSS上!

    自己搞了一个Wordpress的博客,装完之后一直晾着没管,最近闲来开荒.为了减小服务器的带宽.存储.CUP的压力,决定把博客中的所有文件都保存到阿里云OSS上面. 关于这个问题,自己去调用OSS的S ...

  6. SDUST第十一次oj作业液晶显示问题

    Problem H: 液晶显示 Time Limit: 1 Sec  Memory Limit: 32 MBSubmit: 3246  Solved: 1594[Submit][Status][Web ...

  7. hbase问题总结

    一.客户端访问hbase时出现no further information 使用java api访问hbase时,一直连不上,查看日志发现以下错误: java.net.ConnectException ...

  8. 多实例设置本地IP访问sql server 数据库

    我们本地有时候有多个数据库版本(^_^..别说了都是泪),都是为了兼容不同版本的数据而安装的! 最近我们需要用IP来访问,就有了这一段折腾的历程. 上图片为我安装的三个不同的版本,一个为sql ser ...

  9. Java 程序动态替换 docx 模板中定制值的实现例子

    项目系统中打印功能,导出 word 文档功能是挺常用的,本文介绍自定文档模板,程序实现模板内容中值替代的功能. 模板文件 template.docx ​ 执行 main public static v ...

  10. 4.Vim编辑器与Shell命令脚本

    第4章 Vim编辑器与Shell命令脚本 章节简述: 本章首先讲解如何使用Vim编辑器来编写.修改文档,然后通过逐个配置主机名称.系统网卡以及Yum软件仓库参数文件等实验,帮助读者加深Vim编辑器中诸 ...