簡體   English   中英

React Native Android模塊不起作用

[英]React Native Android Module doesn't work

我正在嘗試在React-Native中運行后台服務。 據我所知,我需要用本機Java編寫它,並將其連接到react-native代碼。 我做了一個模塊,它沒有拋出任何錯誤,但是它什么也沒做。 我試圖更改代碼以顯示簡單的吐司,但它甚至沒有這樣做。 這是代碼:

服務:

public class TestService extends Service {

double distance = 0.0;

@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    Toast.makeText(getApplicationContext(), "Service started...", Toast.LENGTH_SHORT).show();
    final ReactContext reactContext = new ReactContext(getApplicationContext());
    new Timer().scheduleAtFixedRate(new TimerTask(){
        @Override
        public void run(){
            WritableMap params = Arguments.createMap();
            distance+= 0.7;
            params.putDouble("distance", distance);
            sendEvent(reactContext, "updateDistance", params);
        }
    },0,1000);
    return START_STICKY;
}

private void sendEvent(ReactContext reactContext, String eventName, @Nullable WritableMap params) {
    reactContext.getJSModule(DeviceEventManagerModule
            .RCTDeviceEventEmitter.class)
            .emit(eventName, params);
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}
}

模塊:

public class ServiceModule extends ReactContextBaseJavaModule {
ReactContext reactContext;

public ServiceModule(ReactApplicationContext reactContext) {
    super(reactContext);
    this.reactContext = reactContext;
}

@ReactMethod
public void startTrackingService() {
    Intent intent = new Intent(reactContext, TestService.class);
    reactContext.startService(intent);
    Toast.makeText(getReactApplicationContext(), "Starting service...", Toast.LENGTH_SHORT).show();
}

@Override
public String getName() {
    return "ServiceModule";
}
}

包:

public class ServicePackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
    List<NativeModule> modules = new ArrayList<>();
    modules.add(new ServiceModule(reactContext));
    return modules;
}

@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
    return Collections.emptyList();
}

@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
    return Collections.emptyList();
}
}

在MainApplication中:

@Override
protected List<ReactPackage> getPackages() {
  return Arrays.<ReactPackage>asList(
      new MainReactPackage(),
      new ReactNativePushNotificationPackage(),
      new ServicePackage()
  );
}

然后在本機代碼中-ServiceModule.js:

import { NativeModules } from 'react-native';
module.exports = NativeModules.ServiceModule;

在Tracking.js中:

import ServiceModule from '../component/ServiceModule';
....
startTracking() {
    console.warn("Trying to start serivce");
    ServiceModule.startTrackingService;
}

componentWillMount() {
    DeviceEventEmitter.addListener('updateDistance', function(e: Event) {
        console.warn("got event");
        this.updateDistance(e.distance);
    });
}

updateDistance(newDistance) {
    this.setState({distance: newDistance});
}

console.warn("Trying to start service"); 正在顯示,因此肯定會調用startTracking()方法;

startTracking() {
    console.warn("Trying to start serivce");
    ServiceModule.startTrackingService();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM