我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android 11 来袭,一起来看看怎么适配

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android 11 来袭,一起来看看怎么适配

我的公众号程序员徐公,四年中大厂工作经验,回复黑马,领取 Android 学习视频一份,回复徐公666,可以获得我精心整理的简历模板,带你走近大厂。

作者:唯鹿
来源:https://juejin.cn/post/6948211914455384072

Android R
终于开始了Android 11的适配工作。记录一下,供需要的人参考。

1. 准备工作

老规矩,首先将我们项目中的 targetSdkVersion 改为 30。或者使用兼容性调试工具,后面我会说到。

2. 存储机制更新

Scoped Storage(分区存储)

具体适配方法和去年的Android 10
适配攻略
中的没有太大区别。

不过需要注意的是,应用targetSdkVersion >= 30,强制执行分区存储机制。之前在AndroidManifest.xml中添加
android:requestLegacyExternalStorage="true"的适配方式已不起作用。

还有一个变化:Android 11 允许使用除 MediaStore API 之外的 API 通过文件路径直接访问共享存储空间中的媒体文件。其中包括:

  • File API。
  • 原生库,例如 fopen()

如果你之前没有适配Android 10,这一点对你来说是个好消息。Android 10在AndroidManifest.xml中添加
android:requestLegacyExternalStorage="true"来适配,Android 11上直接使用File
API访问媒体文件。不得不说,等等党的胜利?

不过,使用原始文件路径直接访问共享存储空间中的媒体文件会重定向到 MediaStore
API,这次重定向会造成性能影响(随机读写慢一倍左右)。而且直接使用原始文件路径,并不会比使用 MediaStore API
有更多优势,因此官方强烈建议直接使用 MediaStore API。

MANAGE_EXTERNAL_STORAGE

当然还有一种简单粗暴的适配方法,获取外部存储管理权限。如果你的应用是手机管家、文件管理器这类需要访问大量文件的app,可以申请MANAGE_EXTERNAL_STORAGE权限,将用户引导至系统设置页面开启。代码如下:


public static void checkStorageManagerPermission(Context context) {    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&                !Environment.isExternalStorageManager()) {        Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        context.startActivity(intent);    }}

在这里插入图片描述

需要注意的是即使你有了MANAGE_EXTERNAL_STORAGE权限,也无法访问Android/data/ 目录下的文件。

对于MANAGE_EXTERNAL_STORAGE权限,国内使用应该没有什么影响。但是在Google
Play上需要说明为什么已有的SAFMediaStore不满足你的应用需求,审核通过才允许上架使用。所以一般情况下,我个人不推荐你为了适配简单,直接申请使用MANAGE_EXTERNAL_STORAGE权限。

其他细节变更见文档:Android 11
中的存储机制更新

相关api变更及使用推荐郭霖大神的这篇:Android 11新特性,Scoped
Storage又有了新花样

存储访问框架 (SAF)变更

Android 11对SAF添加以下限制:

  • 使用 ACTION_OPEN_DOCUMENT_TREEACTION_OPEN_DOCUMENT,无法浏览到Android/data/Android/obb/ 目录及其所有子目录。
  • 使用 ACTION_OPEN_DOCUMENT_TREE无法授权访问存储根目录、Download文件夹。

REQUEST_INSTALL_PACKAGES

在8.0的适配中,我们安装apk包之前需要申请“安装未知来源应用”的权限。一般来说首次是跳转到授权页面让用户手动开启,然后返回app进行安装。

在Android 11中当用户开启“安装未知来源应用”的权限,app就会被杀死。该行为与强制分区存储有关,因为持有
REQUEST_INSTALL_PACKAGES 权限的应用可以访问其他应用的Android/obb 目录。

好在用户授予权限之后,虽然app会被杀死,但是 安装页面依然会弹出

目前对于这一变更我没有发现可以适配处理的方式,详细介绍见:Android
11特性调整:安装外部来源应用需要重启APP


这里补充一下,因为其他应用无法访问应用的Android/data/
Android/obb/目录及其所有子目录。所以需要注意保存在这里面的文件是否会被其他程序访问。

比如我在用系统的裁切功能时,因为设置的MediaStore.EXTRA_OUTPUT文件是私有目录下的,导致裁剪后的图片无法正确生成。所以需要针对android
11进行适配:

String fileName = System.currentTimeMillis() + ".jpg";if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {    // 裁剪无法访问App的私有目录,所以可以保存至公有目录    ContentValues values = new ContentValues();    values.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");    values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/Crop");    Uri uri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);} else {    ...}

或者保存至Android/media共享文件目录,这样不用适配版本。

String fileName = System.currentTimeMillis() + ".jpg";File file = new File(this.getExternalMediaDirs()[0].getAbsolutePath() + File.separator + fileName);intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));

当然如果你是自己实现的裁剪功能,那么不受影响。

3.权限变化

单次权限授权

从 Android 11
开始,每当应用请求与位置信息、麦克风或摄像头相关的权限时,面向用户的权限对话框会包含仅限这一次选项。如果用户在对话框中选择此选项,系统会向应用授予临时的单次授权。

单次权限授权

单次权限授权的应用可以在一段时间内访问相关数据,具体时间取决于应用的行为和用户的操作:

  • 当应用的 Activity 可见时,应用可以访问相关数据。
  • 如果用户将应用转为后台运行,应用可以在短时间内继续访问相关数据。
  • 如果您在 Activity 可见时启动了一项前台服务,并且用户随后将您的应用转到后台,那么您的应用可以继续访问相关数据,直到该前台服务停止。
  • 如果用户撤消单次授权(例如在系统设置中撤消),无论您是否启动了前台服务,应用都无法访问相关数据。与任何权限一样,如果用户撤消了应用的单次授权,应用进程就会终止。

当用户下次打开应用并且应用中的某项功能请求访问位置信息、麦克风或摄像头时,系统会再次提示用户授予权限。

如果你之前就是使用权限时才请求相关权限,那么这一变更对于你的应用没有影响。

请求位置权限

这部分在Android 10的适配有过调整,当时规则如下:

请求ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION权限表示在前台时拥有访问设备位置信息的权限。在请求弹框中,选择“始终允许”表示前后台都可以获取位置信息,选择“仅在应用使用过程中允许”只表示拥有前台的权限。

在Android 11中,请求弹框中取消了“始终允许”这一选项。也就是说 默认不会授予你后台访问设备位置信息的权限
。如果尝试请求ACCESS_BACKGROUND_LOCATION权限的同时请求任何其他权限,系统会抛出异常,不会向应用授予其中的任一权限。

官方给出的适配建议及原因如下:

建议应用对位置权限执行递增请求,先请求前台位置信息访问权限,再请求后台位置信息访问权限。执行递增请求可以为用户提供更大的控制权和透明度,因为他们可以更好地了解应用中的哪些功能需要后台位置信息访问权限。

总结一下得出两点:

  • 先请求前台位置信息访问权限,再请求后台位置信息访问权限。
  • 单独请求后台位置信息访问权限,不要与其他权限一同请求。

这里还需要注意不同目标平台应用在Android 11上的表现:

  • Android 10 为目标平台的应用 允许同时访问前后台的位置信息权限,但同样不会有“始终允许”这一选项。
  1. 没有前后台的位置信息权限时:

没有前后台的位置信息权限

  1. 有前台的位置信息权限时:

有前台的位置信息权限

  • Android 11 为目标平台的应用
  1. 没有前后台的位置信息权限时,只能先请求前台的位置信息权限:

在这里插入图片描述

  1. 有前台的位置信息权限,请求后台的位置信息时系统会跳转到下面的设置页面。

定位权限设置页
选择“始终允许”表示具有前后台位置信息访问权限,如果用户拒绝两次应用定位访问请求(直接返回等),后面请求相同权限都会被直接提示请求失败。(这里就需要我们给用户以引导了)

这里解释一下“拒绝两次”,这是Android 11
上添加的权限对话框的可见性,以前我们点击了“不再询问”表示拒绝授权。现在还包含类似上面这种转到系统设置,然后点返回按钮,也算是拒绝授权。当然,用户按返回按钮关闭权限对话框,此操作不算。

总结一下,与Android 10的区别就是将后台权限的申请分离了出来,增加了用户“拒绝”的条件,避免了应用重复请求用户已拒绝的权限。

