Flutter开机自启插件launch_at_startup的使用
Flutter开机自启插件launch_at_startup的使用
插件简介
launch_at_startup
是一个允许Flutter桌面应用程序在启动或登录时自动运行的插件。它支持Linux、macOS和Windows平台。
平台支持
平台 | 支持情况 |
---|---|
Linux | ✔️ |
macOS | ✔️ |
Windows | ✔️ |
注意:macOS需要按照特定的安装说明进行配置
快速开始
安装
在您的pubspec.yaml
文件中添加依赖:
dependencies:
launch_at_startup: ^0.3.1
或者直接从GitHub获取最新代码:
dependencies:
launch_at_startup:
git:
url: https://github.com/leanflutter/launch_at_startup.git
ref: main
使用方法
以下是一个完整的示例应用,演示了如何使用launch_at_startup
插件来实现开机自启功能。
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:launch_at_startup/launch_at_startup.dart';
import 'package:package_info_plus/package_info_plus.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 获取应用信息
PackageInfo packageInfo = await PackageInfo.fromPlatform();
// 设置开机自启
launchAtStartup.setup(
appName: packageInfo.appName,
appPath: Platform.resolvedExecutable,
packageName: 'dev.leanflutter.examples.launchatstartupexample', // 仅用于MSIX支持
);
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Launch at Startup Demo',
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
bool _isEnabled = false;
@override
void initState() {
super.initState();
_checkStatus();
}
Future<void> _checkStatus() async {
final isEnabled = await launchAtStartup.isEnabled();
setState(() {
_isEnabled = isEnabled;
});
}
Future<void> _toggleStartup(bool enable) async {
if (enable) {
await launchAtStartup.enable();
} else {
await launchAtStartup.disable();
}
await _checkStatus();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Launch at Startup Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'当前状态: ${_isEnabled ? '已启用' : '未启用'}',
style: TextStyle(fontSize: 24),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () => _toggleStartup(!_isEnabled),
child: Text(_isEnabled ? '禁用开机自启' : '启用开机自启'),
),
],
),
),
);
}
}
此代码创建了一个简单的Flutter应用程序,用户可以通过点击按钮来切换开机自启的功能,并实时显示当前的状态。
macOS特殊配置
对于macOS平台,除了上述步骤外,还需要额外的操作以确保插件能够正常工作。具体来说,您需要修改macos/Runner/MainFlutterWindow.swift
文件,并根据需要调整Xcode中的项目设置。
// 在 macos/Runner/MainFlutterWindow.swift 中添加以下内容
import Cocoa
import FlutterMacOS
import LaunchAtLogin
class MainFlutterWindow: NSWindow {
override func awakeFromNib() {
let flutterViewController = FlutterViewController.init()
let windowFrame = self.frame
self.contentViewController = flutterViewController
self.setFrame(windowFrame, display: true)
// 添加与Flutter通信的方法通道
FlutterMethodChannel(
name: "launch_at_startup",
binaryMessenger: flutterViewController.engine.binaryMessenger
).setMethodCallHandler { call, result in
switch call.method {
case "launchAtStartupIsEnabled":
result(LaunchAtLogin.isEnabled)
case "launchAtStartupSetEnabled":
if let arguments = call.arguments as? [String: Any] {
LaunchAtLogin.isEnabled = arguments["setEnabledValue"] as! Bool
}
result(nil)
default:
result(FlutterMethodNotImplemented)
}
}
RegisterGeneratedPlugins(registry: flutterViewController)
super.awakeFromNib()
}
}
然后,在Xcode中打开macos/
文件夹并完成以下操作:
- 将LaunchAtLogin库添加到Swift Package Manager。
- 如果目标不是macOS 13及以上版本,则需添加一个新的“Run Script Phase”,并将脚本设置为
${BUILT_PRODUCTS_DIR}/LaunchAtLogin_LaunchAtLogin.bundle/Contents/Resources/copy-helper-swiftpm.sh
,同时取消勾选“Based on dependency analysis”。
以上就是关于launch_at_startup
插件的详细介绍及使用指南,希望对您有所帮助!
更多关于Flutter开机自启插件launch_at_startup的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter开机自启插件launch_at_startup的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用launch_at_startup
插件来实现开机自启功能的代码示例。这个插件允许你的Flutter应用在设备启动时自动运行。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加launch_at_startup
依赖:
dependencies:
flutter:
sdk: flutter
launch_at_startup: ^x.y.z # 替换为最新版本号
然后运行flutter pub get
来获取依赖。
2. 配置Android权限
由于开机自启功能涉及到系统权限,你需要在Android项目的AndroidManifest.xml
文件中添加必要的权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.yourapp">
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
...>
<receiver android:name=".BootCompletedReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
...
</application>
</manifest>
3. 创建BootCompletedReceiver类
在android/app/src/main/kotlin/com/example/yourapp/
(或者java
文件夹,如果你使用Java)下创建一个新的Kotlin/Java类,命名为BootCompletedReceiver
。这个类将处理BOOT_COMPLETED广播。
Kotlin版本:
package com.example.yourapp
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import io.flutter.embedding.android.FlutterActivity
class BootCompletedReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == Intent.ACTION_BOOT_COMPLETED) {
val flutterActivityIntent = Intent(context, FlutterActivity::class.java)
flutterActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context?.startActivity(flutterActivityIntent)
}
}
}
Java版本:
package com.example.yourapp;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import io.flutter.embedding.android.FlutterActivity;
public class BootCompletedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
Intent flutterActivityIntent = new Intent(context, FlutterActivity.class);
flutterActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(flutterActivityIntent);
}
}
}
4. 使用launch_at_startup
插件
在你的Flutter项目中,你可以使用launch_at_startup
插件来请求和检查开机自启权限。
Dart代码示例:
import 'package:flutter/material.dart';
import 'package:launch_at_startup/launch_at_startup.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
bool isEnabled = false;
@override
void initState() {
super.initState();
_checkAndRequestBootPermission();
}
Future<void> _checkAndRequestBootPermission() async {
bool hasPermission = await LaunchAtStartup.checkBootPermission();
if (!hasPermission) {
bool granted = await LaunchAtStartup.requestBootPermission();
if (granted != null && granted) {
isEnabled = true;
}
} else {
isEnabled = true;
}
setState(() {});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Launch at Startup Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Boot Permission Enabled: $isEnabled'),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
bool result = await LaunchAtStartup.enableBootReceiver();
if (result) {
setState(() {
isEnabled = true;
});
}
},
child: Text('Enable Boot Receiver'),
),
SizedBox(height: 10),
ElevatedButton(
onPressed: () async {
bool result = await LaunchAtStartup.disableBootReceiver();
if (result) {
setState(() {
isEnabled = false;
});
}
},
child: Text('Disable Boot Receiver'),
),
],
),
),
),
);
}
}
这个示例代码展示了如何检查并请求开机自启权限,以及启用和禁用开机自启接收器。注意,实际使用时可能需要根据具体需求调整代码。
注意事项
- 并非所有设备都支持开机自启功能,有些设备可能需要用户手动授予权限或者在特定的设置中开启。
- 请确保你的应用有合理的理由去请求开机自启权限,避免滥用该功能影响用户体验。