Android使用WindowManager覆盖状态栏

Android 13 SystemUI定制实战:如何彻底隐藏导航栏和状态栏(附完整代码) 本文详细解析了Android 13 SystemUI的架构原理,并提供了多种隐藏导航栏和状态栏的完整方案,包括代码修改、WindowManager策略和系统属性覆盖。通过实战案例和避坑经验,帮助开发者实现深度定制,适用于Kiosk模式、数字标牌等商业场景。 阅读详情

由于业务需要,现在需要用一个自定义的View来弹出覆盖住状态栏,并且设置一定时间后可以自动消失,同时在这个View中,也可以使用按钮来关闭View,使它消失。

现在从WindowManager开始入手,先是得到WindowManager实例,然后在设置LayoutParams的属性,这个LayoutParams比较坑爹,属性非常多,一开始就是因为属性设置错误无法实现覆盖状态栏效果。最后面把LayoutParams的属性都列出来了。一开始,设定TYPE为TYPE_SYSTEM_OVERLAY,这个是系统的顶级窗口,理所当然能够覆盖状态栏,但是运行之后发现自定义的View无法得到焦点,也就无法相应事件,查官方API得知,

Window type: system overlay windows, which need to be displayed on top of everything else. These windows must not take input focus, or they will interfere with the keyguard. In multiuser systems shows only on the owning user's window.

也就是说这个是系统最顶层的窗口,需要被显示在一切的上面,它无法获得输入焦点。所以是无法得到焦点的。一开始脑子没转过来弯,我用了另一种方法实现了需求。

我让TYPE为TYPE_SYSTEM_ALERT,这个是系统提示窗,但是是无法覆盖住状态栏的,我用在windowmanager.add();方法之前把系统状态栏隐藏了,然后这个自定义的View就“实现”了覆盖状态栏,View消失的时候在让这个状态栏显示回来。

后来我知道了TYPE_SYTEM_ERROR,这个属性是可以获得焦点,并且相应事件的。下面把代码贴一下。

import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;

public class MainActivity extends Activity {
	private WindowManager windowManager;
	private Button btn;
	private Button cancelBtn;
	private View pushView;
	private MyHandler handler;
	private Timer timer;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.fragment_main);
		pushView = LayoutInflater.from(getApplicationContext()).inflate(
				R.layout.push, null);

		btn = (Button) findViewById(R.id.btn);
		cancelBtn = (Button) pushView.findViewById(R.id.cancelBtn);
		windowManager = getWindowManager();
		handler = new MyHandler();

		cancelBtn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				windowManager.removeView(pushView);
				timer.cancel();
			}
		});

		btn.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				WindowManager.LayoutParams params = new WindowManager.LayoutParams(
						WindowManager.LayoutParams.MATCH_PARENT,
						WindowManager.LayoutParams.WRAP_CONTENT,
						WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
						WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
								| WindowManager.LayoutParams.FLAG_FULLSCREEN,
						PixelFormat.TRANSLUCENT);

				params.gravity = Gravity.TOP | Gravity.LEFT;
				params.y = 0;
				params.x = 0;

				windowManager.addView(pushView, params);
				timer = new Timer();
				timer.schedule(new TimerTask() {

					@Override
					public void run() {
						Message msg = handler.obtainMessage();
						handler.sendEmptyMessage(0x123);
					}
				}, 5000);

			}
		});

	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		windowManager.removeView(pushView);
	}

	public class MyHandler extends Handler {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if (msg.what == 0x123) {
				windowManager.removeView(pushView);
			}
		}
	}

}

属性及可用的常量定义


1. public int x;
   如果忽略gravity属性,那么它表示窗口的绝对X位置。
   什么是gravity属性呢?简单地说,就是窗口如何停靠。
   当设置了 Gravity.LEFT 或 Gravity.RIGHT 之后,x值就表示到特定边的距离。
 
2. public int y;
   如果忽略gravity属性,那么它表示窗口的绝对Y位置。
   当设置了 Gravity.TOP 或 Gravity.BOTTOM 之后,y值就表示到特定边的距离。
 