软件包可见性

软件包可见性是Android
11上提升系统隐私安全性的一个新特性。它的作用是限制app随意获取其他app的信息和安装状态。避免病毒软件、间谍软件利用,引发网络钓鱼、用户安装信息泄露等安全事件。

获取自动可见应用的列表,可以执行命令adb shell dumpsys package queries,找到 forceQueryable
部分。下面是在vivo iqoo手机的执行结果。

Queries:  system apps queryable: false  forceQueryable:    [com.android.BBKCrontab,com.vivo.fingerprint,com.vivo.epm,com.vivo.abe,com.vivo.fingerprintengineer,com.vivo.contentcatcher,com.vivo.floatingball,com.vivo.agent,com.vivo.nightpearl,android,com.wapi.wapicertmanage,com.vivo.vms,com.android.providers.settings,com.vivo.upslide,com.vivo.assistant,com.vivo.vivokaraoke,com.vivo.fingerprintui,com.android.wallpaperbackup,com.bbk.facewake,com.vivo.faceunlock,com.vivo.doubleinstance,com.vivo.audiofx,com.iqoo.powersaving,com.bbk.SuperPowerSave,com.vivo.vibrator4d,com.vivo.smartunlock,com.vivo.globalanimation,com.vivo.appfilter,com.vivo.voicewakeup,com.vivo.minscreen,com.android.bbklog,com.mobile.cos.iroaming,com.vivo.networkstate,com.vivo.daemonService,com.vivo.smartshot,com.vivo.vtouch,com.android.networkstack.tethering.inprocess,com.android.localtransport,com.vivo.pem,com.vivo.wifiengineermode,com.android.server.telecom,com.vivo.gamecube,com.vivo.aiengine,com.vivo.multinlp,com.vivo.smartmultiwindow,com.vivo.permissionmanager,com.qti.diagservices,com.vivo.bsptest,com.qti.snapdragon.qdcm_ff,com.vivo.dr,com.vivo.sps,com.android.dynsystem,com.vivo.setupwizard,com.vivo.gamewatch,com.android.keychain,com.vivo.faceui,com.android.networkstack.inprocess,com.android.location.fused,com.android.inputdevices,com.android.settings,com.iqoo.engineermode,com.vivo.fuelsummary]    [com.qualcomm.uimremoteserver,com.vivo.devicereg,com.qti.qualcomm.deviceinfo,com.volte.config,com.android.mms.service,com.android.ons,com.qualcomm.qcrilmsgtunnel,com.vivo.sim.contacts,com.qualcomm.qti.uimGbaApp,com.qualcomm.qti.modemtestmode,com.android.stk,com.android.vendors.bridge.softsim,com.qualcomm.uimremoteclient,com.qti.qualcomm.datastatusnotification,com.qualcomm.qti.uim,com.android.phone,com.qualcomm.qti.dynamicddsservice,com.qualcomm.qti.telephonyservice,com.android.cellbroadcastservice,com.android.providers.telephony,com.qti.dpmserviceapp,com.android.incallui]    [com.android.vivo.tws.vivotws,com.android.bluetooth]    com.android.nfc    com.android.se    com.android.networkstack.permissionconfig    com.android.shell    com.android.providers.media.module    com.android.wifi.resources.overlay.common    com.android.theme.icon_pack.filled.themepicker    com.android.theme.icon_pack.circular.themepicker    com.android.server.telecom.overlay.common......

可以看到都是系统应用包名,所以我们的三方应用默认是不可见的。此项变更影响比较多的是分享支付一类需要与其他应用交互的功能。下面举一个简单的例子:

private static boolean hasActivity(Context context, Intent intent) {    PackageManager packageManager = context.getPackageManager();    return packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).size() > 0;}public void test() {    Intent intent = new Intent();    intent.setClassName("com.tencent.mm", "com.tencent.mm.ui.tools.ShareImgUI");Log.d("hasActivity:", hasActivity(this, intent) + "");}

hasActivity方法中通过queryIntentActivities来判断此页面是否存在。但是在targetSdkVersion >= 30中,这些三方默认都是不可见的。所以都会返回false。类似方法getInstalledPackagesgetPackageInfo也受到相应的限制。

