IME关于输入法横屏全屏显示问题-Android14

IME关于输入法横屏全屏显示问题-Android14

  • 1、输入法全屏模式updateFullscreenMode
    • 1.1 全屏模式判断
    • 1.2 全屏模式布局设置
  • 2、应用侧关闭输入法全屏模式
    • 2.1 调用输入法的应用设置flag
    • 2.2 继承InputMethodService.java的输入法应用覆盖onEvaluateFullscreenMode方法

InputMethodManagerService启动-Android12

1、输入法全屏模式updateFullscreenMode

frameworks/base/core/java/android/inputmethodservice/InputMethodService.java

1.1 全屏模式判断

  • boolean isFullscreen = mShowInputRequested && onEvaluateFullscreenMode();: 判断是否全屏显示输入法,其中mShowInputRequested请求一般就是 true
  • onEvaluateFullscreenMode(): 默认横屏全屏模式显示,若在横屏下有EditorInfo.IME_FLAG_NO_FULLSCREEN或者EditorInfo.IME_INTERNAL_FLAG_APP_WINDOW_PORTRAIT不使用fullscreen-mode模式
/*** Override this to control when the input method should run in* fullscreen mode.  The default implementation runs in fullsceen only* when the screen is in landscape mode.  If you change what* this returns, you will need to call {@link #updateFullscreenMode()}* yourself whenever the returned value may have changed to have it* re-evaluated and applied.*/
public boolean onEvaluateFullscreenMode() {Configuration config = getResources().getConfiguration();if (config.orientation != Configuration.ORIENTATION_LANDSCAPE) {return false;}if (mInputEditorInfo != null&& ((mInputEditorInfo.imeOptions & EditorInfo.IME_FLAG_NO_FULLSCREEN) != 0// If app window has portrait orientation, regardless of what display orientation// is, IME shouldn't use fullscreen-mode.|| (mInputEditorInfo.internalImeOptions& EditorInfo.IME_INTERNAL_FLAG_APP_WINDOW_PORTRAIT) != 0)) {return false;}return true;
}

1.2 全屏模式布局设置

  • 设置mFullscreenAreaLayoutParams属性,全屏模式下lp.height = 0;lp.weight = 1;
  • 添加ExtractView,即布局frameworks/base/core/res/res/layout/input_method_extract_view.xml
/*** Re-evaluate whether the input method should be running in fullscreen* mode, and update its UI if this has changed since the last time it* was evaluated.  This will call {@link #onEvaluateFullscreenMode()} to* determine whether it should currently run in fullscreen mode.  You* can use {@link #isFullscreenMode()} to determine if the input method* is currently running in fullscreen mode.*/
public void updateFullscreenMode() {Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "IMS.updateFullscreenMode");boolean isFullscreen = mShowInputRequested && onEvaluateFullscreenMode();boolean changed = mLastShowInputRequested != mShowInputRequested;if (mIsFullscreen != isFullscreen || !mFullscreenApplied) {changed = true;mIsFullscreen = isFullscreen;reportFullscreenMode();mFullscreenApplied = true;initialize();LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mFullscreenArea.getLayoutParams();if (isFullscreen) {mFullscreenArea.setBackgroundDrawable(mThemeAttrs.getDrawable(com.android.internal.R.styleable.InputMethodService_imeFullscreenBackground));lp.height = 0;lp.weight = 1;} else {mFullscreenArea.setBackgroundDrawable(null);lp.height = LinearLayout.LayoutParams.WRAP_CONTENT;lp.weight = 0;}((ViewGroup)mFullscreenArea.getParent()).updateViewLayout(mFullscreenArea, lp);if (isFullscreen) {if (mExtractView == null) {View v = onCreateExtractTextView();if (v != null) {setExtractView(v);}}startExtractingText(false);}updateExtractFrameVisibility();}if (changed) {onConfigureWindow(mWindow.getWindow(), isFullscreen, !mShowInputRequested);mLastShowInputRequested = mShowInputRequested;}Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER);
}

2、应用侧关闭输入法全屏模式

