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

如何检测Flutter应用是否运行在Google Play预启动报告设备上?

检测Flutter应用是否由Android预启动服务启动并禁用分析

Android 12及以上版本的预启动服务会提前启动应用以优化启动速度,这类场景下的活动可能会污染分析数据。由于Flutter没有直接提供检测API,我们需要通过**平台通道(MethodChannel)**调用Android原生代码实现检测逻辑,具体步骤如下:

1. Dart端实现平台通道

创建工具类封装原生调用逻辑:

import 'package:flutter/services.dart';

class PreLaunchDetector {
  static const MethodChannel _channel = MethodChannel('pre_launch_detector');

  // 调用原生方法检测是否为预启动
  static Future<bool> isPreLaunched() async {
    try {
      return await _channel.invokeMethod('isPreLaunched') ?? false;
    } on PlatformException catch (_) {
      // 调用失败时默认返回false
      return false;
    }
  }
}

2. Android原生端实现检测逻辑

在MainActivity.kt(或Java版本的MainActivity.java)中添加MethodChannel处理逻辑,通过Intent的Extra字段判断是否为预启动:

Kotlin版本

import android.os.Bundle
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "pre_launch_detector"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            when (call.method) {
                "isPreLaunched" -> {
                    // 检测Intent是否包含预启动标识
                    val isPreLaunched = intent?.getBooleanExtra("android.intent.extra.PRE_LAUNCHED", false) ?: false
                    result.success(isPreLaunched)
                }
                else -> result.notImplemented()
            }
        }
    }
}

Java版本

import android.os.Bundle;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodChannel;

public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "pre_launch_detector";

    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
                .setMethodCallHandler((call, result) -> {
                    if (call.method.equals("isPreLaunched")) {
                        boolean isPreLaunched = getIntent() != null && getIntent().getBooleanExtra("android.intent.extra.PRE_LAUNCHED", false);
                        result.success(isPreLaunched);
                    } else {
                        result.notImplemented();
                    }
                });
    }
}

3. 在应用初始化时控制分析功能

在main函数中调用检测方法,根据结果启用或禁用分析SDK:

import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 检测是否为预启动
  bool isPreLaunched = await PreLaunchDetector.isPreLaunched();
  
  // 根据状态控制分析功能
  if (!isPreLaunched) {
    // 启用分析,例如初始化Firebase Analytics
    // await FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(true);
  } else {
    // 禁用分析
    // await FirebaseAnalytics.instance.setAnalyticsCollectionEnabled(false);
  }

  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Pre Launch Demo',
      home: Scaffold(body: Center(child: Text(isPreLaunched ? '预启动状态' : '正常启动'))),
    );
  }
}

注意事项

  • 预启动是Android 12(API 31)及以上版本的特性,低版本系统会默认返回false。
  • 预启动的Activity在用户实际打开应用时会被销毁并重新创建,此时检测会返回false,不会影响正常使用。

内容的提问来源于stack exchange,提问作者Edward Cahyadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:35:27