Android应用开发(31)屏幕背光控制

2023-11-08 19:20

本文主要是介绍Android应用开发(31)屏幕背光控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android应用开发学习笔记——目录索引

最近各手机厂商都在宣传万级调光,宣传数字越来越大,但是到底背光调节平滑度体验如何呢?

如最近realme 11 pro+ (MTK平台天玑7050),宣传20000级自动亮度调节。

发布会截图:

使用adb shell dumpsys SurfaceFlinger,发现 背光调节range[1~20479]


[LED state]display_0: support[1]brightness[0.393965] range[1~20479] current[8068]display_1: support[0]display_2: support[0]

测试验证了一下realme 11 pro+屏幕背光:

最小亮度1.7nit, 手动最大亮度500nit, HBM到800nit 。

从log看 最小dbv12, 手动最大18740,hbm 最大20479。

normal 区间:brightness[0.000049~0.915084] range[1~18740]

hbm 区间:brightness[0.915133~1.000000] range[18741~20479]

目前国内手机厂商竞争异常激烈,疯狂卷参数,但是这些参数对我们用户来说,具体有落实到实处吗?这是一个大大的问号

为了使用光学仪器410精准的测量屏幕背光情况,所以打写一个简单的背光测试apk。

一、获取背光控制最大最小值

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

     <!-- Note: This setting is deprecated, please useconfig_screenBrightnessSettingMinimumFloat instead --><integer name="config_screenBrightnessSettingMinimum">10</integer><!-- Note: This setting is deprecated, please useconfig_screenBrightnessSettingMaximumFloat instead --><integer name="config_screenBrightnessSettingMaximum">255</integer><!-- Note: This setting is deprecated, please useconfig_screenBrightnessSettingDefaultFloat instead --><integer name="config_screenBrightnessSettingDefault">102</integer><!-- Minimum screen brightness setting allowed by power manager.-2 is invalid so setting will resort to int value specified above.Set this to 0.0 to allow screen to go to minimal brightness.The user is forbidden from setting the brightness below this level. --><item name="config_screenBrightnessSettingMinimumFloat" format="float" type="dimen">-2</item><!-- Maximum screen brightness allowed by the power manager.-2 is invalid so setting will resort to int value specified above.Set this to 1.0 for maximum brightness range.The user is forbidden from setting the brightness above this level. --><item name="config_screenBrightnessSettingMaximumFloat" format="float" type="dimen">-2</item><!-- Default screen brightness setting set.-2 is invalid so setting will resort to int value specified above.Must be in the range specified by minimum and maximum. --><item name="config_screenBrightnessSettingDefaultFloat" format="float" type="dimen">-2</item>

直接通过代码获取config_screenBrightnessSettingMinimumconfig_screenBrightnessSettingMaximum


    //获取系统最小屏幕亮度:config_screenBrightnessSettingMinimumprivate int getScreenBrightnessSettingMinimum(Context context) {int screenBrightnessSettingMinimumId = getResources().getIdentifier("config_screenBrightnessSettingMinimum", "integer", "android");int screenBrightnessSettingMinimum = getResources().getInteger(screenBrightnessSettingMinimumId);return screenBrightnessSettingMinimum;}//获取系统最大屏幕亮度:config_screenBrightnessSettingMaximumprivate int getscreenBrightnessSettingMaximum(Context context) {int screenBrightnessSettingMaximumId = context.getResources().getIdentifier("config_screenBrightnessSettingMaximum", "integer", "android");int screenBrightnessSettingMaximum = context.getResources().getInteger(screenBrightnessSettingMaximumId);return screenBrightnessSettingMaximum;}

二、设置屏幕背光

第三方app设置屏幕背光有两种方法:

  1. 修改APP界面屏幕亮度,只影响本app,不会影响整个系统,退出app界面,恢复系统亮度

  1. 修改系统 Settings 中的屏幕亮度,影响所有APP

1.修改APP界面屏幕亮度

修改自身 APP 亮度比较简单,只需要在Activity 获取window的attributes,通过WindowManager.LayoutParams的screenBrightness变量调节


    //修改当前Activity界面的窗口亮度private void setWindowScreenBrightness(int brightness) {Window window = getWindow();WindowManager.LayoutParams lp = window.getAttributes();lp.screenBrightness = (float) brightness / (float)mBrightnessSettingMaximum;window.setAttributes(lp);}

只影响当前app界面,退出app,恢复到系统背光。

2.修改系统 Settings 中的屏幕亮度

2.1 AndroidManifest.xml添加如下权限


<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

2.2 非系统签名应用,检测是否有WRITE_SETTINGS,没有的话去请求用户授权


    //检测是否有WRITE_SETTINGS,没有的话去请求用户授权private boolean checkWriteSettingPermission(Activity context, int requestCode) {boolean permission;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {permission = Settings.System.canWrite(context);} else {permission = ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_SETTINGS) == PackageManager.PERMISSION_GRANTED;}if (!permission) {if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);intent.setData(Uri.parse("package:" + context.getPackageName()));context.startActivityForResult(intent, requestCode);} else {ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.WRITE_SETTINGS}, requestCode);}}return permission;}
2.3 关闭自动亮度,设置手动调节背光模式

    //关闭光感,设置手动调节背光模式//SCREEN_BRIGHTNESS_MODE_AUTOMATIC 自动调节屏幕亮度模式值为1//SCREEN_BRIGHTNESS_MODE_MANUAL 手动调节屏幕亮度模式值为0public void setScreenManualMode(Context context) {ContentResolver contentResolver = context.getContentResolver();try {int mode = Settings.System.getInt(contentResolver,Settings.System.SCREEN_BRIGHTNESS_MODE);if (mode == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC) {Settings.System.putInt(contentResolver,Settings.System.SCREEN_BRIGHTNESS_MODE,Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);}} catch (Settings.SettingNotFoundException e) {e.printStackTrace();}}

2.4 获取当前背光和设置背光的方法


    //获取系统屏幕亮度private int getScreenBrightness(Context context) {int brightness = -1;ContentResolver resolver = context.getContentResolver();try {brightness = Settings.System.getInt(resolver, Settings.System.SCREEN_BRIGHTNESS);} catch (Settings.SettingNotFoundException e) {e.printStackTrace();}return brightness;}// 修改系统的亮度值private void setScreenLight(int brightness) {Uri uri = Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS);ContentResolver contentResolver = getContentResolver();Settings.System.putInt(contentResolver, Settings.System.SCREEN_BRIGHTNESS, brightness);contentResolver.notifyChange(uri, null);}

三、测试程序

测试程序使用第一种方法:修改APP界面屏幕亮度,不会影响其他APP

java:

MainActivity.java


