React native React Native-Headless JS示例
关于这一点的react本地文档似乎并不完整。我遵循的是这本指南,它似乎并没有把我带到任何地方: 我应该把.java文件放在哪里?React native React Native-Headless JS示例,react-native,React Native,关于这一点的react本地文档似乎并不完整。我遵循的是这本指南,它似乎并没有把我带到任何地方: 我应该把.java文件放在哪里? 我应该如何启动任务?将.java文件放入您的项目中。例如/app/src/main/java/com/alex/app/service/ 当您想要执行特定的JavaScript代码而不显示ReactRootView时,您可以使用自定义HeadlessJsTaskService 要启动任务,只需调用startService(newintent(this,MyTaskS
我应该如何启动任务?将.java文件放入您的项目中。例如
/app/src/main/java/com/alex/app/service/
当您想要执行特定的JavaScript代码而不显示ReactRootView
时,您可以使用自定义HeadlessJsTaskService
要启动任务,只需调用startService(newintent(this,MyTaskService.class))代码>例如,来自其他服务,甚至来自某个活动
提示:
我更改了教程的getTaskConfig()
方法,因此它允许空的附加:
@Override
@Nullable
protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
Bundle extras = intent.getExtras();
WritableMap data = extras != null ? Arguments.fromBundle(extras) : null;
return new HeadlessJsTaskConfig(
"SomeTaskName",
data,
5000);
}
或者至少更改它,这样它就不会在没有提供额外功能的情况下自动失败。我遇到了与您相同的问题。我是本地安卓开发者的新手,我遵循了文档,但它们对我不起作用。事实证明,我误解了这一点,认为我可以从我的react本机代码开始实际的任务。不过,它不是那样工作的。您编写了要在任务启动时运行的JavaScript代码,但需要从本机代码启动该任务。因此,您已经完成的步骤是设置任务,但没有任何东西告诉他们开始 我将以我的项目为例: 在我的JavaScript中:
/*
This code basically registers WHAT javascript code
I want to call when the 'disconnect' service is started
*/
const disconnectTask = () => async () => {
if (connectionIsActive) {
user.goOffline();
}
};
AppRegistry.registerHeadlessTask('disconnect', disconnectTask);
然后我在这里创建了java文件:
projectroot/android/app/src/main/java/com/mycompany/app/ForceOfflineService.java
package com.mycompany.app;
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;
import com.facebook.react.bridge.WritableMap;
import javax.annotation.Nullable;
public class ForceOfflineService extends HeadlessJsTaskService {
@Override
@Nullable
protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
Bundle extras = intent.getExtras();
// WritableMap data = extras != null ? Arguments.fromBundle(extras) : null;
// ---- EDIT ---- the line above no longer works, since null is not an accepted value anymore.
WritableMap data = extras != null ? Arguments.fromBundle(extras) : Arguments.createMap();
// Make sure that the string below ("disconnect" in this case)
// matches the string used to register the task in your JS
return new HeadlessJsTaskConfig(
"disconnect",
data,
5000);
}
}
然后在你的android清单中
(我的在这里:projectroot/android/app/src/main/AndroidManifest.xml)
必须在应用程序标记内注册服务
<manifest>
<application>
<!-- other existing configuration -->
<service android:name=".ForceOfflineService" />
</application>
</manifest>
就这样 我现在也在解决这个问题。你有什么进展吗?我想你可以用这个号码开始这个任务。我为Android实现了一个带有后台服务的本机模块。这相当直截了当。我会在某个时候再试一次,并在这里发布我的发现。想分享一下你做的这个安卓服务吗?因为我做了类似的事情:D@Alex您是否成功地以无头方式集成react native?我的回答帮你设置了吗?你能补充更多细节吗?现在还不清楚如何为初学者实际使用headless js
override fun onStop() {
super.onStop()
Handler(Looper.getMainLooper()).postDelayed(Runnable {
val service = Intent(applicationContext, ForceOfflineService::class.java)
applicationContext.startService(service)
}, IDLE_TIME_BEFORE_DISCONNECT)
}