从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等。下面就以这几个类为出发点来概览下安卓开发的“界面架构”。...再进一步,以ViewTree为整体,再看它和window,系统服务之间的关系可以从整体上把握android中界面框架。...应用层要做的就是准备好Button对象,然后设置好相关布局参数,而Window对象的创建本身最终是通过系统服务完成的。类似Activity那样,Window对象的创建不是new出来的。...窗口类型 前面说过,安卓中的界面划分为一个个窗口,系统运行中各个不同的窗口可以叠加显示。和叠加相关的属性就是Z-ordered,它是正整数。...WindowManagerService 就像Activity的创建一样,Window的创建不是像View那样new出来的。而是通过IPC调用系统服务WindowManagerService完成的。
作者 大家好,我叫小鑫,也可以叫我蜡笔小鑫; 本人17年毕业于中山大学,于2018年7月加入37手游安卓团队,曾经就职于久邦数码担任安卓开发工程师; 目前是37手游安卓团队的海外负责人,负责相关业务开发...本文将介绍几种实现方案,以及我们踩过的坑 1、方案一:应用外悬浮窗+栈顶权限/生命周期回调 通常实现悬浮窗,首先考虑到的会是要使用悬浮窗权限,用WindowManager在设备界面上addView实现(...= new LayoutParams(mWidth, mHeight); params.setMargins(mLeft, mTop, 0, 0); setLayoutParams(params); 通过更新...SqAddFloatView(this, R.mipmap.ic_launcher).show(this) 3、方案三:WindowManager+应用内层级实现 WindowManger中的层级有如下两个...使用WindowManager的updateViewLayout方法 mWindowManager.updateViewLayout(DragViewLayout.this, floatLayoutParams
安卓中最常用的代码可能就是setContentView了,但大家有没有想过这个方法的背后到底做了些什么?...Activity的布局是怎样被系统渲染的 在上一节中我们已经知道了Activity是怎样管理布局的。接着我们来看看Activity中的布局是如何渲染到系统的。...最后使用WindowManager.addView将DecorView添加到了WindowManager中。这样就将DecorView在手机上渲染了出来。...WindowManager.addView方法可以将一个view渲染到手机界面上。不知道大家有没有做过类似悬浮球的应用,就是用WindowManager.addView去实现的。...为什么不能在子线程中操作view 我们都知道,在安卓中必须在ui线程中操作ui,不能在子线程中对view进行操作,否则或抛出CalledFromWrongThreadException异常。
WindowManager Android 中对 Window 的管理都是通过 WindowManager 来完成的,创建 PhoneWindow 之后还会为该 Window 对象设置 WindowManager...通过 Binder 进行 IPC 得到系统服务 WindowsManagerService 在应用进程的远程代理,然后通过 AIDL 通信的方式调用 WMS 的 openSession() 方法得到...DecorView 中,在 onResume 的时候,调用 WindowManager 的 addView 方法将 Window 中的 DecorView 通过 WMS 显示到屏幕上 Activity...Dialog 的 Window 创建过程 同 Activity,实例化 Dialog 对象时创建 PhoneWindow ,show 方法调用时通过 AIDL 调用 WMS 的 addView 方法将...安卓 6.0 添加了对权限的开关设置,悬浮窗权限默认是关闭的 一些国内定制的 Rom 6.0 之前就可以设置权限的开关,悬浮窗权限默认关闭 问题解决 mLayoutParams.type = WindowManager.LayoutParams.TYPE_TOAST
最近在做一个关于屏幕锁屏悬浮窗的功能,于是在网上搜索了很多安卓屏幕锁屏的相关资料,鉴于网上的资料比较零碎,所以我在这里进行整理总结。本文将从以下两点对屏幕锁屏进行解析: 1....如何在锁屏界面弹出悬浮窗 如何监听系统屏幕锁屏 经过总结,监听系统的锁屏可以通过以下两种方式: 1) 代码直接判定 2) 接收广播 1) 代码直接判定 代码判断方式,也有两种方法: a)...Boolean) mReflectScreenState.invoke(pm); } catch (Exception e) { e.printStackTrace() } 2) 接收广播 当安卓系统锁屏或者屏幕亮起...竟然知道了对于系统屏幕监听的方法,那么接下来就是要在屏幕锁屏的时候,弹出悬浮框了,这个的实现方式有两种: 1) 使用WindowManager 2) 使用Activity 目前情况是,使用这两种方式在真机上都可以实现...,如果网友们发现有问题,可以在博客中留言 1) 使用WindowManager 代码如下: private void init(Context mContext) { this.mContext
安卓环境变量配置 系统变量 变量名:ANDROID_HOME 变量值:D:\Android\android-sdk-windows Path中增加:%ANDROID_HOME%\platform-tools...); playIntent.setDataAndType(uri, "video/mp4"); startActivity(playIntent); ----------调用安卓编写的播放器...RelativeLayout.LayoutParams( -1, -1); this.weidianyingLayout.setGravity(17); this.weidianyingLayout.addView...setUseWideViewPort(true); wv.getSettings().setLoadWithOverviewMode(true); ------------------android向服务器发送...(如:google player、豌豆荚、360手机助手等),让您选择。
.Linux kernel 加载硬件驱动 如硬件驱动/显示驱动/输入驱动/媒体驱动 硬件抽象层解决并适配不同驱动标准,为上层应用提供统一的api 3.C++ framework 创建linux中的第一个用户进程...是由C++代码通过类加载机制加载的,最终调用到了ZygoteInit.java的实例方法 ZygoteInit.java中main方法会启动SystemServer系统服务进程 SystemServer...5.Apps 所有的系统服务都创建成功之后,会执行Launcher启动流程 2....个 AMS 四大组建调度服务(安卓10之后Activity调度交给ATMS) Activity Task Manager Service 安卓10之后Activity调度服务 PKMS 安装,卸载,扫描管理等...Application对象,调用onCreate函数 通过AMS(ATMS)再次启动Activity,进程创建时未启动的那个Activity会恢复继续创建 在ActivityThread中以反射形式创建
安卓版微信跳一跳辅助,java实现,具体内容如下 ? 已经看到网上有大神用各种方式实现了,我这是属于简易版ADB命令式实现。...具体实现 本人的测试设备是Mate9,android版本为7.0,由于在非Root环境下,普通安卓应用并不能通过Runtime.getRuntime().exec()来点击本应用外的区域,所以将手机直接通过...源代码 源代码非常简单,就直接放在这里了 //写在安卓APP中的起跳 public class Jump { private static final String TAG = "Jump"; private...设置连接主机超时时间 urlConn.setConnectTimeout(5 * 1000); //设置从主机读取数据超时 urlConn.setReadTimeout(5 * 1000); // 设置是否使用缓存...urlConn.setRequestProperty("Content-Type", "application/json"); //设置客户端与服务连接类型 urlConn.addRequestProperty
2.正文 天才少年_来到一家公司等待面试中。。。 一个眼睛又大又亮的小姐姐,萌萌的站在我去 的面前。...,makeVisible调用了WindowManager的addView方法,WindowManager是个接口,他的具体实现类是WindowManagerImp,直接看WindowManagerImp...ViewRootImpl对象,后面View的刷新正是通过ViewRootImpl实现的,由于你面试官没有问,这边不展开讨论,不然把我留到天黑,面试官可能有危险,嘿嘿。...赠送一个知识点:真正把mDecor加到WindowManager上是并显示出来在makeVisible()方法中实现的,Activity的Window才能正在被使用。...2)安卓系统中,操作viwe对象没有加锁,所以如果在子线程中更新UI,会出现多线程并发的问题,导致页面展示异常。 小伙子分析得很不错,把我打动了,回去等offer吧。
childView = parent.getChildAt(i); if (childView instanceof ViewGroup) { //调用此方法系统会默认设置...paddingTop高度的view用于沉浸式状态栏 childView.setFitsSystemWindows(true); //不影响滑动效果(如ListView...View,在代码中动态改变高度,把它变成statusBar高度,不需要设置FitsSystemWindows,这种方法侵入性更高,不推荐使用 方法1中的完整方法如下: private static...fakeStatusBarView.setBackgroundColor(calculateStatusColor(color, statusBarAlpha)); } else { decorView.addView... 另外,如果我们想要修改状态栏的字体颜色和图标颜色,需要安卓
完成) Window是一个抽象类,唯一实现类是PhoneWindow 创建Window需要通过WindowManager创建,WindowManager是外界访问Window的入口 Window具体实现位于...建立联系 Window并不是实际存在的,而是以View的形式存在 WindowManager的三个接口方法也是针对View的 实际使用中无法直接访问Window,必须通过WindowManager View...系统窗口,不需要对应任何Activity,如:状态栏,导航栏,普通应用程序不能创建系统窗口,必须要有系统应用权限.(层级2000~2999)。...11、Token的使用场景? Activity创建时,AMS中需要根据Token去找到对应的ActivityRecord。...中并显示——在Dialog的show方法中,通过WindowManager将DecorView添加到Window中(mWindowManager.addView(mDecor, 1)) Dialog关闭时会通过
安卓逆向系列教程 4.2 分析锁机软件 作者:飞龙 这个教程中我们要分析一个锁机软件。像这种软件都比较简单,完全可以顺着入口看下去,但我这里还是用关键点来定位。...我们往下看看便可知道,这个软件启动之后就创建了一个服务,服务中获取了WindowsManager,然后加载了一个LinearLayout并添加它,来实现锁屏的效果: private void createFloatView...(); this.mWindowManager = ((WindowManager)localApplication.getSystemService(Context.WINDOW_SERVICE...LayoutInflater.from(getApplication()).inflate(2130903041, (ViewGroup)null)); this.mWindowManager.addView...参考 软件来源:21、安卓逆向 - 分析锁机软件
创建Window,通过WindowManager即可完成。WindowManager是操作Window的入口,Window的具体实现是在WindowManagerService中。...应用window对应activity;子window要依附在父window上,如dialog;系统window需要申明权限才能创建,比如toast、系统状态栏。...view,实际使用的就是这三个方法,上面创建window的例子用的就是addView方法。...一个window就对应一个view,window操作view实际是通过ViewRootImpl实现。使用中是通过WindowManager对的操作,无法直接访问window。...; restoreSoftInputMode = true; } //使用WindowManager.addView mWindowManager.addView
系统Window:z-index在2000~2999之间,它往往需要声明权限才能创建,例如Toast、状态栏、系统音量条、错误提示框都是系统Window。...第三种:采用服务Service,然后在Service中采用WindowManager添加和移除View操作。那么在Activity中想要展示弹窗则需要通过广播通信,让Service收到广播处理逻辑。...当APP通过WindowManagerService的代理向其添加窗口的时候,WindowManagerService除了自己进行登记整理,还需要向SurfaceFlinger服务申请一块Surface...3.3 应用悬浮窗应用内悬浮窗实现流程1.获取WindowManager;2.创建悬浮View;3.设置悬浮View的拖拽事件;4.添加View到WindowManager中对于应用悬浮窗来说,Android...中申请权限,为了防止用户手动在设置中取消权限,需要在每次使用时check一下是否有悬浮窗权限存在;Settings.canDrawOverlays(this)当API > 25时,系统直接禁止用户使用TYPE_TOAST
Window的具体实现在WindowManagerService中,但是创建Window或者访问Window的操作都需要WindowManager。...不能单独存在,需要附属在特定的父Window之中(如Dialog就是子Window),Window层级为1000~1999。 系统Window。...拥有token的context可以创建界面、进行UI操作,而没有token的context如service、Application,是不允许添加view到屏幕上的。...//获取了WindowManager对象,mContext一般是个Activity,获取系统服务一般是通过Binder获取 mWindowManager = (WindowManager...然后获取Dialog自己的DecorView对象,并通过addView方法添加到WindowManager对象中,Dialog出现到屏幕上。
窗口的Z次序管理:窗口的分配序号、次序调整等 WMS中窗口次序分配如何影响SurfaceFlinger服务 在WMS窗口添加一文中分析过,窗口的添加是通过WindowManagerGlobal.addView...中,并且为Activity创建APPWindowToken。...将来Activity通过getSystemService获取WindowManager服务的时候,其实是直接返回了Window的WindowManagerImpl, @Override public Object...到这一步,Activity已经准备完毕,剩下的就是在resume中通过addView将窗口添加到到WMS,具体实现在ActivityThread的handleResumeActivity函数中: final...,换句话说,必须使用Activity内部的WindowManagerImpl进行addView才可以。
活动是安卓开发比较重要的东西,是用户交互和数据的入口。本篇博客要介绍的内容是活动的创建,活动的跳转与值的透传。...iOS中的ViewController也是有自己的生命周期的,了解Activity或者ViewController的生命周期是很有必要的,本文将详细的给大家介绍关于Android中activity从创建到显示的相关内容...Activity的创建 Activity的创建以及初始化的过程是在ActivityThread#performLaunchActivity方法中,在这个方法中,有以下几个关键点, 创建Activity...addView wm.addView(decor, l); 这里的wm是WindowManager,是在attach法法中,通过setWindowManager来实现初始化的,对应的实例为WindowManagerImpl...那么,我们去看下WindoeManageImpl的addView方法,在这个方法中,直接调用WindowManagerGlobal的addView方法,我们关心的中点转移了。
App在没有悬浮窗权限下,不能添加系统级窗口,但却可以显示Toast。这说明Toast不在悬浮窗权限控制下,系统中某些机制保证了Toast的显示。...Toast.makeText方法创建的Toast中,nNextView是一个包含TextView的LinearLayout。...(windowManager); } return super.getSystemService(name); } } 3、使用FakeContext创建一个View,并以该View发起一个Toast...适配情况 1、由于Toast机制依赖于NMS,部分机型需要开启通知栏权限才能使用Toast; 2、部分机型在App界面外无法使用Toast,如:OPPO; 3、部分机型在App界面外Toast流程正常执行...,但Toast窗口不会显示,如:Vivo; 4、之前也有直接使用TYPE_TOAST进行addView()添加窗口的做法,但Android8.0之后TYPE_TOAS窗口需要NMS发放的一个token,
在measure完成后,可以通过getMeasuredWidth/Height()方法,就能获得View的测量宽高 在一定极端情况下,系统需要多次measure,因此得到的值可能不准确,最好的办法是在onLayout...方法中获得测量宽/高或者最终宽/高 6、如何在Activity启动时获得View的宽/高?...) WindowManager.addView(decor, 1) WindowManager.addView(decor, 1)本质是调用WindowManagerGlobal的addView方法。...onDraw中避免冗余代码、避免创建对象 onDraw中禁止new对象。如:不应该在ondraw中创建Paint对象。Paint类提供了reset方法。可以在初始化View时创建对象。...减少冗余代码 不要使用Handler,因为已经有post系列方法,View已经有post系列方法,没有必要重复去写,可以直接使用,最终会投递到主线程的Handler中 使用的线程和动画,要在onDetachedFromWindow
而 Window 类把一些交互从 View/ViewGroup 中抽离出来,定义了一些窗口的行为,例如菜单,以及处理系统按钮, 如“Home”,“Back”等等。...但是,Framework 还是定义了一些,可以被应用所创建的系统窗口,如 TYPE_TOAST,TYPE _INPUT_ METHOD,TYPE _WALLPAPTER 等等。 ?...但是,分析 FrameWork 所提供的一些窗口的显示,如 Dialog 等,并没有看到在调用 addView 之前,对 token 赋值呢。...3.2 子窗口的创建 对于 WmS 来讲,无论什么样的窗口创建,最终都是通过 WindowManagerImpl 的 addView,来添加一个 View。...添加一个窗口,就是通过 WindowManager 的 addView 方法。同样的,移除一个窗口,就是通过 removeView 方法。
领取专属 10元无门槛券
手把手带您无忧上云