package com.example.screenbrightnesstest;import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.Manifest;public class MainActivity extends AppCompatActivity implements View.OnClickListener{private static final String TAG = "lzl-test";private Context mContext;private int mRoScreenBrightnessSettingMinimum;private int mRoScreenBrightnessSettingMaximum;private TextView mTextViewScreenBrightnessRange;private EditText mEditTextInputIntBrightnessMin;private int mInputIntIntBrightnessMin;private EditText mEditTextInputIntBrightnessMax;private int mInputIntIntBrightnessMax;private EditText mEditTextInputIntBrightness;private int mInputIntBrightness;private EditText mEditTextInputIntBrightnessAddStep;private int mInputIntBrightnessAddStep = 1;private TextView mTextViewOutputInfo;private int mColor = Color.RED;private int onClickCount = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = getApplicationContext();//获取系统最小屏幕亮度:config_screenBrightnessSettingMinimummRoScreenBrightnessSettingMinimum = getScreenBrightnessSettingMinimum(mContext);Log.d(TAG, "config_screenBrightnessSettingMinimum:" + mRoScreenBrightnessSettingMinimum);//获取系统最大屏幕亮度:config_screenBrightnessSettingMaximummRoScreenBrightnessSettingMaximum = getscreenBrightnessSettingMaximum(mContext);Log.d(TAG, "config_screenBrightnessSettingMaximum:" + mRoScreenBrightnessSettingMaximum);TextView textView =  (TextView)findViewById(R.id.tv_screenBrightnessSettingMinimum_val);textView.setText(String.format("%d",mRoScreenBrightnessSettingMinimum));textView =  (TextView)findViewById(R.id.tv_screenBrightnessSettingMaximum_val);textView.setText(String.format("%d",mRoScreenBrightnessSettingMaximum));mInputIntIntBrightnessMin = mRoScreenBrightnessSettingMinimum;mInputIntIntBrightnessMax = mRoScreenBrightnessSettingMaximum;mEditTextInputIntBrightnessMin = (EditText)findViewById(R.id.editTextNumber_screenBrightnessMinimum);mEditTextInputIntBrightnessMin.setText(String.format("%d",mInputIntIntBrightnessMin));mEditTextInputIntBrightnessMax = (EditText)findViewById(R.id.editTextNumber_screenBrightnessMaximum);mEditTextInputIntBrightnessMax.setText(String.format("%d",mInputIntIntBrightnessMax));mTextViewScreenBrightnessRange = (TextView)findViewById(R.id.tv_ScreenBrightness_range);mTextViewScreenBrightnessRange.setText(String.format("ScreenBrightness 测试,输入范围[%d~%d]",mInputIntIntBrightnessMin, mInputIntIntBrightnessMax));mEditTextInputIntBrightness = (EditText)findViewById(R.id.editTextNumber_screenBrightness);mInputIntBrightness = mInputIntIntBrightnessMax/2;mEditTextInputIntBrightness.setText(String.format("%d",mInputIntBrightness));mEditTextInputIntBrightnessAddStep = (EditText)findViewById(R.id.editTextNumber_screenBrightnessAddStep);mInputIntBrightnessAddStep = 1;mEditTextInputIntBrightnessAddStep.setText(String.format("%d",mInputIntBrightnessAddStep));findViewById(R.id.button_set_screenBrightnessMinimum).setOnClickListener(this);findViewById(R.id.button_set_screenBrightnessMaximum).setOnClickListener(this);findViewById(R.id.button_set_screenBrightness).setOnClickListener(this);findViewById(R.id.button_set_screenBrightnessAddStep).setOnClickListener(this);findViewById(R.id.button_add).setOnClickListener(this);findViewById(R.id.button_add).setOnClickListener(this);mTextViewOutputInfo = (TextView) findViewById(R.id.tv_output_info);}//获取系统最小屏幕亮度:config_screenBrightnessSettingMinimumprivate int getScreenBrightnessSettingMinimum(Context context) {int screenBrightnessSettingMinimumId = getResources().getIdentifier("config_screenBrightnessSettingMinimum", "integer", "android");int screenBrightnessSettingMinimum = getResources().getInteger(screenBrightnessSettingMinimumId);return screenBrightnessSettingMinimum;}//获取系统最大屏幕亮度:config_screenBrightnessSettingMaximumprivate int getscreenBrightnessSettingMaximum(Context context) {int screenBrightnessSettingMaximumId = context.getResources().getIdentifier("config_screenBrightnessSettingMaximum", "integer", "android");int screenBrightnessSettingMaximum = context.getResources().getInteger(screenBrightnessSettingMaximumId);return screenBrightnessSettingMaximum;}//修改当前Activity界面的窗口亮度private void setWindowScreenBrightness(int brightness) {Window window = getWindow();WindowManager.LayoutParams lp = window.getAttributes();Log.d(TAG, "Brightness:" + brightness + ", Max Brightness:" + mInputIntIntBrightnessMax);lp.screenBrightness = (float) brightness / (float)mInputIntIntBrightnessMax;window.setAttributes(lp);}private void showTextViewOutputInfo() {mColor = (onClickCount % 2 == 0) ? Color.RED : Color.BLUE;String str = String.format("范围:%d~%d\nint brightness[%d], float brightness[%f]\n自增步长: %d\n",mInputIntIntBrightnessMin, mInputIntIntBrightnessMax, mInputIntBrightness,(float) mInputIntBrightness / (float)mInputIntIntBrightnessMax, mInputIntBrightnessAddStep);mTextViewOutputInfo.setText(str);mTextViewOutputInfo.setTextColor(mColor);}@Overridepublic void onClick(View v) {onClickCount++;if (v.getId() == R.id.button_set_screenBrightnessMinimum) {if (!mEditTextInputIntBrightnessMin.getText().toString().isEmpty()) {mInputIntIntBrightnessMin = Integer.parseInt(mEditTextInputIntBrightnessMin.getText().toString());} else {mInputIntIntBrightnessMin = mRoScreenBrightnessSettingMaximum;}mTextViewScreenBrightnessRange.setText(String.format("ScreenBrightness 测试,输入范围[%d~%d]",mInputIntIntBrightnessMin, mInputIntIntBrightnessMax));showTextViewOutputInfo();} else if (v.getId() == R.id.button_set_screenBrightnessMaximum) {if (!mEditTextInputIntBrightnessMax.getText().toString().isEmpty()) {mInputIntIntBrightnessMax = Integer.parseInt(mEditTextInputIntBrightnessMax.getText().toString());} else {mInputIntIntBrightnessMax = mRoScreenBrightnessSettingMaximum;}mTextViewScreenBrightnessRange.setText(String.format("ScreenBrightness 测试,输入范围[%d~%d]",mInputIntIntBrightnessMin, mInputIntIntBrightnessMax));showTextViewOutputInfo();} else if (v.getId() == R.id.button_set_screenBrightness) {if (!mEditTextInputIntBrightness.getText().toString().isEmpty()) {mInputIntBrightness = Integer.parseInt(mEditTextInputIntBrightness.getText().toString());Log.d(TAG, "mIntBrightness:" + mInputIntBrightness);if (mInputIntBrightness < mInputIntIntBrightnessMin || mInputIntBrightness > mInputIntIntBrightnessMax) {Toast.makeText(getApplicationContext(), "请输入有效int型Brightness,range[" + mInputIntIntBrightnessMin +"~" + mInputIntIntBrightnessMax +"]", 1000).show();} else {setWindowScreenBrightness(mInputIntBrightness);showTextViewOutputInfo();}} else {Toast.makeText(getApplicationContext(), "请输入有效的参数", 1000).show();}} else if (v.getId() == R.id.button_set_screenBrightnessAddStep) {if (!mEditTextInputIntBrightnessAddStep.getText().toString().isEmpty()) {mInputIntBrightnessAddStep = Integer.parseInt(mEditTextInputIntBrightnessAddStep.getText().toString());Log.d(TAG, "mIntBrightnessAddStep:" + mInputIntBrightnessAddStep);if ((mInputIntBrightnessAddStep + mInputIntBrightness) > mInputIntIntBrightnessMax) {mInputIntBrightnessAddStep = 1;Toast.makeText(getApplicationContext(), "请输入有效的参数", 1000).show();}} else {Toast.makeText(getApplicationContext(), "请输入有效的参数", 1000).show();}showTextViewOutputInfo();} else if (v.getId() == R.id.button_add) {mInputIntBrightness = mInputIntBrightness + mInputIntBrightnessAddStep;Log.d(TAG, "mIntBrightness:" + mInputIntBrightness);if (mInputIntBrightness > mInputIntIntBrightnessMax) {Toast.makeText(getApplicationContext(), "Brightness超过了[" + mInputIntIntBrightnessMin +"~" + mInputIntIntBrightnessMax +"]范围", 1000).show();} else {setWindowScreenBrightness(mInputIntBrightness);showTextViewOutputInfo();}}  else {Log.e(TAG, "未知按键");}}
}

