自定义Systemui(顶部,左侧和底部)

Systemui

顶部、底部和左侧显示固定的区域
蓝色线以外区域即为systemui部分

SystemUI,顾名思义是系统为用户提供的系统级别的信息显示与交互的一套UI组件,所以其功能包罗万象。比如锁屏、状态栏、底部导航栏、最近使用App列表等,大部分功能相互独立,按需启动。在系统源码中,其位置为:frameworks/base/package/SystemUI。尽管从表现形式上看,SystemUI和普通的Android APP有较大的差别,但其本质和普通APP并没有什么差别,也是以apk的形式存在,会被预置再系统指定的目录

1.systemui启动时机

首先先说下android系统启动流程

  1. 开启电源,执行BootLoader引导程序
  2. BootLoader拉起并且执行Android操作系统
  3. 启动Linux内核,加载系统文件init.rc
  4. 操作系统启动init进程
  5. init启动zygote进程(创建JVM、注册JNI)
  6. zygote进程启动虚拟机,启动SystemService进程
  7. SystemService启动AMS和WMS等各种服务
  8. AMS里面启动Launcher

Systemui作为系统主要进程,则是在SystemService中启动的

SystemServer.java中关键代码如下

private void run() {
        ......
          // Start services.开启各种Service
    try {
        traceBeginAndSlog("StartServices");
        startBootstrapServices();
        startCoreServices();
        startOtherServices();
        SystemServerInitThreadPool.shutdown();
    } catch (Throwable ex) {
        throw ex;
    } finally {
        traceEnd();
    }

private void startOtherServices() {
  ......
    mActivityManagerService.systemReady(() -> {
        Slog.i(TAG, "Making services ready");
        traceBeginAndSlog("StartActivityManagerReadyPhase");
        ......
        try {
            startSystemUi(context, windowManagerF);
        } catch (Throwable e) {
            reportWtf("starting System UI", e);
        }
        ......
   }
}


static final void startSystemUi(Context context, WindowManagerService windowManager) {
    Intent intent = new Intent();
    //所以我们在做定制Systemui时,只需将包名和类名设置为如下即可
    intent.setComponent(new ComponentName("com.android.systemui",
                "com.android.systemui.SystemUIService"));
    intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
    context.startServiceAsUser(intent, UserHandle.SYSTEM);
    windowManager.onSystemUiStarted();
}

2.AndroidMainifest配置

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<!--将App配置为核心App 即最小Framework系统  作用加密机制
当开机检测到系统加密,会把核心App全部启动,并显示UI提示用户输入密码,密码输入正常后,才会启动完整系统-->
    coreApp="true"
    package="com.android.systemui"
    android:sharedUserId="android.uid.system">

<!--常驻App,不会被kill-->
android:persistent="true"

3. SystemUIService中添加window窗口

public class SystemUIService extends BaseService {
	private WindowManager mWindowManager;
    private WindowManager.LayoutParams mLayoutParams;


    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("youdianxiaoshuai", "onCreate())");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    	//这里只是示例加了个顶部状态栏 不同的位置有不同的windowType可以根据自己需求添加
    	mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    	mLayoutParams = new WindowManager.LayoutParams();

        //顶部状态栏   顶部状态栏的windowType
        mLayoutParams.type = WindowManager.LayoutParams.TYPE_STATUS_BAR; // 设置window type

        // 使窗口支持透明度
        mLayoutParams.format = PixelFormat.TRANSPARENT;

        mLayoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        mLayoutParams.flags |= WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
        mLayoutParams.flags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
        mLayoutParams.x = 0;// 以屏幕右上角为原点,设置x、y初始值
        mLayoutParams.y = 0;
        mLayoutParams.width = 1320;// 设置悬浮窗口长宽数据
        mLayoutParams.height = 56;

        mLayoutParams.gravity = Gravity.TOP | Gravity.RIGHT;
        mLayoutParams.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
        mLayoutParams.setTitle("StatusBar");
        mLayoutParams.packageName = mContext.getPackageName();
        
		//这里的view添加布局文件
		mWindowManager.addView(view, mLayoutParams);
        return super.onStartCommand(intent, flags, startId);

    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在 Android 系统中,配置导航栏上滑显示需要对系统 UI 进行相应的设置和操作。一般来说,这个过程需要遵循以下几个步骤: 1. 打开 Android 系统设置,并找到“系统 UI tuner”选项。 2. 进入“System UI Tuner”页面,选择“Navigation bar”选项。 3. 在“Navigation bar”页面,勾选“Swipe up on home button”选项。 4. 接下来,用户可以根据自己的需要选择相应的设置项。比如,可以选择当用户在主屏幕滑动或者点击主屏幕按钮时,导航栏是否应该显示。还可以设置是否需要快速启动 Google 助手或其他应用。另外,还可以设置不同手势触发不同导航栏功能或者更改导航栏的界面样式等。 5. 最后,如果您想要禁用这个特性,只需要在“Navigation bar”页面取消勾选“Swipe up on home button”选项即可。 需要注意的是,以上步骤仅适用于当前运行的 Android 版本中存在“System UI Tuner”选项的设备。此外,一些 Android 设备可能会拥有各自不同的配置选项和界面,所以在实际操作时,最好先了解自己的设备型号和 Android 版本,并参考相应的用户手册或者官方文档。 ### 回答2: Android系统UI配置导航栏上滑显示,主要是通过系统的设置菜单来实现。在大多数的Android设备中,该功能都是默认开启的,但是在某些旧型号的设备上,可能需要手动开启才能使用。 为了开始配置导航栏上滑显示,首先需要进入系统的设置菜单。具体进入方式可能会因设备型号而异,但通常可以通过从主屏幕或应用程序菜单中选择“设置”来进入。 打开设置菜单后,需要找到“显示”或“屏幕”选项。然后,可以在下拉菜单中找到“导航栏”选项,点击进入。 在导航栏设置中,可以看到“导航栏上滑显示”选项。默认情况下,该选项应该是开启状态,但如果不是,可以通过开关按钮来手动开启。 在开启导航栏上滑显示功能后,可以测试它是否正常工作。要测试它,只需要在应用程序或主屏幕中向上滑动,应该会出现导航栏。如果导航栏未出现,可能需要重新启动设备或检查是否有其他应用程序干扰导航栏显示。 需要注意的是,导航栏上滑显示功能在Android系统中的不同版本中可能有所不同。在一些最新的系统版本中,导航栏上滑显示可能已被替换为新的手势导航功能。因此,在进行上述设置时,需要查看设备所运行的Android系统版本,并根据版本进行相应的设置。 ### 回答3: Android 系统 UI 配置导航栏上滑显示是指在 Android 手机或平板设备中,将导航栏的隐藏与显示控制与手势上滑事件进行了关联,使得用户在上滑操作时能够显示或者隐藏底部的导航栏。 在 Android 操作系统中,导航栏通常位于设备底部,用于进行返回、主屏幕、多任务查看等基本操作。原本,导航栏不会自动隐藏,只有在使用全屏模式时才会自动隐藏,但是在 Android 操作系统 4.4(KitKat)版本中,Google 引入了一项新特性,允许用户启用手势上滑操作,使得导航栏能够随着手势上滑自动隐藏,并在需要时进行显示。 要在 Android 设备上启用这个选项,可以通过以下步骤进行配置: 1. 首先,确保您的 Android 设备运行的是 4.4 版本及以上的系统版本。 2. 进入系统设置界面,找到“显示”选项。 3. 在显示选项中,找到“导航栏”选项,点击进入该设置页面。 4. 在导航栏设置页面中,找到“全屏手势”选项,并将其打开。 5. 启用全屏手势之后,您就可以进行手势上滑来显示或隐藏底部的导航栏了。 需要注意的是,启用全屏手势选项后,手势上滑操作就会与设备的“向上滑动以解锁”功能进行了关联,因此您需要在滑动操作后进行解锁才能进入系统界面。 总的来说,Android 系统 UI 配置导航栏上滑显示是一项非常实用的功能,可以提高用户的操作体验、提高屏幕使用率,并适用于绝大多数的 Android 手机和平板设备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值