3. public float horizontalWeight;
   public float verticalWeight;
   在纵/横向上,为关联的view预留了多少扩展空间(像素)。如果是0,那么此view不能被拉伸。
   其他情况下,扩展空间(像素)将被widget所均分。
4. public int type;
窗口类型。有3种主要类型:
Applicationwindows:
        取值在 FIRST_APPLICATION_WINDOW 和 LAST_APPLICATION_WINDOW 之间。
        是通常的、顶层的应用程序窗口。必须将 token 设置成 activity 的 token 。
Sub_windows:
        取值在 FIRST_SUB_WINDOW 和 LAST_SUB_WINDOW 之间。
        与顶层窗口相关联,token 必须设置为它所附着的宿主窗口的 token。
Systemwindows:
        取值在 FIRST_SYSTEM_WINDOW 和 LAST_SYSTEM_WINDOW 之间。
        用于特定的系统功能。它不能用于应用程序,使用时需要特殊权限。
 
下面定义了 type 的取值: 
      应用程序窗口。
      public static final int FIRST_APPLICATION_WINDOW = 1;
      
      所有程序窗口的“基地”窗口,其他应用程序窗口都显示在它上面。     
      public static final int TYPE_BASE_APPLICATION   =1;       
    
      普通应哟功能程序窗口。token必须设置为Activity的token,以指出该窗口属谁。
      public static final int TYPE_APPLICATION       = 2;
       用于应用程序启动时所显示的窗口。应用本身不要使用这种类型。
      它用于让系统显示些信息,直到应用程序可以开启自己的窗口。   
      public static final int TYPE_APPLICATION_STARTING = 3;
       
      应用程序窗口结束。
      public static final int LAST_APPLICATION_WINDOW = 99;


      子窗口。子窗口的Z序和坐标空间都依赖于他们的宿主窗口。
      public static final int FIRST_SUB_WINDOW       = 1000;


      面板窗口,显示于宿主窗口上层。
      public static final int TYPE_APPLICATION_PANEL  = FIRST_SUB_WINDOW;


      媒体窗口,例如视频。显示于宿主窗口下层。
      public static final int TYPE_APPLICATION_MEDIA  = FIRST_SUB_WINDOW+1;


      应用程序窗口的子面板。显示于所有面板窗口的上层。(GUI的一般规律,越“子”越靠上)
      public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW +2;


      对话框。类似于面板窗口,绘制类似于顶层窗口,而不是宿主的子窗口。
      public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW +3;


      媒体信息。显示在媒体层和程序窗口之间,需要实现透明(半透明)效果。(例如显示字幕)
      public static final int TYPE_APPLICATION_MEDIA_OVERLAY  = FIRST_SUB_WINDOW +4;


      子窗口结束。( End of types of sub-windows )
      public static final int LAST_SUB_WINDOW        = 1999;


      系统窗口。非应用程序创建。
      public static final int FIRST_SYSTEM_WINDOW    = 2000;


      状态栏。只能有一个状态栏;它位于屏幕顶端,其他窗口都位于它下方。
      public static final int TYPE_STATUS_BAR        =  FIRST_SYSTEM_WINDOW;


      搜索栏。只能有一个搜索栏;它位于屏幕上方。
      public static final int TYPE_SEARCH_BAR        = FIRST_SYSTEM_WINDOW+1;


      电话窗口。它用于电话交互(特别是呼入)。它置于所有应用程序之上,状态栏之下。
      public static final int TYPE_PHONE            = FIRST_SYSTEM_WINDOW+2;


      系统提示。它总是出现在应用程序窗口之上。
      public static final int TYPE_SYSTEM_ALERT      =  FIRST_SYSTEM_WINDOW +3;


      锁屏窗口。
      public static final int TYPE_KEYGUARD          = FIRST_SYSTEM_WINDOW +4;


      信息窗口。用于显示toast。
      public static final int TYPE_TOAST            = FIRST_SYSTEM_WINDOW +5;


      系统顶层窗口。显示在其他一切内容之上。此窗口不能获得输入焦点,否则影响锁屏。
      public static final int TYPE_SYSTEM_OVERLAY    =  FIRST_SYSTEM_WINDOW +6;


      电话优先,当锁屏时显示。此窗口不能获得输入焦点,否则影响锁屏。
      public static final int TYPE_PRIORITY_PHONE    =  FIRST_SYSTEM_WINDOW +7;


      系统对话框。(例如音量调节框)。
      public static final int TYPE_SYSTEM_DIALOG     =  FIRST_SYSTEM_WINDOW +8;


      锁屏时显示的对话框。
      public static final int TYPE_KEYGUARD_DIALOG   =  FIRST_SYSTEM_WINDOW +9;


      系统内部错误提示,显示于所有内容之上。
      public static final int TYPE_SYSTEM_ERROR      =  FIRST_SYSTEM_WINDOW +10;


      内部输入法窗口,显示于普通UI之上。应用程序可重新布局以免被此窗口覆盖。
      public static final int TYPE_INPUT_METHOD      =  FIRST_SYSTEM_WINDOW +11;


      内部输入法对话框,显示于当前输入法窗口之上。
      public static final int TYPE_INPUT_METHOD_DIALOG= FIRST_SYSTEM_WINDOW +12;


      墙纸窗口。
      public static final int TYPE_WALLPAPER         = FIRST_SYSTEM_WINDOW +13;


      状态栏的滑动面板。
      public static final int TYPE_STATUS_BAR_PANEL   = FIRST_SYSTEM_WINDOW +14;


      系统窗口结束。
      public static final int LAST_SYSTEM_WINDOW     = 2999;