xml:

activity_main.xml layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_margin="5dp"><TextViewandroid:id="@+id/tv_screenBrightnessSetting_info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="获取 screenBrightness 配置信息" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightnessSettingMinimum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="config_screenBrightnessSettingMinimum:" /><TextViewandroid:id="@+id/tv_screenBrightnessSettingMinimum_val"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightnessSettingMaximum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="config_screenBrightnessSettingMaximum:" /><TextViewandroid:id="@+id/tv_screenBrightnessSettingMaximum_val"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="" /></LinearLayout><TextViewandroid:id="@+id/textView_ScreenBrightness_min_max_info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="ScreenBrightness 测试,设置最小/最大亮度值" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightnessSettingMinimum_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="输入:" /><EditTextandroid:id="@+id/editTextNumber_screenBrightnessMinimum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:layout_weight="1"android:inputType="number" /><Buttonandroid:id="@+id/button_set_screenBrightnessMinimum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="设置" /></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightnessSettingMaximum_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="输入:" /><EditTextandroid:id="@+id/editTextNumber_screenBrightnessMaximum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:layout_weight="1"android:inputType="number" /><Buttonandroid:id="@+id/button_set_screenBrightnessMaximum"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="设置" /></LinearLayout><TextViewandroid:id="@+id/tv_ScreenBrightness_range"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="ScreenBrightness 测试,输入范围" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_screenBrightness_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="输入:" /><EditTextandroid:id="@+id/editTextNumber_screenBrightness"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:layout_weight="1"android:inputType="number" /><Buttonandroid:id="@+id/button_set_screenBrightness"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="设置" /></LinearLayout><TextViewandroid:id="@+id/tv_screenBrightness_add_input"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="screenBrightness自增步长设置" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"><TextViewandroid:id="@+id/tv_add_setp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="输入:" /><EditTextandroid:id="@+id/editTextNumber_screenBrightnessAddStep"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:layout_weight="1"android:inputType="number" /><Buttonandroid:id="@+id/button_set_screenBrightnessAddStep"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="设置" /></LinearLayout><Buttonandroid:id="@+id/button_add"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_weight="1"android:text="自增" /><TextViewandroid:id="@+id/tv_output"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="30dp"android:layout_gravity="center"android:text="输出信息" /><TextViewandroid:id="@+id/tv_output_info"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:layout_marginTop="5dp"android:layout_gravity="center" /></LinearLayout></LinearLayout>

