You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android多Flavor下部分变体最小化/打开Intent时Activity销毁问题

Android多Flavor下Activity异常销毁问题

问题现象

  • 项目包含3个Flavor,初始基于Flavor1开发,后续新增另外两个变体
  • Flavor1中应用最小化后重新打开无异常
  • Flavor2、Flavor3中,打开任意Intent或最小化应用时,栈顶Activity会立即被销毁,且触发onDestroy()方法

已尝试无效方案

  • 调整Activity的launchMode参数
  • 实现状态持久化逻辑
  • 配置alwaysRetainTaskState="true"

核心代码

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxxxxxxxxxx">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-feature android:name="android.hardware.camera" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_label"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.NoActionBar"
        android:usesCleartextTraffic="true">
        <activity
            android:name=".SubMenuActivity"
            android:exported="false"
            android:label="Submenu"
            android:parentActivityName=".WebActivity"
            android:theme="@style/Theme.AppCompat.DayNight.DarkActionBar"
            />
        <activity
            android:name=".login.LoginActivity"
            android:alwaysRetainTaskState="true"
            android:configChanges="orientation"
            android:label="@string/title_activity_login"
            android:launchMode="singleTop"
            android:noHistory="false"
            android:screenOrientation="portrait"
            android:exported="true">
            <intent-filter android:autoVerify="true">
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="xxxxx"
                    android:pathPattern="xxxx"
                    android:scheme="https" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:alwaysRetainTaskState="true"
            android:configChanges="orientation"
            android:launchMode="singleTop"
            android:noHistory="false"
            android:screenOrientation="portrait"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".WebActivity"
            android:alwaysRetainTaskState="true"
            android:configChanges="orientation"
            android:launchMode="singleTop"
            android:noHistory="false"
            android:screenOrientation="portrait" />

        <service
            android:name=".MyFirebaseMessagingService"
            android:stopWithTask="false"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="@string/fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/fileprovider" />
        </provider> 
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_action_name" />
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/colorAccent" />
    </application>

</manifest>

app/build.gradle

android {
    ..

    ..
    flavorDimensions "version"

    compileSdkVersion 31
    defaultConfig {
        applicationId "xxxxxx"
        minSdkVersion 26
        targetSdkVersion 31
        versionCode 203
        versionName "2.0.3"
        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
    }

    productFlavors {
        janbarn {
            dimension "version"
            applicationIdSuffix ".flavor1"
        }
        shapeshifterzz {
            dimension "version"
            applicationIdSuffix ".flavor2"
        }
        dwleven {
            dimension "version"
            applicationIdSuffix ".flavor3"
        }
    }

    buildTypes {
        release {
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            productFlavors.flavor1.signingConfig signingConfigs.flavor1
            productFlavors.flavor2.signingConfig signingConfigs.flavor2
            productFlavors.flavor3.signingConfig signingConfigs.flavor3
        }
    }

    sourceSets {
        janbarn {
            res {
                srcDirs 'src/flavor1/res'
            }
            java {
                srcDirs 'src/flavor1/java'
            }
        }
        shapeshifterzz {
            res {
                srcDirs 'src/flavor2/res'
            }
            java {
                srcDirs 'src/flavor2/java'
            }
        }
        dwleven {
            res {
                srcDirs 'src/flavor3/res'
            }
            java {
                srcDirs 'src/flavor3/java'
            }
        }
    }

    compileOptions{
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    lint {
        checkReleaseBuilds false
    }
    buildFeatures {
        viewBinding true
    }
}

排查方向

  • 检查Flavor专属代码/资源差异:
    • 查看Flavor2、Flavor3的src目录下是否有自定义Application类或Activity基类,是否在onTrimMemory、onLowMemory中主动触发了Activity销毁逻辑
    • 确认Flavor专属的AndroidManifest是否覆盖了Activity属性(比如误设noHistory="true")
  • 查看系统日志:
    • 过滤logcat中的ActivityManager标签,查看Activity被销毁的具体原因(比如进程被系统回收、异常触发)
  • 验证构建配置:
    • 确认Flavor2、Flavor3的签名配置是否正确,异常签名可能导致系统异常处理
    • 检查ProGuard规则,是否误删了Activity生命周期相关的关键代码
  • 隔离测试:
    • 在Flavor2、Flavor3中新建空白Activity,测试最小化是否会被销毁,排除业务代码干扰
    • 暂时移除Firebase、FileProvider等第三方组件,测试是否存在组件冲突

内容的提问来源于stack exchange,提问作者Fons Molenaar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:05:27