解决方法很简单,在AndroidManifest.xml 中添加queries元素,里面添加需要可见的应用包名。

             <- 指定微信包名        ...

我在适配中用到的还有下面的包名,我们可以按需添加:

                                 

除了直接添加包名的方式外,我们可以按intent和provider来添加:

                                                    ...

具体的规则参见:管理软件包可见性

当然,还有一种简单粗暴的方式,可以直接申请权限QUERY_ALL_PACKAGES。如果你的应用需要上架Google Play,那么可能要注意相关政策。为了尊重用户隐私,建议我们的应用按正常工作所需的最小软件包可见性来适配。

有一点需要说明一下,我们日常使用的startActivity
方法不受系统软件包可见性行为的影响,即使hasActivity为false,一样可以跳转。如果我们在做跳转前,进行类似hasActivity的判断,那么会受影响。

最后需要注意的是 ,使用queries元素需要Android Gradle 插件版本是 4.1及以上
,因为旧版本的插件并不兼容此元素,出现合并 manifest 的错误。

前台服务类型

Android 10中,在前台服务访问位置信息,需要在对应的service中添加 location 服务类型。

同样的,Android 11中,在前台服务访问摄像头或麦克风,需要在对应的service中添加cameramicrophone 服务类型。

    ...   

这一限制的变更,使得程序无法在后台启动服务访问摄像头和麦克风。如需使用,只能是前台开启前台服务。除非有如下情况:

  • 服务由系统组件启动。
  • 服务是通过应用小部件启动。
  • 服务是通过与通知交互启动的。
  • 服务是PendingIntent启动的,它是从另一个可见的应用程序发送过来的。
  • 服务由一个应用程序启动,该应用是一个DPC,且在设备所有者模式下运行。
  • 服务由一个提供VoiceInteractionService的应用启动。
  • 服务由一个具有START_ACTIVITIES_FROM_BACKGROUND权限的应用启动。

权限自动重置

如果应用以 Android 11 或更高版本为目标平台并且数月未使用,系统会通过自动重置用户已授予应用的运行时敏感权限来保护用户数据。如下图所示:

权限自动重置

注意上图中有一个启动自动重置的开关。如果我们的应用有特殊需要,可以引导用户关闭它。示例代码如下:

