还没适配 Android 12 的要抓紧了(下)

简介: 还没适配 Android 12 的要抓紧了(下)

3. 性能和电池(以 Android 12 为目标版本)


3.1 精确的闹钟权限(新功能)


Android 12 系统引入了新的权限 android.permission.SCHEDULE_EXACT_ALARM,设置 AlarmManager 精准闹钟的应用必须在 Manifest 中请求 SCHEDULE_EXACT_ALARM 权限。此外,还新增了一个新的 API —— canScheduleExactAlarms(),用于检查应用的精准闹钟权限状态。

相关资料:设置重复闹钟时间


3.2 前台服务启动限制


Android 12 对应用从后台启动前台服务的行为做出限制,除了 后台启动限制的豁免 等少数情况外,如果应用尝试在后台运行时启动前台服务,系统会抛出 ForegroundServiceStartNotAllowedException 异常。应用可以使用 JobScheduler 中新引入的  加急作业 (expedited job) 来代替之前的做法。


提示: 如果一个应用调用 Context.startForegroundService() 以启动另一个应用拥有的前台服务,则这些限制仅适用于两个应用都针对 Android 12 或更高版本的情况。


3.3 通知 trampoline 限制


通知 trampoline (蹦床) 是指利用广播接收器或服务间接启动目标 Activity(用户与通知交互后,应用先启动服务或广播接收器作为中介,再去启动 目标 Activity)。Android 12 系统对通知 trampoline 做出限制,当应用尝试从通知 trampoline 启动 Activity,系统会拦截该启动行为:


Indirect notification activity start (trampoline) from PACKAGE_NAME, \
this should be avoided for performance reasons.
复制代码


如果你的应用使用了通知 trampoline,那么你需要切换为常规的 PendingIntent 方式。


第 4~6 节介绍的是针对所有应用的应用行为变更和新功能更新,我将这部分更新总结为 3 部分:


  • 4、用户体验(所有应用)
  • 5、安全和隐私设置(所有应用)
  • 6、性能和电池(所有应用)


4. 用户体验(所有应用)


4.1 Material You 设计语言(新功能)


Android 12 引入了一种名为  Material You 的新设计语言(对 Material Design 的再发展),可帮助构建更具个性化、更精美的应用。


image.png

4.2 富媒体内容插入(新功能)


Android 12 系统引入了一个统一 API,使得应用可以从统一的位置接受任何来源(剪贴板粘贴、键盘输入或拖放操作)的内容。例如:

image.png

相关资料:接收富媒体内容 —— 官方文档


4.3 支持 AVIF 图片(新功能)


Android 12 引入了对使用 AV1 图片文件格式 (AVIF) 的图片的支持。AVIF 是一种使用 AV1 编码的图片和图片序列的容器格式。AVIF 利用了视频压缩的帧内编码内容。与以前的图片格式(例如 JPEG)相比,这种格式可显著提升相同文件大小下的图片质量。


image.png


相关资料:AVIF has landed —— Jake Archibald 著


4.4 应用启动动画 API SplashScreen(新功能)


从 Android 12 系统开始,所有应用的冷启动和温启动期间,系统会使用新的 SplashScreen API 来启动应用启动动画。除了平台 API 外,Google 还提供了兼容库 API:androidx.core.splashscreen

image.png


在 SplashScreen API 之前,我们通常是利用 SplashActivity 的背景图 android:windowBackground 来实现应用启动转场效果,这个大家都很熟悉了。如果你不做任何适配,那么根据你配置的 windowBackground 资源值,在 Android 12 上会有不同的效果:


  • windowBackground 采用 @color/单色,则系统会使用该单色和应用的启动图标来构成启动效果,这可能与预期效果不符;
  • windowBackground 采用 @drawable/图片,则系统会继续使用该图片来构成启动效果,这个体验与低版本系统一致。


因此,如果你的应用采用的是 windowBackground 为图片资源的方式,那么你不适配也没有问题。需要升级启动效果的话,推荐参考以下资料:



可以看出,这次改动 Google 是希望提升下应用启动时的转场体验,同时也给予开发者更多自定义的想象空间。


4.5 Widget 桌面小部件改进


Android 12 改进了现有的 Widgets API,让它们更实用、更美观,且更易于发现。相关改动详见以下资料:

image.png

相关资料:


4.6 图形 API 改进



view.setRenderEffect(RenderEffect.createBlurEffect(radiusX, radiusY, SHADER_TILE_MODE))
复制代码

image.png


