2016-12-13 3 views
0

React-Nativeでバックグラウンドサービスを実行しようとしています。私が聞いたことから、ネイティブのJavaで記述し、それを反応ネイティブコードに接続する必要があります。モジュールを作ってもエラーは発生しませんが、何もしません。私は簡単なトーストを表示するために私のコードを変更しようとしたし、それもしませんでした。ReactネイティブAndroidモジュールが動作しません

サービス:

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"; 
} 
} 

パッケージ:MainApplicationで

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(); 
} 
} 

@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()メソッドが確実と呼ばれているように表示されています。

答えて

2
startTracking() { 
    console.warn("Trying to start serivce"); 
    ServiceModule.startTrackingService(); 
} 
関連する問題