2.1 调用输入法的应用设置flag

  1. 设置EditorInfo.IME_FLAG_NO_FULLSCREEN属性,而EditorInfo.IME_INTERNAL_FLAG_APP_WINDOW_PORTRAIT属性是framework内部使用。 即xml布局中 android:imeOptions="flagNoFullscreen" ,或者代码设置mEdtView.setImeOptions(EditorInfo.IME_FLAG_NO_FULLSCREEN);

  2. imeOptions 属性并不只有IME_FLAG_NO_FULLSCREEN功能:
    IME_ACTION_UNSPECIFIED actionUnspecified
    IME_ACTION_NONE actionNone
    IME_ACTION_GO actionGo
    IME_ACTION_SEARCH actionSearch
    IME_ACTION_SEND actionSend
    IME_ACTION_NEXT actionNext
    IME_ACTION_DONE actionDone
    IME_ACTION_PREVIOUS actionPrevious
    IME_FLAG_NO_PERSONALIZED_LEARNING flagNoPersonalizedLearning
    IME_FLAG_NO_FULLSCREEN flagNoFullscreen
    IME_FLAG_NAVIGATE_PREVIOUS flagNavigatePrevious
    IME_FLAG_NAVIGATE_NEXT flagNavigateNext
    IME_FLAG_NO_EXTRACT_UI flagNoExtractUi
    IME_FLAG_NO_ACCESSORY_ACTION flagNoAccessoryAction
    IME_FLAG_NO_ENTER_ACTION flagNoEnterAction
    IME_FLAG_FORCE_ASCII flagForceAscii

  3. 设置 imeOptions 属性并不一定生效,假如输入法应用覆盖了 onEvaluateFullscreenMode 方法

frameworks/base/core/java/android/view/inputmethod/EditorInfo.java

/*** Flag of {@link #imeOptions}: used to request that the IME never go* into fullscreen mode.* By default, IMEs may go into full screen mode when they think* it's appropriate, for example on small screens in landscape* orientation where displaying a software keyboard may occlude* such a large portion of the screen that the remaining part is* too small to meaningfully display the application UI.* If this flag is set, compliant IMEs will never go into full screen mode,* and always leave some space to display the application UI.* Applications need to be aware that the flag is not a guarantee, and* some IMEs may ignore it.*/
public static final int IME_FLAG_NO_FULLSCREEN = 0x2000000;/*** Masks for {@link imeOptions}** <pre>* |-------|-------|-------|-------|*                              1111 IME_MASK_ACTION* |-------|-------|-------|-------|*                                   IME_ACTION_UNSPECIFIED*                                 1 IME_ACTION_NONE*                                1  IME_ACTION_GO*                                11 IME_ACTION_SEARCH*                               1   IME_ACTION_SEND*                               1 1 IME_ACTION_NEXT*                               11  IME_ACTION_DONE*                               111 IME_ACTION_PREVIOUS*         1                         IME_FLAG_NO_PERSONALIZED_LEARNING*        1                          IME_FLAG_NO_FULLSCREEN*       1                           IME_FLAG_NAVIGATE_PREVIOUS*      1                            IME_FLAG_NAVIGATE_NEXT*     1                             IME_FLAG_NO_EXTRACT_UI*    1                              IME_FLAG_NO_ACCESSORY_ACTION*   1                               IME_FLAG_NO_ENTER_ACTION*  1                                IME_FLAG_FORCE_ASCII* |-------|-------|-------|-------|</pre>*//*** Extended type information for the editor, to help the IME better* integrate with it.*/
public int imeOptions = IME_NULL;/*** A string supplying additional information options that are* private to a particular IME implementation.  The string must be* scoped to a package owned by the implementation, to ensure there are* no conflicts between implementations, but other than that you can put* whatever you want in it to communicate with the IME.  For example,* you could have a string that supplies an argument like* <code>"com.example.myapp.SpecialMode=3"</code>.  This field is can be* filled in from the {@link android.R.attr#privateImeOptions}* attribute of a TextView.*/
public String privateImeOptions = null;/*** Masks for {@link internalImeOptions}** <pre>*                                 1 IME_INTERNAL_FLAG_APP_WINDOW_PORTRAIT* |-------|-------|-------|-------|</pre>*//*** Same as {@link android.R.attr#imeOptions} but for framework's internal-use only.* @hide*/
public int internalImeOptions = IME_NULL;