4.7 OverScroll 过度滑动动画改进


Android 12 修改了可滚动控件在边缘过度滑动(OverScroll)的动画效果,从低版本的边缘发光效果修改为拉伸和反弹效果。这个边缘过度滑动效果是可以关闭的,有两种方法:

  • 设置 android:overScrollMode=”never”
  • 设置 View#setOverScrollMode(View.OVER_SCROLL_NEVER)


4.8 通知改进


  • 电话通知:从 Android 12 系统开始,新增了新的电话通知样式 Notification.CallStyle
  • 丰富图片支持:从 Android 12 系统开始,应用可以在  MessagingStyle()  和  BigPictureStyle() 通知中提供动画图片,来丰富应用的通知体验。此外,应用现在还可以让用户在从通知栏回复消息时发送图片消息;
  • 设备解锁保障:从 Android 12 系统开始,应用可以通过 setAuthenticationRequired(true),要求系统在执行通知的 PendingIntent 前先要求用户解锁设备,这对于敏感操作增加了一层安全保障。


4.9 HTTP 深度链接解析改进


Android 系统支持通过 Deep Link 或 Android App Link 将深度链接与应用行为关联,实践中采用的链接基于 URI 格式,例如:


image.png


从 Android 12 系统开始,系统调整了 HTTP Intent 的默认解析行为。在低版本中,如果 HTTP 链接未命中任何 Deep Link / App Link 的匹配规则,那么系统会打开应用选择对话框;而现在系统会直接通过默认浏览器打开链接(因为该链接本身是一个可访问的网址)

image.png


相关资料:


4.10 全屏模式下的手势导航改进


全屏模式是指应用最大限度地利用屏幕空间来展示内容,让用户获得最佳体验,常见场景例如视频、游戏、演示文稿等。

image.png

全屏模式会隐藏状态栏、导航栏等系统栏,意味着用户无法轻松与系统栏交互,因此系统定义了以下全屏模式下的系统栏行为,使用 WindowInsetsControllerCompat.setSystemBarsBehavior 设置:


  • BEHAVIOR_SHOW_BARS_BY_TOUCH 模式,当用户点击屏幕任何位置后,会重新显示系统栏。这种模式适合于用户不会与屏幕进行大量互动的场景;
  • BEHAVIOR_SHOW_BARS_BY_SWIPE 模式,当用户从隐藏系统栏的边缘滑动时,会显示系统栏。例如从屏幕底部边缘向上滑动,会重新显示系统导航栏。这种模式适合于用户需要与屏幕进行大量交互的场景,例如游戏、阅读等,使用这种意图更强的手势能够避免系统栏交互与应用交互冲突;
  • BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 模式,当用户从隐藏系统栏的边缘滑动时,会暂时性地显示系统栏,并等待一小段时间后自动重新隐藏。系统栏会并不会挤压应用内容,而是以半透明的方式覆盖在应用上层。

Android 12 系统整合了现有模式,BEHAVIOR_SHOW_BARS_BY_TOUCH 和 BEHAVIOR_SHOW_BARS_BY_SWIPE 这两种行为现已弃用,新增了 BEHAVIOR_DEFAULT 行为。

  • BEHAVIOR_DEFAULT 模式:当用户从隐藏系统栏的边缘滑动时,会显示系统栏,这一点与 BEHAVIOR_SHOW_BARS_BY_SWIPE 类似。最主要的是,全面屏导航手势可以直接生效,不管系统导航栏是否可见。换句话说,BEHAVIOR_DEFAULT 行为让用户只需滑动一次即可执行手势导航,而在 Android 11 上则需要滑动两次。

image.png

相关资料:启用全屏模式


4.11 屏幕尺寸 API 变更


Android 11 系统废弃了 Display.getSize & Display.getMetrics,并在 Android 12 中继续废弃了 Display.getRealSize & Display.getRealMetrics。Android 设备有许多不同的外形(例如大屏设备、平板电脑和可折叠手机),为了针对适配每种设备上获取屏幕尺寸的需求,系统引入了 WindowMetrics API。


4.12 多窗口模式标准化


Android 7 系统引入了多窗口模式,允许同时在屏幕上显示多个应用,目前一共有 3 种多窗口模式:


  • 分屏模式: 以左右并排或上下并排显示两个应用;
  • 画中画模式: 以叠加的小窗口显示应用;
  • 自由窗口模式: 以可移动且可调整显示尺寸的窗口显示应用;

image.png