5. public int memoryType;
   指出窗口所使用的内存缓冲类型。默认为 NORMAL 。
 
下面定义了 memoryType 的取值:
      窗口缓冲位于主内存。
      public static final int MEMORY_TYPE_NORMAL = 0;


      窗口缓冲位于可以被DMA访问,或者硬件加速的内存区域。
      public static final int MEMORY_TYPE_HARDWARE = 1;


      窗口缓冲位于可被图形加速器访问的区域。
      public static final int MEMORY_TYPE_GPU = 2;


      窗口缓冲不拥有自己的缓冲区,不能被锁定。缓冲区由本地方法提供。
      public static final int MEMORY_TYPE_PUSH_BUFFERS = 3;


6.  public int flags;
     行为选项/旗标,默认为 none .
 
下面定义了 flags 的取值:
      窗口之后的内容变暗。
      public static final int FLAG_DIM_BEHIND       = 0x00000002;


      窗口之后的内容变模糊。
      public static final int FLAG_BLUR_BEHIND       = 0x00000004;
    
      不许获得焦点。
      不能获得按键输入焦点,所以不能向它发送按键或按钮事件。那些时间将发送给它后面的可以获得焦点的窗口。此选项还会设置FLAG_NOT_TOUCH_MODAL选项。设置此选项,意味着窗口不能与软输入法进行交互,所以它的Z序独立于任何活动的输入法(换句话说,它可以全屏显示,如果需要的话,可覆盖输入法窗口)。要修改这一行为,可参考FLAG_ALT_FOCUSALBE_IM选项。
      public static final int FLAG_NOT_FOCUSABLE     = 0x00000008;
      不接受触摸屏事件。
      public static final int FLAG_NOT_TOUCHABLE     = 0x00000010;


      当窗口可以获得焦点(没有设置 FLAG_NOT_FOCUSALBE 选项)时,仍然将窗口范围之外的点设备事件(鼠标、触摸屏)发送给后面的窗口处理。否则它将独占所有的点设备事件,而不管它们是不是发生在窗口范围内。
      public static final int FLAG_NOT_TOUCH_MODAL   = 0x00000020;


      如果设置了这个标志,当设备休眠时,点击触摸屏,设备将收到这个第一触摸事件。
      通常第一触摸事件被系统所消耗,用户不会看到他们点击屏幕有什么反应。
      public static final int FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040;


      当此窗口为用户可见时,保持设备常开,并保持亮度不变。
      public static final int FLAG_KEEP_SCREEN_ON    = 0x00000080;


      窗口占满整个屏幕,忽略周围的装饰边框(例如状态栏)。此窗口需考虑到装饰边框的内容。
      public static final int FLAG_LAYOUT_IN_SCREEN   =0x00000100;


      允许窗口扩展到屏幕之外。
      public static final int FLAG_LAYOUT_NO_LIMITS   =0x00000200;


      窗口显示时,隐藏所有的屏幕装饰(例如状态条)。使窗口占用整个显示区域。
      public static final int FLAG_FULLSCREEN     = 0x00000400;


      此选项将覆盖FLAG_FULLSCREEN选项,并强制屏幕装饰(如状态条)弹出。
      public static final int FLAG_FORCE_NOT_FULLSCREEN   =0x00000800;


      抖动。指 对半透明的显示方法。又称“点透”。图形处理较差的设备往往用“点透”替代Alpha混合。
      public static final int FLAG_DITHER           = 0x00001000;


      不允许屏幕截图。
      public static final int FLAG_SECURE           = 0x00002000;


      一种特殊模式,布局参数用于指示显示比例。
      public static final int FLAG_SCALED           = 0x00004000;


      当屏幕有可能贴着脸时,这一选项可防止面颊对屏幕造成误操作。
      public static final int FLAG_IGNORE_CHEEK_PRESSES   = 0x00008000;


      当请求布局时,你的窗口可能出现在状态栏的上面或下面,从而造成遮挡。当设置这一选项后,窗口管理器将确保窗口内容不会被装饰条(状态栏)盖住。
      public static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000;


      反转FLAG_NOT_FOCUSABLE选项。
      如果同时设置了FLAG_NOT_FOCUSABLE选项和本选项,窗口将能够与输入法交互,允许输入法窗口覆盖;
      如果FLAG_NOT_FOCUSABLE没有设置而设置了本选项,窗口不能与输入法交互,可以覆盖输入法窗口。
      public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000;


      如果你设置了FLAG_NOT_TOUCH_MODAL,那么当触屏事件发生在窗口之外事,可以通过设置此标志接收到一个MotionEvent.ACTION_OUTSIDE事件。注意,你不会收到完整的down/move/up事件,只有第一次down事件时可以收到ACTION_OUTSIDE。
      public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;


      当屏幕锁定时,窗口可以被看到。这使得应用程序窗口优先于锁屏界面。可配合FLAG_KEEP_SCREEN_ON选项点亮屏幕并直接显示在锁屏界面之前。可使用FLAG_DISMISS_KEYGUARD选项直接解除非加锁的锁屏状态。此选项只用于最顶层的全屏幕窗口。
      public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;


      请求系统墙纸显示在你的窗口后面。窗口必须是半透明的。
      public static final int FLAG_SHOW_WALLPAPER = 0x00100000;


      窗口一旦显示出来,系统将点亮屏幕,正如用户唤醒设备那样。
      public static final int FLAG_TURN_SCREEN_ON = 0x00200000;


      解除锁屏。只有锁屏界面不是加密的才能解锁。如果锁屏界面是加密的,那么用户解锁之后才能看到此窗口,除非设置了FLAG_SHOW_WHEN_LOCKED选项。
      public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;


      锁屏界面淡出时,继续运行它的动画。
      public static final int FLAG_KEEP_SURFACE_WHILE_ANIMATING =0x10000000;


      以原始尺寸显示窗口。用于在兼容模式下运行程序。
      public static final int FLAG_COMPATIBLE_WINDOW = 0x20000000;


      用于系统对话框。设置此选项的窗口将无条件获得焦点。
      public static final int FLAG_SYSTEM_ERROR = 0x40000000;


