回到前台黑屏引发对Flutter项目生命周期与安卓原生生命周期的思考

起因:

目前我们是flutter项目,有个需求是需要在app内引导用户去appStore或是安卓的应用商店去评价,该需求我选用了两个插件in_app_review 和 launch_review, 然而仔做的过程中发现一个问题,当弹出系统的跳转应用商店的弹框时,iOS是单一弹框,Android是弹出一个选择打开商店的弹窗,可选择打开一次或是始终选择某一个商店打开,此时锁屏,然后再解锁,发现iOS没啥问题,安卓系统弹框后的flutter页面黑屏了

原因:

看到这个现象,目测是由于安卓的生命周期和flutter的生命周期没有同步,以下是验证过程
安卓的MainActivity添加生命周期方法


override fun onStart() {
        super.onStart()
        println("kotlin 收到了消息1onStart")
       // flutterEngine!!.lifecycleChannel.appIsResumed()
    }

    override fun onStop() {
        super.onStop()
        println("kotlin 收到了消息1onStop")
    }

    override fun onPause() {
        super.onPause()
        println("kotlin 收到了消息1onPause")
    }

flutter 添加生命周期方法


@override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);

    print("-didChangeAppLifecycleState-" + state.toString());
    switch (state) {
      case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假    设它们可能在任何时候暂停。

        print('这是冷启动');

        break;
      case AppLifecycleState.resumed: //从后台切换前台,界面可见
        
        print('这是resumed');
        break;
      case AppLifecycleState.paused: // 界面不可见,后台
        print('这是paused');
        break;
      case AppLifecycleState.detached: // APP结束时调用
        break;
    }
  }

还是刚才的场景 锁屏 安卓和flutter的后台方法都调用,解锁回到前台 只有安卓的前台方法走 MainActivity会restart,flutter的resume方法,没有调用,验证了开始的猜想,是由于flutter没有检测到前台操作或是这种情况flutter不认为自己在前台,导致flutter没有执行页面的重新绘制导致黑屏

解决:

关于flutter的生命周期,查阅资料发现 我们可以手动刷新flutter页面的状态,即使用

flutterEngine!!.lifecycleChannel.appIsResumed()

我们只需要在MainActivity restart的时候调用上述 方法 告知flutter重绘,该问题就解决了

关于原生加载flutter页面 生命周期相关 看这里 能有一些启发

你可能感兴趣的:(回到前台黑屏引发对Flutter项目生命周期与安卓原生生命周期的思考)