从 Android 12 系统开始,多窗口模式将成为大屏设备上的标准行为,大屏设备下 Activity 的 resizeableActivity 配置将被忽略。具体如下:


  • Android 7: 手机设备支持分屏模式,电视设备支持画中画模式,更大尺寸的设备制造商可以选择启用自由窗口模式。开发者可以设置 android:resizeableActivity=”false” 禁用多窗口模式,确保 Activity 始终以独占屏幕的方式显示;
  • Android 8: 手机设备也支持画中画模式;
  • Android 12: 在小屏设备(sw < 600dp)设备中,系统根据 resizeableActivity 配置确定该 Activity 是否启用多窗口模式,在大屏设备中,系统会忽略 resizeableActivity 配置,为所有 Activity 启用多窗口模式。在此之前,用户要操作的 Activity 不支持多窗口的话,用户只能先退出窗口,再回来,体验就中断了。


可以看出,这次改动 Google 是希望大屏设备下的多窗口模式成为标准行为,实现多窗口模式下的体验闭环


4.13 延迟展示前台服务通知


前台服务(startForegroundService 启动的服务)会显示一个系统通知,以便让用户应用正在执行任务并且消耗系统资源,即使该应用已经退出到后台。从 Android 12 系统开始,前台服务通知会延迟 10 s 显示,除非一些需要立即显示通知的服务。

以下是立即显示通知的情况:


  • 1、前台服务通知调用 NotificationCompat.Builder#setForegroundServiceBehavior(FOREGROUND_SERVICE_IMMEDIATE) 修改了显示行为;
  • 2、前台服务通知调用 NotificationCompat.Builder#addAction() 配置了可操作按钮;
  • 3、前台服务通知调用 NotificationCompat.Builder#setCategory() 配置为 CATEGORY_CALL、CATEGORY_NAVIGATION 或 CATEGORY_TRANSPORT;
  • 4、前台服务的 foregroundServiceType 取值 mediaPlayback、mediaProjection 或 phoneCall。

可以看出,这次改动 Google 是希望简化短期运行的前台服务的用户感知,既然服务很快就停止了,就没有必要用通知让用户注意到。

相关资料:


4.14 activity 生命周期改进


从 Android 12 开始,系统修改了 Activity Task 根 Activity 在处理 ”返回键“ 时的默认行为。在旧版本中,返回键会执行 finish Activity,而从 Android 12 开始会将 Task 任务栈切换到后台。此后,用户返回应用将执行热启动,应用的热启动简单得多,系统的工作只是将 Activity 恢复到前台。


Activity.java


public void onBackPressed() {
    if (mActionBar != null && mActionBar.collapseActionView()) {
        return;
    }
    FragmentManager fragmentManager = mFragments.getFragmentManager();
    if (!fragmentManager.isStateSaved() && fragmentManager.popBackStackImmediate()) {
        return;
    }
    if (!isTaskRoot()) {
        // If the activity is not the root of the task, allow finish to proceed normally.
        finishAfterTransition();
        return;
    }
    // 以上 Android 12 与旧版本相同,差别在下面这句:
    try {
        // Android 11
        // Inform activity task manager that the activity received a back press
        // while at the root of the task. This call allows ActivityTaskManager
        // to intercept or defer finishing.
        ActivityTaskManager.getService().onBackPressedOnTaskRoot(mToken,
                new IRequestFinishCallback.Stub() {
                    public void requestFinish() {
                        mHandler.post(() -> finishAfterTransition());
                    }
                });
        // Android 12
        // Inform activity task manager that the activity received a back press while at the
        // root of the task. This call allows ActivityTaskManager to intercept or move the task
        // to the back.
        ActivityClient.getInstance().onBackPressedOnTaskRoot(mToken,
                new RequestFinishCallback(new WeakReference<>(this)));
    } catch (RemoteException e) {
        finishAfterTransition();
    }
}
复制代码


可以看出,这次的改动 Google 希望通过 ”返回键**“ 退出的应用,能够更快地从热启动恢复应用,而不是从冷启动或温启动重启应用。**


4.15 Surface 帧率切换改进


Android 11 系统引入了一个 Surface 帧率切换 API setFrameRate(),但这个 API 并不总是会生效。由于不支持无缝切换帧率的屏幕在切换帧率时会有一两秒的黑屏,所以系统会对这一行为做拦截。如果屏幕不支持无缝切换,即使应用调用 setFrameRate() 依然会继续使用原来的帧率。