7. public int softInputMode;
   软输入法模式选项:
以下选项与 softInputMode 有关:
      软输入区域是否可见。
      public static final int SOFT_INPUT_MASK_STATE = 0x0f;


      未指定状态。
      public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0;


      不要修改软输入法区域的状态。
      public static final int SOFT_INPUT_STATE_UNCHANGED = 1;


      隐藏输入法区域(当用户进入窗口时)。
      public static final int SOFT_INPUT_STATE_HIDDEN = 2;


      当窗口获得焦点时,隐藏输入法区域。
      public static final int SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3;


      显示输入法区域(当用户进入窗口时)。
      public static final int SOFT_INPUT_STATE_VISIBLE = 4;


      当窗口获得焦点时,显示输入法区域。
      public static final int SOFT_INPUT_STATE_ALWAYS_VISIBLE = 5;


      窗口应当主动调整,以适应软输入窗口。
      public static final int SOFT_INPUT_MASK_ADJUST = 0xf0;


      未指定状态,系统将根据窗口内容尝试选择一个输入法样式。
      public static final int SOFT_INPUT_ADJUST_UNSPECIFIED = 0x00;


      当输入法显示时,允许窗口重新计算尺寸,使内容不被输入法所覆盖。
      不可与SOFT_INPUT_ADJUSP_PAN混合使用,如果两个都没有设置,系统将根据窗口内容自动设置一个选项。
      public static final int SOFT_INPUT_ADJUST_RESIZE = 0x10;


      输入法显示时平移窗口。它不需要处理尺寸变化,框架能够移动窗口以确保输入焦点可见。
      不可与SOFT_INPUT_ADJUST_RESIZE混合使用;如果两个都没设置,系统将根据窗口内容自动设置一个选项。
      public static final int SOFT_INPUT_ADJUST_PAN = 0x20;


      当用户转至此窗口时,由系统自动设置,所以你不要设置它。
      当窗口显示之后该标志自动清除。
      public static final int SOFT_INPUT_IS_FORWARD_NAVIGATION = 0x100;
 
8. public int gravity;
  gravity 属性。什么是gravity属性呢?简单地说,就是窗口如何停靠。
9. public float horizontalMargin;
  水平边距,容器与widget之间的距离,占容器宽度的百分率。
10. public float verticalMargin;
   纵向边距。
11. public int format;
期望的位图格式。默认为不透明。参考android.graphics.PixelFormat。
 
12. public int windowAnimations;
窗口所使用的动画设置。它必须是一个系统资源而不是应用程序资源,因为窗口管理器不能访问应用程序。
13. public float alpha = 1.0f;
整个窗口的半透明值,1.0表示不透明,0.0表示全透明。
14. public float dimAmount = 1.0f;
当FLAG_DIM_BEHIND设置后生效。该变量指示后面的窗口变暗的程度。
1.0表示完全不透明,0.0表示没有变暗。
15. public float screenBrightness = -1.0f;
用来覆盖用户设置的屏幕亮度。表示应用用户设置的屏幕亮度。
从0到1调整亮度从暗到最亮发生变化。
 
16. public IBinder token = null;
窗口的标示符。( Identifier for this window. This will usually be filled in for you. )
17. public String packageName = null;
此窗口所在的包名。
18. public int screenOrientation =ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
 屏幕方向,参见android.content.pm.ActivityInfo#screenOrientation。
 
19. 在兼容模式下,备份/恢复参数所使用的内部缓冲区。
public int[] mCompatibilityParamsBackup = null;

Android12车机开发实战:如何优雅隐藏状态栏和Dock栏(附手势唤醒方案) 本文详细介绍了在Android12车机开发中如何优雅隐藏状态栏和Dock栏,并实现手势唤醒功能。通过分析系统UI组件层级和WindowManager参数,提供了Activity级和Service级两种全屏实现方案,并针对不同厂商定制ROM给出了适配建议。最后还探讨了手势唤醒的精细控制实现和性能优化技巧,为车载应用开发者提供了一套完整的全屏交互解决方案。 阅读详情

相关推荐

SystemUI深度定制:从交互逻辑到视觉风格的全方位改造

本文深入探讨了Android SystemUI的深度定制方法,从核心架构解析到交互逻辑改造、视觉风格定制及高级源码层改造实战。通过实际案例展示了如何优化手势识别、动效曲线、动态主题引擎等关键功能,并提供了跨版本兼容和性能优化的实用技巧,帮助开发者实现从交互到视觉的全方位SystemUI定制。

weixin_29194817的博客 341

dialog全屏并覆盖状态栏