public void checkAutoRevokePermission(Context context) {// 判断是否开启    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&            !context.getPackageManager().isAutoRevokeWhitelisted()) {        // 跳转设置页            Intent intent = new Intent(Intent.ACTION_AUTO_REVOKE_PERMISSIONS);        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        intent.setData(Uri.fromParts("package", context.getPackageName(), null));        context.startActivity(intent);    }}

SYSTEM_ALERT_WINDOW权限

这部分我在适配中没有用到,直接照搬文档:

在 Android 11 中,系统会根据请求自动向某些类型的应用授予 SYSTEM_ALERT_WINDOW 权限:

  • 系统会自动向具有 ROLE_CALL_SCREENING 且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限。如果应用失去 ROLE_CALL_SCREENING,就会失去该权限。
  • 系统会自动向通过 MediaProjection 截取屏幕且请求 SYSTEM_ALERT_WINDOW 的所有应用授予该权限,除非用户已明确拒绝向应用授予该权限。当应用停止截取屏幕时,就会失去该权限。此用例主要用于游戏直播应用。

这些应用无需发送 ACTION_MANAGE_OVERLAY_PERMISSION 以获取 SYSTEM_ALERT_WINDOW
权限,它们只需直接请求 SYSTEM_ALERT_WINDOW 即可。

MANAGE_OVERLAY_PERMISSION intent 始终会将用户转至系统权限屏幕

从 Android 11 开始,ACTION_MANAGE_OVERLAY_PERMISSION intent
始终会将用户转至顶级设置屏幕,用户可在其中授予或撤消应用的 SYSTEM_ALERT_WINDOW 权限。intent 中的任何 package:
数据都会被忽略。

在更低版本的 Android 中,ACTION_MANAGE_OVERLAY_PERMISSION intent
可以指定一个软件包,它会将用户转至应用专用屏幕以管理权限。从 Android 11
开始将不再支持此功能,而是必须由用户先选择要授予或撤消哪些应用的权限。此变更可以让权限的授予更有目的性,从而达到保护用户的目的。

读取手机号

如果你是通过TelecomManagergetLine1Number方法,或TelephonyManagergetMsisdn方法获取电话号码。那么在Android
11中需要增加READ_PHONE_NUMBERS权限。使用其他方法不受限。

            

4.其他行为变更

自定义view的Toast

Android 11 为目标平台的应用,从后台发送自定义view的Toast消息系统会进行屏蔽。 前台使用不受影响
Toast相应的setViewgetView也已经废弃不建议使用。

如果要在后台使用,推荐使用默认的toast或Snackbar替代。

APK签名

Android 11 为目标平台的应用,仅通过v1 签名的应用无法在Android 11的设备上安装或更新。必须使用v2或更高版本进行签名。

同时Android 11 添加了对 APK 签名方案
v4
的支持。

AsyncTask

AsyncTask在Android 11已经不建议使用,建议迁移至kotlin的协程。

此外Handler未指定Looper的构造方法也已不建议使用。
Handler源码

建议明确指定Looper

private Handler handler = new Handler(Looper.myLooper());// 或private Handler handler = new Handler(Looper.getMainLooper());

状态栏高度

发现系统为Android 11的手机上targetSdkVersion
是30时获取状态栏高度为0,低于30获取值正常。。。因此需要使用WindowMetrics 适配一下:

public static int getStatusBarHeight(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);        WindowMetrics windowMetrics = wm.getCurrentWindowMetrics();        WindowInsets windowInsets = windowMetrics.getWindowInsets();        Insets insets = windowInsets.getInsetsIgnoringVisibility(WindowInsets.Type.navigationBars() | WindowInsets.Type.displayCutout());        return insets.top;    }       ....}

WindowMetrics是Android
11新增的类,用于获取窗口边界,同样可以用来获取导航栏高度。

5.新增工具

兼容性调试工具

以往我们做适配的时候,需要先将我们项目中的 targetSdkVersion
修改为对应版本。这就导致你适配过程中有可能受到其他变更的影响,而这个新增的兼容性调试工具可以让你在不升级targetSdkVersion的情况下,针对每项变更逐个开启适配。

使用方法:

  • 开发者选项中找到应用兼容性变更选项。
  • 点击进入找到你需要调试的应用
  • 在变更列表中,找到想要开启或关闭的变更,然后点击相应的开关。

在这里插入图片描述
上面第一行DEFAULT_SCOPED_STORAGE就是启用分区储存,这些常量详细的含义见:Android 11
变更列表

对于兼容性调试工具详细的使用方法见:兼容性框架工具,这里限于篇幅就不展开说了。

无线调试

Android 11的开发者选项中添加了一个无线调试的功能。类似于连接蓝牙耳机功能,可以无需USB连接线进行日常开发调试工作。(区别于以前的Android
WIFI ADB,这个是真无线,哈哈)

无线调试

使用方法:

  • 开发者选项中找到无线调试并打开。
  • 首次配对需点击“使用配对码配对设备”
  • 运行 adb pair ipaddr:port后输入配对码进行连接。

注意事项:

  • 保持电脑和手机在一个网络。
  • Platform Tools 版本需大于30.0。可使用adb --version查看。

在这里插入图片描述

不过我自己体验下来,感觉连接不是很稳定,不知是AS的问题还是手机问题。同时锁屏后也会断开连接,体验不是很好。。。期待后续的优化吧。


本篇内容有点多。总结一下,Android
11在权限上的变更比较多,但如果你一直遵守申请权限相关的最佳做法,那么基本上不需要额外的适配工作。

最后强调一下,对于 单次授权,权限对话框的可见性,SYSTEM_ALERT_WINDOW 权限,安装apk 这些变更只要在Android
11上就会生效,不论你是否适配Android
11。对于其他变更和API(相机、5G、瀑布屏、键盘等),因为我暂时没有遇到,也就没有列出,有需要的可以点击文末的官方文档链接查看。