Android 12 系统引入了强制切换帧率的 API,这对于长视频内容的帧率切换更有优势,因为合适帧率带来的体验提升已经超过了不支持无缝切换带来的体验损失。

// 检查是否支持无缝切换帧率
val refreshRates = this.display?.mode?.alternativeRefreshRates
val willBeSeamless = Arrays.asList<FloatArray>(refreshRates).contains(newRefreshRate)
// 切换帧率,即使屏幕不支持无缝过渡
surface.setFrameRate(newRefreshRate, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)
复制代码


  • CHANGE_FRAME_RATE_ALWAYS: 总是切换帧率,即使屏幕不支持无缝过渡;
  • CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS: 仅在屏幕支持无缝过渡时切换帧率(旧版本行为)。


5. 安全和隐私设置(所有应用)


5.1 隐私信息中心(新功能)


Android 12 系统在系统设置中引入了隐私信息中心功能,可以让用户更好地了解应用正在访问数据的行为。隐私信息中心以一个时间轴的方式显示过去时间内所有应用对于麦克风、摄像头或位置等敏感信息的访问情况。

image.png


另外,系统定义了一个新的 Intent 操作 ACTION_VIEW_PERMISSION_USAGE_FOR_PERIOD,可以从隐私信息中心中向用户解释为什么应用需要访问这些隐私信息。要支持此功能,应用需要定义一个 Activity 并声明 IntentFilter 关联到此 Action 上,例如:


<!-- android:exported required if you target Android 12. -->
<activity android:name=".DataAccessRationaleActivity"
          android:permission="android.permission.START_VIEW_PERMISSION_USAGE"
          android:exported="true">
       <!-- VIEW_PERMISSION_USAGE shows a selectable information icon on
            your app permission's page in system settings.
            VIEW_PERMISSION_USAGE_FOR_PERIOD shows a selectable information
            icon on the Privacy Dashboard screen. -->
    <intent-filter>
       <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
       <action android:name="android.intent.action.VIEW_PERMISSION_USAGE_FOR_PERIOD" />
       <category android:name="android.intent.category.DEFAULT" />
       ...
    </intent-filter>
</activity>
复制代码

相关资料:解释对比较敏感信息的访问权限


5.2 支持只授予粗略位置权限(新功能)


Android 系统支持两个精度级别的位置信息,并且分别对应一个权限。虽然有两个精度级别的权限,但是因为它们处于同一个权限组中,所以应用只要请求授予其中一个权限,另一个权限就自动授予了。

  • 粗略位置: 精确到 3 平方公里的位置值,请求 ACCESS_COARSE_LOCATION 权限可以获得;
  • 精确位置: 精确到 50 米以内的位置值,请求 ACCESS_FINE_LOCATION 权限可以获得。


然而,从 Android 12 系统开始,这一规则不再成立了。从 Android 12 系统开始,用户可以只授予应用模糊位置 ACCESS_COARSE_LOCATION 权限,即使应用请求的是精确位置 ACCESS_FINE_LOCATION 权限。


举个例子,我们通过以下代码请求 ACCESS_FINE_LOCATION 权限,在 Android 12 系统上的权限请求弹窗会给用户两个选项:Precise 精确位置Approximate 粗略位置。如果用户选择授予粗略位置,那么最终应用获得的权限反而是 ACCESS_COARSE_LOCATION 权限,而不是一开始请求的 ACCESS_FINE_LOCATION 权限,并且应用也只能获取粗略位置信息。


val locationPermissionRequest = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { isGrant ->
    Log.i("权限","isGrant: $isGrant")
    if (PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)) {
        Log.i("权限", "ACCESS_COARSE_LOCATION is Grant")
    }
    if (PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)) {
        Log.i("权限", "ACCESS_FINE_LOCATION is Grant")
    }
}
findViewById<View>(R.id.tv).setOnClickListener {
    locationPermissionRequest.launch( Manifest.permission.ACCESS_FINE_LOCATION)
}
复制代码


输出日志:


I/权限: isGrant: false
I/权限: ACCESS_COARSE_LOCATION is Grant
复制代码

image.png


那么从 Android 12 开始,你在请求位置权限时就要注意以下问题,稍不注意就出现兼容问题了:


  • 请求位置权限时要同时请求 ACCESS_FINE_LOCATION 权限和 ACCESS_COARSE_LOCATION 权限,如果应用只请求 ACCESS_FINE_LOCATION 权限,系统会直接忽略该请求。如果应用以 Android 12 或更高版本为目标版本,系统会在 logcat 中提示错误:


ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
复制代码


提示:我在 Pixel 模拟器上实测并没有出现文档描述的 ”忽略请求“ 和 ”报错提示“,不过最好还是按照官方文档处理吧。


  • 即使用户已经授予了精确位置权限,用户依然可以进入系统设置中直接修改到粗略位置权限,修改后系统会自动杀死进程。
  • 为了更好地尊重用户隐私,尽量只请求 ACCESS_COARSE_LOCATION 权限,因为粗略位置信息已经能满足大多数应用场景。仅请求 ACCESS_COARSE_LOCATION 权限时,授权弹窗只有一个选项:

image.png


  • 如果你的应用场景确实需要请求 ACCESS_FINE_LOCATION 权限,那么你可以再次同时请求 ACCESS_FINE_LOCATION  和  ACCESS_COARSE_LOCATION 权限。由于之前用户已经授予过粗略位置权限,这次的系统弹窗会变成询问是否升级到精确位置权限:

image.png


image.png


有小伙伴发现部分 Android 12 系统的手机上,请求位置权限的行为跟低版本没有区别,这是因为有些厂商系统还没有完全实现这个功能。以小米 MIUI 13.0.5.0 为例,模糊定位功能需要打开 系统设置 - 隐私保护实验室 - 模糊定位 选项才能启用。而且我在该系统上实测后,发现即使用户只授予 ACCESS_COARSE_LOCATION 权限,另一个 ACCESS_FINE_LOCATION 权限也会同时授予,这个就离谱了,怪不得还在实验室。


可以看出,这次的改动是 Google 希望引导开发者尽量使用低精度的位置信息,提高对用户隐私的保护度。


相关资料:



5.3 麦克风和摄像头切换开关(新功能)


从 Android 12 系统开始,用户可以通过一个全局切换开关,停用整台设备上的摄像头或麦克风权限。当应用请求摄像头或麦克风权限时,系统有弹窗提示。这个切换开关在不同厂商系统上的体现不一样,比如小米系统是放在 手机关机-隐身模式


image.png

5.4 麦克风和摄像头指示标示(新功能)


从 Android 12 开始,当应用使用麦克风或相机时,在状态栏会有图标标记。


5.5 剪贴板访问提示(新功能)


在 Android 12 及更高版本中,当某个应用首次调用  getPrimaryClip  以 [从另一个应用访问剪辑数据](developer.android.google.cn/guide/topic… "getPrimaryClip( "从另一个应用访问剪辑数据")") 时,会弹出一个消息框消息,提示用户应用存在访问剪贴板的行为。


5.6 隐藏应用叠加窗口(新功能)


Android 12 系统引入了隐藏 TYPE_APPLICATION_OVERLAY 窗口的功能。声明  HIDE_OVERLAY_WINDOWS  权限后,应用可以调用  setHideOverlayWindows  指明当应用的窗口可见时隐藏所有可见的 TYPE_APPLICATION_OVERLAY 窗口。例如在显示敏感页面(如交易)时,应用可以选择隐藏其他悬浮窗。


5.7 应用无法关闭系统对话框


为了加强用户与应用和系统互动时的控制,从 Android 12 系统开始,弃用了  ACTION_CLOSE_SYSTEM_DIALOGS Intent 操作,当应用使用尝试关闭系统对话框时,除了 一些特殊情况 之外,系统会进行拦截:

  • 以 Android 12 或更高版本为目标版本:系统会抛出 SecurityException;
  • 以 Android 11 或更低版本为目标版本:系统不会执行 Intent,并在 logcat 提示:


E ActivityTaskManager Permission Denial: \
android.intent.action.CLOSE_SYSTEM_DIALOGS broadcast from \
com.package.name requires android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, \
dropping broadcast.
复制代码


5.8 屏蔽不信任的触摸事件


屏幕应用是用户与应用交互的主要方式,为了提高触摸交互的直观和安全性,Android 12 系统会屏蔽从不同应用的窗口传递的事件。因此,这次的改动主要影响 声明选择让触摸事件穿透窗口的应用,例如声明了 TYPE_APPLICATION_OVERLAY 和 FLAG_NOT_TOUCHABLE 的悬浮窗口。

详细分析见相关资料:行为变更 | Android 12 中不受信任的触摸事件 —— 官方博客文章


6. 性能和电池(所有应用)


6.1 应用待机分区改进