项目开发中遇到一个问题,全屏弹窗写一个activity的话流程变得比较复杂,所以想用dialog实现全屏并且覆盖状态栏的需求, 开始写的时候发现状态栏怎么都覆盖不上,然后最后找到一个属性。 全屏覆盖状态栏显示加上以下代码:  window.setType(WindowManager.LayoutParams.TYPE_APPLICATION_PANEL);  window.setFlags(W...

qq_25409587的博客 8693

Android kotlin全局悬浮窗全屏功能和锁屏页面全屏悬浮窗功能二

在进行app应用开发中,在实现某些功能中要求实现悬浮窗功能,分为应用内悬浮窗 ,全局悬浮窗和 锁屏页面悬浮窗功能 等,接下来就来实现这些悬浮窗全屏功能,首选看下第二部分功能实现

安卓兼职framework和app工程师的博客 2124

弹出Dialog时隐藏状态栏和底部导航栏

private void fullScreenImmersive(View view) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE.

陈立的博客 1369

Dialog全屏,去掉状态栏的方式

主要介绍了Dialog全屏,去掉状态栏的方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Python爬虫实战(基础篇)—23—爬取微信小程序<随机目的地旅行>生成随机地址(附GUI版)

爬取微信小程序<随机目的地旅行>生成随机地址

weixin_42636075的博客 1228

解决全屏Activity弹出Dialog 状态栏出现的问题

开发中通常要用到全屏显示,然而弹出dialog时,状态栏也会弹出来遮挡顶部一部分内容,很是不爽。 优雅的解决方式: 给dialog设置主题 如下: <style name="MaterialDialogSheet" parent="@android:style/Theme.Dialog"> <item name="android:windowIsTranslucent">true</item> <item name="android:wind

zhangjiawei0的专栏 2649

Python爬虫实战:5分钟搞定Web of Science文献批量导出与解析(附完整代码)

本文提供了一套利用Python爬虫技术,快速实现Web of Science文献批量提取与解析的完整方案。通过解析官方导出的HTML文件,结合BeautifulSoup和pandas库,可将文献数据自动转换为结构化的Excel/CSV表格,帮助科研人员高效管理文献信息,节省大量手动整理时间。

weixin_29050513的博客 1166

安卓SplashActivity刘海屏 全屏显示方法

setContentView(R.layout.activity_spla); //全屏显示 getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); WindowManager.LayoutParams lp = getWindow().getAttribu...

代码是贝多芬的音符 779

告别误唤醒!S32K3xx低功耗设计避坑指南:Fast Standby模式与WISR寄存器操作详解

本文深入解析了NXP S32K3xx系列MCU在低功耗设计中常见的误唤醒问题,并提供了基于Fast Standby模式的解决方案。文章重点剖析了DCMRWF5寄存器的配置方法、WISR/WISR_64唤醒中断状态寄存器的标志位处理策略,以及如何利用32KB Standby SRAM保存唤醒状态,从而帮助开发者构建稳定可靠的汽车电子低功耗系统。

weixin_29163857的博客 362

AgentFlow:模块化智能体框架与Flow-GRPO强化学习实战解析

在人工智能领域,大语言模型(LLM)与智能体(Agent)技术正推动着自动化任务处理的发展。其核心原理在于通过规划、执行与反馈的循环,使AI系统能够自主调用工具解决复杂问题。这一技术的价值在于突破单一模型的局限性,实现更可靠的多步骤推理。在实际应用中,智能体框架需要处理搜索、代码执行、数学计算等多种场景。本文聚焦的AgentFlow框架,正是通过模块化设计将智能体拆分为规划者、执行者、验证者和生成者四个专家模块,并引入Flow-GRPO强化学习算法进行流程内优化。该框架在搜索增强与工具调用等任务上展现出显著

weixin_42311427的博客 369

悬浮view覆盖状态栏

int titleBarHeight = ScreenUtil.getStatusBarHeight(mContext); int titleHeight = ScreenUtil.dp2Px(mContext,44); WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams( WindowMan

asijack的专栏 2563

git clone出现fatal: unable to access Failed to connect to github.com port 443: Timed out解决方案

本文主要介绍了git clone出现fatal: unable to access Failed to connect to github.com port 443: Timed out解决方案,希望能对使用git的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 23万+

霸屏view实现

因为平日做的都是系统工具,难免调用系统功能完成需求,如调起setting页面删除数据等,此时为让用户对功能操作无感知,需要将顶栏和底部虚拟按键都要挡住,将view覆盖整个可见页面就是将要做的霸屏。 1.沉浸模式:Android沉浸式模式的本质就是全屏 那么对应到Android操作系统上面,怎样才算是沉浸式体验呢?这个可能在大多数情况下都是用不到的,不过在玩游戏或者看电影的时候就非常重要

hxiaxuetian的博客 2798

【模型实战】MiMo-VL-7B讲解与实战

维度成绩MMMU70.6(图像理解最难测试之一)VideoMME70.8(视频理解标杆)59.4(超越78B参数模型)56.1(超过专用GUI模型)Elo评分开源VLM排名第一(7B~72B)社区热度过去一个月下载超1,600次(RL+SFT)📌一句话概括MiMo-VL 是目前性能最强、推理最稳、体验最佳、生态最全的7B级开源视觉语言模型。

m0_47867638的博客 1199

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

Autosar CAN 网络管理测试用例(3)——Repeat Message Timer 时间测试

蚂蚁小兵 2466

android 显示/隐藏状态栏(Status bar)

4.0及以下两种方法 1,通过特定的主题,如Theme.Black.NoTitleBar.Fullscreen. 2,通过代码  在Activity中 隐藏状态栏:getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 显示

itjinks的专栏 7623

麒麟v10系统安装

麒麟v10系统安装

喜文BLOG 1万+

Android之禁用系统栏(StatusBar)

场景手机管理软件的一部分:在某个时候需要输入自定义密码才能使用手机。这时候要禁用 Home 键,可以采取策略 + AccessibilityService的onKeyEvent屏蔽 Home + 一个附件在WindowManager上的浮层然后下一步是屏蔽用户用手势下拉系统栏(StatusBar)目标在限制模式下,禁止用户下拉显示状态栏从而进行其他操作决策全局窗口 - 失败Act

stwstw0123的专栏 1094

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

搭建直播平台,Android开发之禁止下拉通知栏的方法

思路:在状态栏上覆盖一层透明view,点击时,直接消费掉,禁止继续往下传递,接触不到状态栏,就拉不出来,比较笨的一个办法,但是也挺有效。以上就是 搭建直播平台,Android开发之禁止下拉通知栏的方法,更多内容欢迎关注之后的文章。搭建直播平台,Android开发之禁止下拉通知栏的方法。

云豹网络科技 431

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

使用悬浮窗实现护目镜全屏显示

创建悬浮窗服务这不细说了,这里直接上关键代码: WindowManager windowManager = ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)); WindowManager.LayoutParams params = new WindowManager.LayoutParams(); params.x = 0; params.y = 0; Display display = windowMana

