如何检测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
相关产品推荐
相关产品推荐

