Flutter应用启动器切换插件launcher_switch的使用

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

Flutter应用启动器切换插件launcher_switch的使用

Getting Started

在你的pubspec.yaml文件中添加launcher_switch作为依赖项:

dependencies:
    launcher_switch: ^<最新版本>

配置

首先,在你的AndroidManifest.xml文件中添加各种图标作为activity-alias标签。例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application
        android:label="{YOUR_APPLICATION_NAME}"
        android:name="${applicationName}">
        <!-- 这是你默认的图标 -->
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

        <!-- 添加你的activity-alias标签 -->
        <activity-alias
            <!-- 在这种情况下,名称为.Icon2 -->
            android:name=".Icon2"
            android:exported="true"
            android:enabled="false"
            android:hardwareAccelerated="true"
            android:icon="@mipmap/ic_launcher_2"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity-alias>

        <!-- 根据你拥有的启动器图标数量添加更多的activity-alias标签 -->

        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>

需要注意的是:

  • application标签下的android:icon是默认图标。
  • 所有的activity-alias标签必须通过android:targetActivity指向MainActivity
  • 设置所有添加的activity-alias标签的android:enabledfalse
  • Android系统不会存储当前活动/别名的名称,因此建议使用SharedPreferences或其他持久化存储来避免问题。
  • 确保在manifest文件中定义了所有的图标键。
  • 确保android:iconres/mipmap目录中为每个别名创建(在这种情况下,第二个启动器图标是@mipmap/ic_launcher_2)。
  • 各个activity-alias的名称必须以点开头(如.Icon2, .IconAlias, .SecondActivity等)。

使用

  1. 导入并创建一个LauncherSwitch实例:
import 'package:launcher_switch/launcher_switch.dart';

final switcher = LauncherSwitch();
  1. 调用switchIcon函数来更改图标。假设这是你刚刚安装的应用程序,那么previousIconKey参数应为.MainActivity,而iconKey参数应为你的AndroidManifest.xml文件中任何别名的android:name属性(在这种情况下,它应该是.Icon2):
switcher.switchIcon(
    iconKey: ".Icon2",
    previousIconKey: ".MainActivity",
);

如果你想再次更改回主图标,之前的图标将是.Icon2,然后你可以使用别名的name属性设置新的图标。如果你想要更改回主图标,可以这样做:

switcher.switchIcon(
    previousIconKey: ".Icon2", // 这在你的情况下会有所不同
    iconKey: ".MainActivity",
);

重要提示

执行此功能后应用程序将关闭以便刷新图标,所以在调用此功能之前确保所有数据都已保存好。

示例代码

以下是一个完整的示例代码:

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

final launcherSwitch = LauncherSwitch();

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      home: HomeScreen(),
    );
  }
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("启动器切换"),
        backgroundColor: Theme.of(context).primaryColor,
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () {
                launcherSwitch.switchIcon(
                  iconKey: ".Icon2",
                  previousIconKey: ".MainActivity",
                );
              },
              child: const Text("切换图标"),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter应用启动器切换插件launcher_switch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter应用启动器切换插件launcher_switch的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter应用中使用launcher_switch插件来实现应用启动器切换的示例代码。launcher_switch插件允许你的Flutter应用在多个已安装的应用启动器(Launcher)之间切换。这在一些特定的设备上特别有用,比如那些支持工作配置文件(Work Profiles)的设备。

首先,确保你已经在pubspec.yaml文件中添加了launcher_switch依赖:

dependencies:
  flutter:
    sdk: flutter
  launcher_switch: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中,你可以使用以下代码来实现应用启动器切换:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _currentLauncher = "Unknown";

  @override
  void initState() {
    super.initState();
    _getCurrentLauncher();
  }

  Future<void> _getCurrentLauncher() async {
    String launcherName;
    try {
      launcherName = await LauncherSwitch.getDefaultLauncher();
    } catch (e) {
      launcherName = "Error getting launcher: ${e.message}";
    }
    setState(() {
      _currentLauncher = launcherName;
    });
  }

  Future<void> _switchLauncher(String launcherPackageName) async {
    try {
      bool success = await LauncherSwitch.setDefaultLauncher(launcherPackageName);
      if (success) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text("Switched to $launcherPackageName successfully!")),
        );
        _getCurrentLauncher(); // Update the current launcher name
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text("Failed to switch launchers.")),
        );
      }
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text("Error switching launchers: ${e.message}")),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Launcher Switch Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text('Current Launcher: $_currentLauncher'),
              SizedBox(height: 20),
              // 假设你有两个已知的启动器包名
              ElevatedButton(
                onPressed: () => _switchLauncher('com.example.launcher1'),
                child: Text('Switch to Launcher 1'),
              ),
              SizedBox(height: 10),
              ElevatedButton(
                onPressed: () => _switchLauncher('com.example.launcher2'),
                child: Text('Switch to Launcher 2'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 初始化应用时获取当前默认启动器:在initState方法中调用_getCurrentLauncher函数来获取当前默认的启动器名称。
  2. 定义切换启动器的函数_switchLauncher函数接受一个启动器的包名作为参数,并尝试将其设置为默认启动器。如果切换成功,它将更新当前启动器的名称。
  3. UI展示:在UI中显示当前默认启动器的名称,并提供两个按钮来切换到其他已知的启动器。

注意

  • 你需要确保设备上安装了指定的启动器,并且它们有对应的包名。
  • 并不是所有的设备都支持启动器切换,因此在尝试切换之前,最好检查设备的兼容性。
  • 由于安全限制,某些启动器可能不允许被切换,或者需要额外的权限。

这个示例代码提供了一个基本的框架,你可以根据需要进行扩展和修改。

回到顶部