qq_44023485的博客 318

android+4.4.2+隐藏虚拟按钮,Android 4.4.2 横屏应用隐藏状态栏和底部虚拟键的方法...

摘要:这篇文章主要介绍了Android 4.4.2 横屏应用隐藏状态栏和底部虚拟键的方法,需要的朋友可以参考下//去titlerequestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏状态栏getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.Layout...

weixin_30562757的博客 233

悬浮窗全屏显示-覆盖状态栏

通常情况下悬浮窗只会显示在状态下方,在某些应用场景,我们需要将内容填充之至状态栏中。 重点总共两点: 1.将window的高度设置为屏幕高+状态栏高 2.将window的flag设置允许拓展到状态栏 代码附上: WindowManager wm; WindowManager.LayoutParams lp = new WindowManager.LayoutParams(); wm = (WindowManager) mService.getApplicationContext().getSystemSer

zhanghuanming123的博客 4800

WindowManager和WindowManager.LayoutParams的使用以及实现悬浮窗口的方法

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2012/1105/509.html   写Android程序的时候一般用WindowManager就是去获得屏幕的宽和高,来布局一些小的东西。基本上没有怎么看他的其他的接口。 这两天想写一个简单的类似于Toast的东西,自定义布局,突然发现,原来Toast的时间是不能自己定义的,

victoryckl的专栏 934

WindowManager LayoutParams(上)

WindowManager LayoutParams(上)

qq_43746676的博客 244
上一篇: 介绍Linux目录结构 & Linux分区大小、挂载点 和如何分区
下一篇: Android 中的 Service 全面总结
Alone_SLFly
博客等级 码龄12年 2粉丝 9原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值