Ionic 5安卓应用最大化或打开通知栏时无响应冻屏问题咨询
问题根因定位
你遇到的两个报错和卡顿现象,和AWS App Sync的前台恢复同步逻辑高度相关,同时也和Ionic 5.x的安卓Activity生命周期回调异常有关:
Skip 100 frames, Main thread doing too much work是因为App Sync默认会在应用切回前台时,自动触发全量离线数据同步、订阅重连、缓存校验三个操作,这三个操作如果没有做异步配置,会直接阻塞主线程,旧版App Sync的安卓端适配没有把这部分逻辑放到工作线程,主线程被占满就会导致冻屏、路由卡顿error activityResumeTrigger: not whiteListed /mainactivity是Ionic 5.4.16版本的已知bug,安卓平台下第三方插件触发Activity resume回调时,没有被默认加入白名单,App Sync的重连逻辑刚好会触发这个回调校验,进一步加剧主线程阻塞
修复方案
1. 调整AWS App Sync的前台同步配置
找到项目中App Sync的初始化代码,添加以下配置项:
const client = new AWSAppSyncClient({ url: appSyncConfig.graphqlEndpoint, region: appSyncConfig.region, auth: { type: appSyncConfig.authenticationType, apiKey: appSyncConfig.apiKey, }, // 新增以下配置 offlineConfig: { // 关闭自动前台同步,改为按需手动触发 autoSync: false, // 同步逻辑强制放到异步线程执行 syncThread: 'background', // 订阅重连增加延迟,避免和Activity resume逻辑抢占资源 reconnectInterval: 3000, }, disableOffline: false });
如果需要保留同步能力,可以监听Ionic的resume事件,延迟2s后再手动触发同步,避免和系统Activity恢复逻辑抢占主线程资源:
import { Platform } from '@ionic/angular'; constructor(private platform: Platform) { this.platform.resume.subscribe(async () => { setTimeout(() => { // 手动触发业务所需的同步逻辑 client.sync(); }, 2000); }); }
2. 修复Activity白名单报错
在项目的config.xml中添加以下配置,把MainActivity加入resume触发白名单:
<preference name="AndroidResumeWhiteList" value="MainActivity" />
如果上述配置不生效,可以升级Cordova Android平台版本到9.1.0以上,这个白名单报错是Cordova Android 8.x版本的已知问题,和Ionic 5.4.16适配存在冲突。
3. 额外优化项
如果还有卡顿,可以在安卓AndroidManifest.xml中给MainActivity添加硬件加速配置:
<activity android:hardwareAccelerated="true" ... />
内容的提问来源于stack exchange,提问作者opindia
相关产品推荐
相关产品推荐

