【问题标题】:React Native and Android Background ServicesReact Native 和 Android 后台服务
【发布时间】:2017-04-08 11:24:15
【问题描述】:

我正在使用 Headless.js 通过 React Native 运行后台服务。我们在使用它时面临着很多问题。使用 React Native 运行 Android 后台服务有哪些选择?

【问题讨论】:

    标签: android react-native mobile-development


    【解决方案1】:

    我猜你必须自己写。不幸的是,Headless JS 在任务完成时暂停,所以我不确定它是否合适。

    只要不触及 UI,您就可以在任务中执行任何操作:网络请求、计时器等。一旦你的任务完成(即 promise 被解决),React Native 将进入“暂停”模式(除非有其他任务正在运行,或者有前台应用程序)。

    https://facebook.github.io/react-native/docs/headless-js-android.html

    更新:如果应用失去焦点,可以保持进程运行。我将不得不寻找测试应用程序源,以提供示例。

    顺便说一句,我最终在 Android 中编写了一个后台服务,在启动时启动。 React Native 不允许这种类型的服务,RN 也不打算创建完全无头的应用程序。 应用注册:

    AppRegistry.registerHeadlessTask('SomeTaskName', () => require('SomeTaskName'));
    

    SomeTaskName.js:

    module.exports = async (taskData) => {
      // do stuff
    };
    

    Java API:

    public class MyTaskService extends HeadlessJsTaskService {
    
      @Override
      protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
          return new HeadlessJsTaskConfig(
              "SomeTaskName",
              Arguments.fromBundle(extras),
              5000, // timeout for the task
              false // optional: defines whether or not  the task is allowed in foreground. Default is false
            );
        }
        return null;
      }
    }
    

    AndroidManifest.xml

    <service android:name="com.example.MyTaskService" />
    

    例子:

    Intent service = new Intent(getApplicationContext(), MyTaskService.class);
    Bundle bundle = new Bundle();
    
    bundle.putString("foo", "bar");
    service.putExtras(bundle);
    
    getApplicationContext().startService(service);
    

    【讨论】:

    • 请添加一些代码,链接可能会在一段时间内失效
    • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
    • 我如何知道服务是否正在运行?我尝试过使用控制台日志,但它对我不起作用?请帮忙:(
    【解决方案2】:

    自从您提出这个问题以来,已经创建了几个软件包,根据您的具体用例可能会有所帮助。

    具体来说,您可以使用react native queuereact native background task 轻松安排后台任务定期执行(大约每~15 分钟,您的计划任务最多运行30 秒 - 使用队列来处理任务超时管理)您的应用程序已关闭(这适用于 iOS 和 Android 跨平台)。但是,如果您的意图是让服务在后台持续运行,我不确定这在 RN 世界中是否可行(就我发帖的时间而言)。

    【讨论】:

      【解决方案3】:

      添加文件名BackgroundAudio.java

      import android.content.Intent;
      import android.os.Bundle;
      
      import com.facebook.react.HeadlessJsTaskService;
      import com.facebook.react.bridge.Arguments;
      import com.facebook.react.jstasks.HeadlessJsTaskConfig;
      
      public class BackgroundAudio extends HeadlessJsTaskService {
      
          @Override
          protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
              Bundle extras = intent.getExtras();
              if (extras != null) {
                  return new HeadlessJsTaskConfig(
                          "BackgroundAudio",
                          Arguments.fromBundle(extras),
                          5000);
              }
              return null;
          }
      }
      

      编辑 AndroidManifest.xml

      <service android:name=".BackgroundAudio" android:enabled="true" android:label="BackgroundAudio" />
      

      然后在我的 index.android.js 中:

      import BackgroundAudio from './src/BackgroundAudio'
      AppRegistry.registerHeadlessTask('BackgroundAudio', () => BackgroundAudio)
      

      最后,index.android.js 中引用的 BackgroundAudio.js 文件如下所示:

      export async function BackgroundAudio (taskData) { 
          alert('BACKGROUND AUDIO')
      }
      

      【讨论】:

      • 如何启动**BackgroundAudio **服务
      • 什么时候启动,如何检查它是否在运行。控制台语句不起作用?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 2023-01-05
      • 1970-01-01
      相关资源
      最近更新 更多