截止发这篇博客时,我手机上只发现哔哩哔哩已经适配了Android 11。大多数停留在28、29,更有甚者还在26(Android 8.0
国内上架的最低适配标准)。

所以我顺便附上之前写的Android 9、10的适配攻略:

在这里插入图片描述

可能本篇你暂时也用不上,你可以不用,但是不能没有。点赞收藏一波不过分吧~~

参考

如果觉得对你有所帮助的话,可以关注我的微信公众号程序员徐公

  1. 公众号程序员徐公回复黑马,获取 Android 学习视频
  2. 公众号程序员徐公回复徐公666,获取简历模板,教你如何优化简历,走进大厂
  3. 公众号程序员徐公回复面试,可以获得面试常见算法,剑指 offer 题解
  4. 公众号程序员徐公回复马士兵,可以获得马士兵学习视频一份

在这里插入图片描述

来源地址:https://blog.csdn.net/JasonXu94/article/details/129290096

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android 11 来袭,一起来看看怎么适配

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么设计一个看起来很厉害的API接口

本篇内容介绍了“怎么设计一个看起来很厉害的API接口”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一 安全性问题安全性问题是一个接口必须要保
2023-06-27

为什么云服务器看起来配置都很低

云服务器看起来配置低的原因可能有以下几点:1. 价格因素:云服务器供应商通常提供不同配置的云服务器,价格也因此不同。为了吸引更多用户,供应商可能提供低配置的云服务器,以更低的价格来吸引用户购买。2. 个人需求:对于一些个人用户或小型企业来说
2023-09-25

为什么云服务器看起来配置都很低

为什么云服务器配置看起来都很低?成本优化、可扩展性、弹性等因素导致云服务器配置看起来低于本地服务器。通过提供低配置选项,云服务提供商降低了成本,并增强了可扩展性和弹性。此外,共享资源、虚拟化和按需计费等特定原因也可能导致较低的配置。云服务提供商提供默认配置以确保稳定性,但用户可以根据需要进行调整,满足不同的使用场景需求。
为什么云服务器看起来配置都很低
2024-04-13

云服务器显卡配置怎么看的出来

首先,我们需要了解云服务器的显卡配置是如何决定的。通常来说,云服务器上的显卡配置与本地显卡配置是不同的,因为云服务器通常会将数据存储在远程的服务器上,需要更高的带宽和存储容量。因此,云服务器上的显卡配置需要更强大的处理器、内存和存储设备。云服务器上的显卡配置可以通过以下几种方式来观察:使用GPU加速器:GPU加速器可以
2023-10-27

怎么写出让人看起来很优雅舒服的python代码

这篇文章将为大家详细讲解有关怎么写出让人看起来很优雅舒服的python代码,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比
2023-06-02

SAP如何看一个采购申请是怎么来的

这篇文章主要讲解了“SAP如何看一个采购申请是怎么来的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SAP如何看一个采购申请是怎么来的”吧!SAP MM 如何看一个采购申请是由APO系统创建
2023-06-05

阿里云服务器配置参数表怎么看的出来

如果您是阿里云服务器的客户,可以通过以下方式获取服务器配置参数表:在阿里云控制台中查看“服务器配置”选项卡中的服务器配置信息。您可以在这里查看所有可用的服务器配置,包括CPU、内存、磁盘空间、网络带宽等信息。通过访问“服务器配置中心”页面,您可以查看该服务器的配置信息,包括硬件配置、操作系统、安全设置、网络设置等。如果
阿里云服务器配置参数表怎么看的出来
2023-10-28

Win10下怎么查看电脑配置以此来判断是否支持运行一些游戏

玩游戏www.cppcns.com或安装软件,经常需要考虑到电脑的配置是android否能够支持运行,但是在Win10系统下如何查看呢?其实Win10 系统自带的功能中就能够简单的查看电脑的配置。Win10系统下查看电脑配置的方法:php方
2023-06-09

怎么通过安装扩展让KDE Plasma 5桌面看起来感觉就像Windows 10桌面

这篇文章主要为大家展示了“怎么通过安装扩展让KDE Plasma 5桌面看起来感觉就像Windows 10桌面”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么通过安装扩展让KDE Plasma
2023-06-16

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录