Flutter求助:如何实现解锁手机锁屏后自动启动应用
锁屏解锁自动启动应用的可行实现方案
你当前使用的auto_start_flutter插件仅用于引导用户开启应用自启动权限(让应用被系统杀死后能自动重启),但无法实现「锁屏解锁时主动启动应用」的需求。要实现这个功能,需要结合Android原生广播接收器监听解锁事件,同时处理厂商后台限制,具体步骤如下:
一、核心原理
通过Android的BroadcastReceiver监听ACTION_USER_PRESENT系统广播(该广播在用户解锁屏幕时触发),收到广播后主动启动应用的主Activity。
二、具体实现步骤
1. 配置AndroidManifest.xml
在android/app/src/main/AndroidManifest.xml中添加必要权限并注册广播接收器:
<!-- 添加权限 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- Android 10+ 后台启动权限 --> <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <application ...> <!-- 注册锁屏解锁广播接收器 --> <receiver android:name=".LockScreenReceiver" android:exported="true"> <intent-filter> <action android:name="android.intent.action.USER_PRESENT" /> </intent-filter> </receiver> </application>
2. 编写原生广播接收器
在android/app/src/main/kotlin/[你的包名]/LockScreenReceiver.kt创建广播接收器类,收到解锁广播后启动应用主页面:
import android.content.BroadcastReceiver import android.content.Context import android.content.Intent class LockScreenReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { // 确认是解锁屏幕事件 if (intent?.action == Intent.ACTION_USER_PRESENT) { // 获取应用启动Intent并启动 val launchIntent = context?.packageManager?.getLaunchIntentForPackage(context.packageName) launchIntent?.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK context?.startActivity(launchIntent) } } }
3. 处理厂商后台限制
国内小米、华为、OPPO等厂商有独立的后台管理机制,需引导用户开启以下权限:
- 自启动权限:可继续使用
auto_start_flutter插件引导到厂商设置页面 - 忽略电池优化:避免应用被系统休眠
Flutter端请求忽略电池优化:
import 'package:flutter/services.dart'; Future<void> requestBatteryOptimizationIgnore() async { const platform = MethodChannel('com.your.app/battery'); try { await platform.invokeMethod('requestIgnoreBatteryOptimizations'); } on PlatformException catch (e) { print(e.message); } }
Android原生端实现MethodChannel方法(MainActivity.kt):
import android.content.Intent import android.os.Build import android.provider.Settings import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { private val CHANNEL = "com.your.app/battery" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> if (call.method == "requestIgnoreBatteryOptimizations") { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS).apply { data = android.net.Uri.parse("package:$packageName") } startActivity(intent) } result.success(null) } else { result.notImplemented() } } } }
4. 测试注意事项
- 必须使用release包测试,debug包会被部分厂商限制后台行为
- 测试前需完全退出应用,再锁屏解锁验证效果
内容的提问来源于stack exchange,提问作者GodHanmin
相关产品推荐
相关产品推荐

