Flutter开机自启插件launch_at_startup的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

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

1 回复

更多关于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'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例代码展示了如何检查并请求开机自启权限,以及启用和禁用开机自启接收器。注意,实际使用时可能需要根据具体需求调整代码。

注意事项

  • 并非所有设备都支持开机自启功能,有些设备可能需要用户手动授予权限或者在特定的设置中开启。
  • 请确保你的应用有合理的理由去请求开机自启权限,避免滥用该功能影响用户体验。
回到顶部