当前位置: 首页 > 知识库问答 >
问题:

Appstate在Android原生React中不断更新

郭远
2023-03-14

我在React本地项目上工作,在那里我获得了位置权限。此外,我必须跟踪位置的权限,总是像如果用户已经给了权限访问后,安装应用程序,然后在一段时间后,用户去设备设置中的应用程序设置和禁用/撤销权限。再次,一旦应用程序从后台到前台,我必须检查权限的基础上,需要显示的消息。

componentDidMount = async () => {
    AppState.addEventListener('change', this.handleAppStateChange);
  };

  componentWillUnmount() {
    AppState.removeEventListener('change', this.handleAppStateChange);
    Geolocation.clearWatch(this.watchID);
  }

  handleAppStateChange = async nextAppState => {
    const {appState} = this.state;
    console.log('nextAppState -->', nextAppState);
    console.log('appState -->', appState);
    if (appState === 'active') {
      // do this
      this.showLoader();
      await this.requestAndroidLocationPermission();
    } else if (appState === 'background') {
      // do that
    } else if (appState === 'inactive') {
      // do that other thing
    }

    this.setState({appState: nextAppState});
  };

requestAndroidLocationPermission = async () => {
    try {
      const granted = await PermissionsAndroid.request(
        PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION,
        {},
      );
      if (granted === PermissionsAndroid.RESULTS.GRANTED) {
        this.getLatitudeLongitude();
      } else if (granted === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN) {
        this.hideLoader();
        this.setState({
          errorMessage: 'Location permission is denied',
          isLoading: false,
        });
      } else {
        this.hideLoader();
        this.requestAndroidLocationPermission();
      }
    } catch (err) {
      console.warn(err);
    }
  };
appState --> active
nextAppState --> background
appState --> active
nextAppState --> background
appState --> active
nextAppState --> background
appState --> active

这怎么处理?有什么建议吗?

共有1个答案

颜志业
2023-03-14

我也有同样的问题。不要使用AppState。是有缺陷的。

问题在于RN对“背景”的定义。react-native使用Android的activity(UI线程的持有者和UI所在的位置)onPause回调作为发送“background”信号的触发器。但是,每当有东西出现在活动的视图中时,就会称为onPause,比如对话框(比如权限框),其他活动(比如文件选择器),等等;对于android react-native来说,“background”意味着“被外部UI元素/android任务隐藏”,而不是“暂停并发送到background以执行其他操作”,从而导致您所看到的循环。最短的解决方案是在ReactActivity中重写onPause,并添加控制条件以确保super.onPause仅在实际进入后台时调用,比如检查任务堆栈,或者在调用权限对话框时调用,这样就可以避免这种循环/错误调用。第二个选择是提供您自己的应用程序生命周期事件,并提供明确的触发条件。

 类似资料:
  • 我已经完成了所有的设置为Android和iOS反应原生从下面的链接在我的mac mashine。 项目已成功创建。但当我试图在终端中使用以下命令运行Android项目时: 我得到了下面的错误 > 问题:配置项目“:app”时出现问题。 SDK目录“/usr/local/opt/android SDK”不存在。 尝试:使用--stacktrace选项运行以获取堆栈跟踪。使用--info或--debu

  • 我正在我的react本机应用程序中添加图像上传。我通过npm安装得很好,也链接得很好 现在,每次我试图运行项目时,我都会得到以下错误

  • 我试图改变用户界面之前,用户离开应用程序(用户是在多任务视图或切换到一些其他应用程序)。更具体的是,当用户离开应用程序时,我想添加一个带有应用程序徽标的全屏视图。 这是Android上的bug吗?如果没有,我有什么选择让它在Android上工作。 谢了。

  • 每次我重新打开项目和模拟器时,我都必须在命令提示符中运行和吗? 谢谢。

  • 我克隆了存储库:https://github.com/facebook/react-native,并尝试在Android仿真器上运行UIExplorer示例。 我在Android模拟器上收到了这个错误消息:

  • 遇到这个问题的人都无法解决配置':react-native-fast-image:classpath'的所有工件,并且找不到com.android.tools.build:gradle:3.6.3?我试着打开项目结构,看到gradle插件工具是3.6.3,而gradle版本是5.4.6,但我不知道现在发生了什么 build.gradle文件: