flutter监听app进入前后台状态

本文介绍如何使用Flutter的WidgetsBindingObserver来监听应用的前后台状态及其它关键状态,包括内存压力、系统语言更改等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在开发app的过程中,我们经常需要根据app的前后台的状态,做一些事情,那么我们在flutter中是如何实现这一监听的?

flutter给我们提供了WidgetsBindingObserver来进行一些状态的判断,但是判断前后台的状态只是该API种其中一种功能,对于WidgetsBindingObserver需要注意两点

  • 最好是先进入而且不会销毁的页面, 这可以判断整个程序的前后台状态(例如:main。dart类中)
  • WidgetsBindingObserver需要被写在MateialApp或其它主题包裹的地方

1. 监听app进入前后台状态

  • 示例代码:
//1.第一步需要混入 WidgetsBindingObserver类, 里面的一些方法提供了程序状态的一些监听,我们可以重写方法来实现我们的逻辑
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  @override
  Widget build(BuildContext context) {

    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Container(color: Colors.orange,)
    );
  }

  //实现监听flutter中App的一些状态, 比如 进入前后台
  @override
  void initState() {
    super.initState();
    //2.页面初始化的时候,添加一个状态的监听者
    WidgetsBinding.instance?.addObserver(this);
  }

  @override
  void dispose() {
    super.dispose();
    //3. 页面销毁时,移出监听者
    WidgetsBinding.instance?.removeObserver(this);
  }

  //一些状态改变监听方法

  //监听程序进入前后台的状态改变的方法
  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    // TODO: implement didChangeAppLifecycleState
    super.didChangeAppLifecycleState(state);
    switch (state) {
    //进入应用时候不会触发该状态 应用程序处于可见状态,并且可以响应用户的输入事件。它相当于 Android 中Activity的onResume
      case AppLifecycleState.resumed:
        print("应用进入前台======");
        break;
    //应用状态处于闲置状态,并且没有用户的输入事件,
    // 注意:这个状态切换到 前后台 会触发,所以流程应该是先冻结窗口,然后停止UI
      case AppLifecycleState.inactive:
        print("应用处于闲置状态,这种状态的应用应该假设他们可能在任何时候暂停 切换到后台会触发======");
        break;
    //当前页面即将退出
      case AppLifecycleState.detached:
        print("当前页面即将退出======");
        break;
    // 应用程序处于不可见状态
      case AppLifecycleState.paused:
        print("应用处于不可见状态 后台======");
        break;
    }
  } 
}

执行结果:
在这里插入图片描述

2.其它状态监听

//当前系统改变了一些访问性活动的回调
  @override
  void didChangeAccessibilityFeatures() {
    super.didChangeAccessibilityFeatures();
  }

  //低内存回调
  @override
  void didHaveMemoryPressure() {
    super.didHaveMemoryPressure();
  }

  //用户本地设置变化时调用,如系统语言改变
  @override
  void didChangeLocales(List<Locale>? locales) {
    super.didChangeLocales(locales);
  }

  //应用尺寸改变回调,例如旋转
  @override
  void didChangeMetrics() {
    super.didChangeMetrics();
  }

  @override
  Future<bool> didPopRoute() {
    //return super.didPopRoute();
    print('YM--------didPopRoute');//页面弹出
    return Future.value(false);//true为拦截,false不拦截
  }

  @override
  Future<bool> didPushRoute(String route) {
    //return super.didPushRoute(route);
    print('YM--------PushRoute');  //拦截push
    return Future.value(false);
  }

  //平台主题改变时回调
  @override
  void didChangePlatformBrightness() {

    super.didChangePlatformBrightness();
  }
### 极光推送在 Flutter 中的登录集成 要在 Flutter 应用中通过极光推送实现登录功能,可以按照以下方式进行配置和使用: #### 1. 添加依赖 在 `pubspec.yaml` 文件中添加极光推送插件的依赖项。可以通过指定版本号或者路径的方式引入。 ```yaml dependencies: jpush_flutter: ^latest_version # 替换为最新版本号 ``` 如果需要本地调试或自定义修改,则可以直接引用本地路径[^1]: ```yaml dependencies: jpush_flutter: path: ./jpush-flutter-plugin/ ``` 完成上述操作后运行命令以更新依赖: ```bash flutter pub get ``` --- #### 2. 配置 Android 平台 在 Android 的 `app/build.gradle` 文件中添加必要的插件支持。以下是完整的配置示例[^2]: ```gradle apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply plugin: 'com.mob.sdk' // Mob SDK 插件用于极光推送初始化 apply plugin: 'com.huawei.agconnect' // 华为 AGC 支持(可选) ``` 同时,在项目的根目录下创建并编辑 `local.properties` 文件,确保指定了正确的 JDK 和 Android SDK 路径。 --- #### 3. 初始化极光推送服务 在 Dart 层面调用极光推送 API 完成初始化工作。具体代码如下[^3]: ```dart import 'package:jpush_flutter/jpush_flutter.dart'; class JPushService { final JPush jPush = JPush(); Future<void> initJPush() async { await jPush.setup( appKey: "your_app_key", // 替换为您申请的应用 App Key channel: "the_channel_of_your_choice", production: false, // 是否生产环境,默认开发模式 debug: true, ); /// 设置标签 (可选) List<String> tags = ["login_tag"]; try { bool result = await jPush.addTags(tags); print("设置标签结果: $result"); } catch (e) { print("设置标签失败: $e"); } /// 绑定账户 ID 到设备 (重要步骤) String userId = "user_001"; // 用户唯一标识符 await jPush.setAlias(userId).then((value) => print("绑定 Alias 成功")); } } ``` 注意:这里的 `setAlias` 方法会将用户的唯一标识符与当前设备关联起来,从而允许基于该用户发送个性化通知。 --- #### 4. 处理推送消息回调 为了响应来自服务器的消息事件,需注册监听器捕获各种类型的推送数据[^4]。例如处理接收到的通知或点击行为: ```dart void setupMessageHandler(JPush jPush) { jPush.addEventHandler( onReceiveNotification: (Map<String, dynamic> message) async { print("onReceiveNotification: $message"); }, onOpenNotification: (Map<String, dynamic> message) async { print("onOpenNotification: $message"); // 解析消息中的参数执行跳转逻辑 Map<dynamic, dynamic>? extras = message['extras']; if (extras != null && extras.containsKey('action')) { String action = extras['action'].toString(); switch (action) { case 'login': Navigator.pushNamed(context, '/login'); // 假设存在 /login 页面路由 break; default: break; } } }, ); } ``` 此部分实现了当用户打开一条特定类型的通知时触发页面导航的功能。 --- #### 5. 测试推送效果 测试前确认已正确填写应用密钥 (`App Key`) 及其他必要字段,并开启目标模拟器或真机上的网络连接。对于某些场景可能还需要额外配置厂商通道以便于后台杀掉进程的情况下仍能接收离线消息。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值