frameworks/base/core/java/android/widget/TextView.java

case com.android.internal.R.styleable.TextView_imeOptions:createEditorIfNeeded();mEditor.createInputContentTypeIfNeeded();mEditor.mInputContentType.imeOptions = a.getInt(attr,mEditor.mInputContentType.imeOptions);break;/*** Change the editor type integer associated with the text view, which* is reported to an Input Method Editor (IME) with {@link EditorInfo#imeOptions}* when it has focus.* @see #getImeOptions* @see android.view.inputmethod.EditorInfo* @attr ref android.R.styleable#TextView_imeOptions*/
public void setImeOptions(int imeOptions) {createEditorIfNeeded();mEditor.createInputContentTypeIfNeeded();mEditor.mInputContentType.imeOptions = imeOptions;
}

frameworks/base/core/res/res/values/attrs.xml

<!-- Additional features you can enable in an IME associated with an editorto improve the integration with your application.  The constantshere correspond to those defined by{@link android.view.inputmethod.EditorInfo#imeOptions}. --><attr name="imeOptions"><!-- There are no special semantics associated with this editor. --><flag name="normal" value="0x00000000" /><!-- There is no specific action associated with this editor, let theeditor come up with its own if it can.Corresponds to{@link android.view.inputmethod.EditorInfo#IME_NULL}. --><flag name="actionUnspecified" value="0x00000000" /><!-- This editor has no action associated with it.Corresponds to{@link android.view.inputmethod.EditorInfo#IME_ACTION_NONE}. --><flag name="actionNone" value="0x00000001" /><!-- The action key performs a "go"operation to take the user to the target of the text they typed.Typically used, for example, when entering a URL.Corresponds to{@link android.view.inputmethod.EditorInfo#IME_ACTION_GO}. --><flag name="actionGo" value="0x00000002" /><!-- The action key performs a "search"operation, taking the user to the results of searching for the textthe have typed (in whatever context is appropriate).Corresponds to{@link android.view.inputmethod.EditorInfo#IME_ACTION_SEARCH}. --><flag name="actionSearch" value="0x00000003" /><!-- The action key performs a "send"operation, delivering the text to its target.  This is typically usedwhen composing a message.Corresponds to{@link android.view.inputmethod.EditorInfo#IME_ACTION_SEND}. --><flag name="actionSend" value="0x00000004" /><!-- The action key performs a "next"operation, taking the user to the next field that will accept text.Corresponds to{@link android.view.inputmethod.EditorInfo#IME_ACTION_NEXT}. --><flag name="actionNext" value="0x00000005" /><!-- The action key performs a "done"operation, closing the soft input method.Corresponds to{@link android.view.inputmethod.EditorInfo#IME_ACTION_DONE}. --><flag name="actionDone" value="0x00000006" /><!-- The action key performs a "previous"operation, taking the user to the previous field that will accept text.Corresponds to{@link android.view.inputmethod.EditorInfo#IME_ACTION_PREVIOUS}. --><flag name="actionPrevious" value="0x00000007" /><!-- Used to request that the IME should not update any personalized data such as typinghistory and personalized language model based on what the user typed on this textediting object. Typical use cases are:<ul><li>When the application is in a special mode, where user's activities are expectedto be not recorded in the application's history. Some web browsers and chatapplications may have this kind of modes.</li><li>When storing typing history does not make much sense.  Specifying this flag intyping games may help to avoid typing history from being filled up with words thatthe user is less likely to type in their daily life.  Another example is that whenthe application already knows that the expected input is not a valid word (e.g. apromotion code that is not a valid word in any natural language).</li></ul><p>Applications need to be aware that the flag is not a guarantee, and some IMEs maynot respect it.</p> --><flag name="flagNoPersonalizedLearning" value="0x1000000" /><!-- Used to request that the IME never gointo fullscreen mode.  Applications need to be aware that the flag is nota guarantee, and not all IMEs will respect it.<p>Corresponds to{@link android.view.inputmethod.EditorInfo#IME_FLAG_NO_FULLSCREEN}. --><flag name="flagNoFullscreen" value="0x2000000" /><!-- Like flagNavigateNext, butspecifies there is something interesting that a backward navigationcan focus on.  If the user selects the IME's facility to backwardnavigate, this will show up in the application as an actionPreviousat {@link android.view.inputmethod.InputConnection#performEditorAction(int)InputConnection.performEditorAction(int)}.<p>Corresponds to{@link android.view.inputmethod.EditorInfo#IME_FLAG_NAVIGATE_PREVIOUS}. --><flag name="flagNavigatePrevious" value="0x4000000" /><!-- Used to specify that there is somethinginteresting that a forward navigation can focus on. This is like usingactionNext, except allows the IME to be multiline (withan enter key) as well as provide forward navigation.  Note that someIMEs may not be able to do this, especially when running on a smallscreen where there is little space.  In that case it does not need topresent a UI for this option.  Like actionNext, if theuser selects the IME's facility to forward navigate, this will show upin the application at{@link android.view.inputmethod.InputConnection#performEditorAction(int)InputConnection.performEditorAction(int)}.<p>Corresponds to{@link android.view.inputmethod.EditorInfo#IME_FLAG_NAVIGATE_NEXT}. --><flag name="flagNavigateNext" value="0x8000000" /><!-- Used to specify that the IME does not needto show its extracted text UI.  For input methods that may be fullscreen,often when in landscape mode, this allows them to be smaller and let partof the application be shown behind.  Though there will likely be limitedaccess to the application available from the user, it can make theexperience of a (mostly) fullscreen IME less jarring.  Note that whenthis flag is specified the IME may <em>not</em> be set up to be ableto display text, so it should only be used in situations where this isnot needed.<p>Corresponds to{@link android.view.inputmethod.EditorInfo#IME_FLAG_NO_EXTRACT_UI}. --><flag name="flagNoExtractUi" value="0x10000000" /><!-- Used in conjunction with a custom action, this indicates that theaction should not be available as an accessory button when theinput method is full-screen.Note that by setting this flag, there can be cases where the actionis simply never available to the user.  Setting this generally meansthat you think showing text being edited is more important than theaction you have supplied.<p>Corresponds to{@link android.view.inputmethod.EditorInfo#IME_FLAG_NO_ACCESSORY_ACTION}. --><flag name="flagNoAccessoryAction" value="0x20000000" /><!-- Used in conjunction with a custom action,this indicates that the action should not be available in-line asa replacement for the "enter" key.  Typically this isbecause the action has such a significant impact or is not recoverableenough that accidentally hitting it should be avoided, such as sendinga message.    Note that {@link android.widget.TextView} willautomatically set this flag for you on multi-line text views.<p>Corresponds to{@link android.view.inputmethod.EditorInfo#IME_FLAG_NO_ENTER_ACTION}. --><flag name="flagNoEnterAction" value="0x40000000" /><!-- Used to request that the IME should be capable of inputting ASCIIcharacters.  The intention of this flag is to ensure that the usercan type Roman alphabet characters in a {@link android.widget.TextView}used for, typically, account ID or password input.  It is expected that IMEsnormally are able to input ASCII even without being told so (such IMEsalready respect this flag in a sense), but there could be some cases theyaren't when, for instance, only non-ASCII input languages like Arabic,Greek, Hebrew, Russian are enabled in the IME.  Applications need to beaware that the flag is not a guarantee, and not all IMEs will respect it.However, it is strongly recommended for IME authors to respect this flagespecially when their IME could end up with a state that has only non-ASCIIinput languages enabled.<p>Corresponds to{@link android.view.inputmethod.EditorInfo#IME_FLAG_FORCE_ASCII}. --><flag name="flagForceAscii" value="0x80000000" /></attr>

2.2 继承InputMethodService.java的输入法应用覆盖onEvaluateFullscreenMode方法

覆盖onEvaluateFullscreenMode方法,返false就可以了。如Android14上google输入法LatinImeGoogle.apk

frameworks/base/core/java/android/inputmethodservice/InputMethodService.java

/*** Override this to control when the input method should run in* fullscreen mode.  The default implementation runs in fullsceen only* when the screen is in landscape mode.  If you change what* this returns, you will need to call {@link #updateFullscreenMode()}* yourself whenever the returned value may have changed to have it* re-evaluated and applied.*/
public boolean onEvaluateFullscreenMode() {Configuration config = getResources().getConfiguration();if (config.orientation != Configuration.ORIENTATION_LANDSCAPE) {return false;}if (mInputEditorInfo != null&& ((mInputEditorInfo.imeOptions & EditorInfo.IME_FLAG_NO_FULLSCREEN) != 0// If app window has portrait orientation, regardless of what display orientation// is, IME shouldn't use fullscreen-mode.|| (mInputEditorInfo.internalImeOptions& EditorInfo.IME_INTERNAL_FLAG_APP_WINDOW_PORTRAIT) != 0)) {return false;}return true;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/9567.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(done) MIT6.S081 2023 学习笔记 (Day6: LAB5 COW Fork)

网页&#xff1a;https://pdos.csail.mit.edu/6.S081/2023/labs/cow.html 任务1&#xff1a;Implement copy-on-write fork(hard) (完成) 现实中的问题如下&#xff1a; xv6中的fork()系统调用会将父进程的用户空间内存全部复制到子进程中。如果父进程很大&#xff0c;复制过程…

如何将xps文件转换为txt文件?xps转为pdf,pdf转为txt,提取pdf表格并转为txt

文章目录 xps转txt方法一方法二 pdf转txt整页转txt提取pdf表格&#xff0c;并转为txt 总结另外参考XPS文件转换为TXT文件XPS文件转换为PDF文件PDF文件转换为TXT文件提取PDF表格并转为TXT示例代码&#xff08;部分&#xff09; 本文测试代码已上传&#xff0c;路径如下&#xff…

C++,STL,【目录篇】

文章目录 一、简介二、内容提纲第一部分&#xff1a;STL 概述第二部分&#xff1a;STL 容器第三部分&#xff1a;STL 迭代器第四部分&#xff1a;STL 算法第五部分&#xff1a;STL 函数对象第六部分&#xff1a;STL 高级主题第七部分&#xff1a;STL 实战应用 三、写作风格四、…

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器

一、高级定时器简介 高级定时器的简介在前面一章已经介绍过&#xff0c;可以点击下面链接了解&#xff0c;在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数&#xff0c;还独有一个重复计…

Mybatis是如何进行分页的?

大家好&#xff0c;我是锋哥。今天分享关于【Mybatis是如何进行分页的&#xff1f;】面试题。希望对大家有帮助&#xff1b; Mybatis是如何进行分页的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 MyBatis 实现分页的方式有很多种&#xff0c;最常见…

四.3 Redis 五大数据类型/结构的详细说明/详细使用( hash 哈希表数据类型详解和使用)

四.3 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; hash 哈希表数据类型详解和使用&#xff09; 文章目录 四.3 Redis 五大数据类型/结构的详细说明/详细使用&#xff08; hash 哈希表数据类型详解和使用&#xff09;2.hash 哈希表常用指令(详细讲解说明)2.1 hset …

编译dpdk19.08.2中example时一系列报错解决

dpdk19.08编译过程全解 dpdk 介绍问题描述编译过程执行Step 1报错一解决方式 报错二解决方式 继续执行Step 248的时候报错 49没有修改成功输入60退出 使用过程执行make报错一解决方式 继续make报错二解决方式 继续make执行生成文件helloworld报错三解决方式 执行make 完成参考链…

openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群

前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…

渗透测试之WAF规则触发绕过规则之规则库绕过方式

目录 Waf触发规则的绕过 特殊字符替换空格 实例 特殊字符拼接绕过waf Mysql 内置得方法 注释包含关键字 实例 Waf触发规则的绕过 特殊字符替换空格 用一些特殊字符代替空格&#xff0c;比如在mysql中%0a是换行&#xff0c;可以代替空格 这个方法也可以部分绕过最新版本的…

C# dataGridView1获取选中行的名字

在视觉项目中编写的框架需要能够选择产品或复制产品等方便后续换型&#xff0c;视觉调试仅需调试相机图像、调试视觉相关参数、标定&#xff0c;再试跑调试优化参数。 C# dataGridView1 鼠标点击某一行能够计算出是那一行 使用CellMouseClick事件 首先&#xff0c;在Form的构造…

Ubuntu介绍、与centos的区别、基于VMware安装Ubuntu Server 22.04、配置远程连接、安装jdk+Tomcat

目录 ?编辑 一、Ubuntu22.04介绍 二、Ubuntu与Centos的区别 三、基于VMware安装Ubuntu Server 22.04 下载 VMware安装 1.创建新的虚拟机 2.选择类型配置 3.虚拟机硬件兼容性 4.安装客户机操作系统 5.选择客户机操作系统 6.命名虚拟机 7.处理器配置 8.虚拟机内存…

Linux基础指令

基本文件操作 补充&#xff1a; “cd -” 可以前往刚才所在目录 “ls 文件路径” 列举指定路径的文件 “ls -a”列出隐藏文件 “ls -l”可以缩写为“ll” 周边概念 读取操作 “cat 文件名”阅读文本文件内容&#xff0c;可以使用Tab键补全文件…

【HarmonyOS之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)

目录 1 -> 生命周期 1.1 -> 应用生命周期 1.2 -> 页面生命周期 2 -> 资源限定与访问 2.1 -> 资源限定词 2.2 -> 资源限定词的命名要求 2.3 -> 限定词与设备状态的匹配规则 2.4 -> 引用JS模块内resources资源 3 -> 多语言支持 3.1 -> 定…

【JavaWeb06】Tomcat基础入门:架构理解与基本配置指南

文章目录 &#x1f30d;一. WEB 开发❄️1. 介绍 ❄️2. BS 与 CS 开发介绍 ❄️3. JavaWeb 服务软件 &#x1f30d;二. Tomcat❄️1. Tomcat 下载和安装 ❄️2. Tomcat 启动 ❄️3. Tomcat 启动故障排除 ❄️4. Tomcat 服务中部署 WEB 应用 ❄️5. 浏览器访问 Web 服务过程详…

C语言练习(29)

13个人围成一圈&#xff0c;从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子&#xff0c;找出最后留在圈子中的人原来的序号。本题要求用链表实现。 #include <stdio.h> #include <stdlib.h>// 定义链表节点结构体 typedef struct Node {int num;struct Nod…

简要介绍C语言和c++的共有变量,以及c++特有的变量

在C语言和C中&#xff0c;变量是用来存储数据的内存位置&#xff0c;它们的使用方式和特性在两种语言中既有相似之处&#xff0c;也有不同之处。以下分别介绍C语言和C的共有变量以及C特有的变量。 C语言和C的共有变量 C语言和C都支持以下类型的变量&#xff0c;它们在语法和基…

【UE插件】Sphinx关键词语音识别

视频教程&#xff1a; Unreal Engine - Speech Recognition - Free Pluginhttps://www.youtube.com/watch?vKBcXNnSdWog&t622s 官方教程&#xff1a; Sphinx: Speech Recognition Plugin | Unreal Engine Community Wikihttps://unrealcommunity.wiki/speech-recognition…

图漾相机——C++语言属性设置

文章目录 前言1.SDK API功能介绍1.1 Device组件下的API测试1.1.1 相机工作模式设置&#xff08;TY_TRIGGER_PARAM_EX&#xff09;1.1.2 TY_INT_FRAME_PER_TRIGGER1.1.3 TY_INT_PACKET_DELAY1.1.4 TY_INT_PACKET_SIZE1.1.5 TY_BOOL_GVSP_RESEND1.1.6 TY_BOOL_TRIGGER_OUT_IO1.1.…

Spring AI 在微服务中的应用:支持分布式 AI 推理

1. 引言 在现代企业中&#xff0c;微服务架构 已成为开发复杂系统的主流方式&#xff0c;而 AI 模型推理 也越来越多地被集成到业务流程中。如何在分布式微服务架构下高效地集成 Spring AI&#xff0c;使多个服务可以协同完成 AI 任务&#xff0c;并支持分布式 AI 推理&#x…

研发的立足之本到底是啥?

0 你的问题&#xff0c;我知道&#xff01; 本文深入T型图“竖线”的立足之本&#xff1a;专业技术 技术赋能业务能力。研发在学习投入精力最多&#xff0c;也误区最多。 某粉丝感发展遇到瓶颈&#xff0c;项目都会做&#xff0c;但觉无提升&#xff0c;想跳槽。于是&#x…