运行

我自己主力机器刚好是小米13Ultra,对比验证了一下:

  1. realme 11 pro+直接通过代码获取config_screenBrightnessSettingMinimumconfig_screenBrightnessSettingMaximum分别是1和255

  1. 小米13Ultra直接通过代码获取config_screenBrightnessSettingMinimumconfig_screenBrightnessSettingMaximum分别是15和16383

背光验证:

apk可以给手机准确的调背光,测试了下realme 11 pro+的亮度情况,手机整体 brightness 12-18740 对应1.74 -456nit的 2.2gamma形亮度曲线。 这个形状的亮度曲线,在低亮度的时候,亮度变化会比较小。

从理论最大500nit计算,最小的亮度差应该是0.0025nit,410光学仪器在1-10nit的测试精度是2%,人眼全黑的状态下可以识别的亮度差大约是0.025nit。所以这个精度,应该是没有必要。

而具体测试了前1000个亮度,发现整体表现并不好,连最起码的单调递增都没有做到,亮度曲线有轻微的反复。这也很像MTK平台万级背光方案调节亮度跟内容修改参数没有匹配很好的现象。

主观看,在低亮部分,也能看到一些轻微抖动,所以这个2w级背光调节,对我们用户的实际体验,应该是没有特别的优化效果。

源码

百度网盘链接:百度网盘 请输入提取码 提取码:test

github下载地址:

GitHub - liuzhengliang1102/AndroidStudio-LearnAppDevelopment

ScreenBrightnessTest目录

点此查看Android应用开发学习笔记的完整目录

这篇关于Android应用开发(31)屏幕背光控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/371958

相关文章

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局