【发布时间】:2017-04-08 11:24:15
【问题描述】:
我正在使用 Headless.js 通过 React Native 运行后台服务。我们在使用它时面临着很多问题。使用 React Native 运行 Android 后台服务有哪些选择?
【问题讨论】:
标签: android react-native mobile-development
我正在使用 Headless.js 通过 React Native 运行后台服务。我们在使用它时面临着很多问题。使用 React Native 运行 Android 后台服务有哪些选择?
【问题讨论】:
标签: android react-native mobile-development
我猜你必须自己写。不幸的是,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);
【讨论】:
自从您提出这个问题以来,已经创建了几个软件包,根据您的具体用例可能会有所帮助。
具体来说,您可以使用react native queue 和react native background task 轻松安排后台任务定期执行(大约每~15 分钟,您的计划任务最多运行30 秒 - 使用队列来处理任务超时管理)您的应用程序已关闭(这适用于 iOS 和 Android 跨平台)。但是,如果您的意图是让服务在后台持续运行,我不确定这在 RN 世界中是否可行(就我发帖的时间而言)。
【讨论】:
添加文件名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')
}
【讨论】: