Flutter快捷操作插件quick_actions_android的使用

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

Flutter快捷操作插件quick_actions_android的使用

介绍

quick_actions_androidquick_actions 插件在 Android 平台上的实现。这个插件允许你在应用图标上设置快捷方式,方便用户快速访问应用中的特定功能。

使用方法

该插件是被认可的联邦插件(endorsed federated plugin),这意味着你可以正常地使用 quick_actions 插件。当你这样做时,这个插件会自动包含在你的应用程序中,因此你不需要将其添加到 pubspec.yaml 文件中。然而,如果你直接导入并使用该插件的 API,则需要将它添加到 pubspec.yaml 中。

与启动活动一起使用的注意事项

如果你有一个启动 FlutterActivity 的活动(默认情况下这是 MainActivity.javaMainActivity.kt),那么你可能需要修改该活动的启动配置以获得你期望的返回按钮行为和任务回退堆栈。常见的使用场景包括在“添加到应用”项目中或你的 Flutter 项目包含多个 Android 活动的情况下。

例如,假设你有两个不同的应用快捷方式,并且有一个启动 FlutterActivity 的启动活动。如果启动活动使用 singleTop 启动模式(Flutter 默认的 MainActivity.java/MainActivity.kt 就是这样做的),并且用户:

  1. 从第一个快捷方式启动应用。
  2. 通过退出应用将应用移至后台。
  3. 从第二个快捷方式重新启动应用。

那么用户将会看到第一个快捷方式启动的内容,而不是第二个快捷方式应该启动的内容。要解决这个问题,可以将启动活动的启动模式设置为 singleInstance,在 your_app/android/app/src/main/AndroidManifest.xml 文件中进行如下修改:

<activity
    ...
    android:launchMode="singleInstance">

根据你的使用情况,你可能还需要在启动 FlutterActivityIntent 中设置适当的启动模式标志,以实现你预期的返回按钮行为和任务回退堆栈。例如,如果 MainActivity.java 是你的启动活动启动的 FlutterActivity

public final class LauncherActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent mainActivityIntent = new Intent(this, MainActivity.class);
    mainActivityIntent.putExtras(getIntent());

    // 添加任何你需要的额外启动模式 Intent 标志:
    mainActivityIntent.addFlags(...);

    startActivity(mainActivityIntent);
    finish();
  }

  ...
}

有关不同启动模式和相关 Intent 标志的更多信息,请参阅 Android 文档。

示例代码

以下是一个完整的示例 Demo,展示了如何使用 quick_actions_android 插件:

// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// ignore_for_file: public_member_api_docs

import 'package:flutter/material.dart';
import 'package:quick_actions_android/quick_actions_android.dart';

void main() {
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Quick Actions Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String shortcut = 'no action set';

  [@override](/user/override)
  void initState() {
    super.initState();

    // 初始化快捷操作
    final QuickActionsAndroid quickActions = QuickActionsAndroid();
    quickActions.initialize((String shortcutType) {
      setState(() {
        // 设置快捷方式触发后的状态
        shortcut = '$shortcutType has launched';
      });
    });

    // 设置快捷方式项
    quickActions.setShortcutItems(<ShortcutItem>[
      const ShortcutItem(
        type: 'action_one', // 快捷方式类型
        localizedTitle: 'Action one', // 显示的标题
        icon: 'AppIcon', // 图标名称
      ),
      const ShortcutItem(
          type: 'action_two',
          localizedTitle: 'Action two',
          icon: 'ic_launcher'),
    ]).then((void _) {
      setState(() {
        if (shortcut == 'no action set') {
          shortcut = 'actions ready';
        }
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(shortcut), // 在工具栏上显示当前快捷方式的状态
      ),
      body: const Center(
        child: Text('在主屏幕上长按应用图标以获取 Action one 或 Action two 选项。点击该操作应设置工具栏标题。'),
      ),
    );
  }
}

更多关于Flutter快捷操作插件quick_actions_android的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter快捷操作插件quick_actions_android的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用quick_actions_android插件的示例代码。这个插件允许你定义快捷操作(Quick Actions),用户在设备的主屏幕上长按应用图标时可以触发这些操作。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加quick_actions_android依赖:

dependencies:
  flutter:
    sdk: flutter
  quick_actions_android: ^0.6.0  # 请检查最新版本号

2. 安装依赖

在命令行中运行以下命令来安装依赖:

flutter pub get

3. 配置AndroidManifest.xml

确保你的AndroidManifest.xml文件中声明了RECEIVE_BOOT_COMPLETED权限(这个权限不是必须的,但根据插件的文档,有时可能需要):

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <!-- 其他配置 -->

</manifest>

4. 实现快捷操作

在你的main.dart文件中,按照以下步骤实现快捷操作:

import 'package:flutter/material.dart';
import 'package:quick_actions_android/quick_actions_android.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  QuickActions _quickActions = QuickActions();

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    _initializeQuickActions();
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    _quickActions.dispose();
    super.dispose();
  }

  Future<void> _initializeQuickActions() async {
    // 设置快捷操作的标识符和名称
    await _quickActions.initialize((String shortcutId) async {
      if (shortcutId == 'action_search') {
        // 处理搜索快捷操作
        Navigator.pushNamed(context, '/search');
      } else if (shortcutId == 'action_share') {
        // 处理分享快捷操作
        Navigator.pushNamed(context, '/share');
      }
    });

    // 设置快捷操作的图标和标题(注意:快捷操作的图标和标题通常在应用的主屏幕图标配置中设置,而不是在代码中)
    // 这里只注册快捷操作的标识符
    await _quickActions.setShortcutItems(<ShortcutItem>[
      ShortcutItem(
        type: 'action_search',
        localizedTitle: 'Search',
        icon: 'ic_search',  // 图标名称,需要在res/drawable中定义
      ),
      ShortcutItem(
        type: 'action_share',
        localizedTitle: 'Share',
        icon: 'ic_share',  // 图标名称,需要在res/drawable中定义
      ),
    ]);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.resumed) {
      // 当应用从后台回到前台时,检查是否有快捷操作被触发
      _quickActions.invokeShortcutAction().then((String? shortcutId) {
        if (shortcutId != null) {
          // 处理快捷操作
          // 注意:这里的处理逻辑应该与_initializeQuickActions中的处理逻辑一致
          if (shortcutId == 'action_search') {
            Navigator.pushNamed(context, '/search');
          } else if (shortcutId == 'action_share') {
            Navigator.pushNamed(context, '/share');
          }
        }
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Quick Actions Demo'),
      ),
      body: Center(
        child: Text('Long press on app icon to see quick actions!'),
      ),
    );
  }
}

5. 定义路由(可选)

上面的示例代码中提到了/search/share路由,你需要在你的应用中定义这些路由。例如,在main.dart中添加以下代码:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
      routes: {
        '/search': (context) => SearchScreen(),
        '/share': (context) => ShareScreen(),
      },
    );
  }
}

class SearchScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Search Screen'),
      ),
      body: Center(
        child: Text('This is the search screen!'),
      ),
    );
  }
}

class ShareScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Share Screen'),
      ),
      body: Center(
        child: Text('This is the share screen!'),
      ),
    );
  }
}

注意事项

  1. 图标资源:快捷操作的图标需要在Android项目的res/drawable目录中定义。
  2. 权限问题:某些快捷操作可能需要额外的权限,确保在AndroidManifest.xml中声明必要的权限。
  3. 设备兼容性:快捷操作在不同设备和Android版本上的表现可能有所不同,务必进行充分的测试。

通过上述步骤,你应该能够在Flutter应用中成功实现快捷操作功能。

回到顶部