App Standby Buckets 应用待机分区是 Android 9 引入的电池管理功能,系统会对应用的使用新近度和使用频率对应用进行排序,分别放置在不同的分区中。更活跃的应用会被分配到更高优先级的分区中,而低优先级的分区中应用的作业、闹钟或 FCM 会有一定限制。Android 12 系统引入了一个新的分区 —— “受限” 待机分区:

  • 活跃:目前正在使用,或者最近刚刚使用;
  • 工作集:定期使用;
  • 常用:经常使用,但不会每天使用;
  • 极少使用:不经常使用;
  • 受限:应用消耗大量资源,或表现出不良行为
  • 从未使用:已安装但从未运行过。

旧版本的待机分区只是根据应用的活跃度排序,而现在还有引入资源占用率的维度。可以看出,这次改动是 Google 希望提高对消耗大量系统资源的应用的限制。

提示: 这些限制仅适用于设备使用电池供电的情况;在设备充电期间,系统不会对应用施加这些限制。

相关资料:应用待机分区 —— 官方文档


7. 总结


关注我,带你了解更多,我们下次见。


以下变更相对冷门,实用价值较低,暂且按住不表:

  • 行为变更 - Target 12 - 用户体验 - 大屏设备上的相机预览改进 & 富感反馈体验 & AppSearch & 游戏模式 & 近期网址共享(仅限 Pixel)
  • 行为变更:Target 12 - WebView 中的现代 SameSite Cookie & 备份和恢复 & 连接性 & 供应商 & 更新后的非 SDK 接口限制
  • 行为变更:所有应用 - 安全和隐私设置 - 权限软件包可见性 & 移除了 BouncyCastle 实现
  • 行为变更:所有应用 - 安全和隐私设置 -
  • 行为变更:所有应用 - 媒体 & 相机 & 图形和图片 & 连接性 & 更新后的非 SDK 接口限制
目录
相关文章
|
6月前
|
Web App开发 移动开发 小程序
"项目中mpaas升级到10.2.3 适配Android 14之后 app中的H5以及小程序都访问不了,
"项目中mpaas升级到10.2.3 适配Android 14之后 app中的H5以及小程序都访问不了,显示“网络不给力,请稍后再试”,预发内网版本不能使用,线上版本可以正常使用,这个是什么原因啊,是某些参数没有配置吗,还是说是一些参数改错了?
107 2
|
2月前
|
调度 Android开发 UED
Android经典实战之Android 14前台服务适配
本文介绍了在Android 14中适配前台服务的关键步骤与最佳实践,包括指定服务类型、请求权限、优化用户体验及使用WorkManager等。通过遵循这些指南,确保应用在新系统上顺畅运行并提升用户体验。
182 6
|
4月前
|
IDE API Android开发
安卓与iOS开发环境的差异及适配策略
在移动应用开发的广阔舞台上,Android和iOS两大操作系统各据一方,各自拥有独特的开发环境和工具集。本文旨在深入探讨这两个平台在开发环境上的关键差异,并提供有效的适配策略,帮助开发者优化跨平台开发流程。通过比较Android的Java/Kotlin和iOS的Swift/Objective-C语言特性、IDE的选择、以及API和系统服务的访问方式,本文揭示了两个操作系统在开发实践中的主要分歧点,并提出了一套实用的适配方法,以期为移动开发者提供指导和启示。
|
3月前
|
安全 Java Android开发
Android 14适配Google play截止时间临近,适配注意点和经验
本文介绍了Android 14带来的关键更新,包括性能优化、定制化体验、多语言支持、多媒体与图形增强等功能。此外,还强调了适配时的重要事项,如targetSdkVersion升级、前台服务类型声明、蓝牙权限变更等,以及安全性与用户体验方面的改进。开发者需按官方指南更新应用,以充分利用新特性并确保兼容性和安全性。
263 0
|
6月前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
670 4
|
6月前
|
Android开发
Android保存图片到相册(适配android 10以下及以上)
Android保存图片到相册(适配android 10以下及以上)
129 1
|
6月前
|
Android开发
Android RIL 动态切换 4G 模块适配
Android RIL 动态切换 4G 模块适配
180 0
|
6月前
|
Android开发
Android Uri转File方法(适配android 10以上版本及android 10以下版本)
Android Uri转File方法(适配android 10以上版本及android 10以下版本)
769 0
|
6月前
|
Java 物联网 Android开发
Android 12 蓝牙适配 Java版(下)
Android 12 蓝牙适配 Java版(下)
411 0
|
6月前
|
传感器 Java 定位技术
Android 12 蓝牙适配 Java版(上)
Android 12 蓝牙适配 Java版(上)
467 0