2017-03-28 3 views
0

Ich benutze reagieren native für meine Android-App. Ich habe einen Hintergrund-Service, der auf Ereignisse in der Zwischenablage wartet. Wenn etwas, an dem die App interessiert ist, in der Zwischenablage gespeichert ist, sendet die App eine Push-Benachrichtigung an den Benutzer. Wenn die App im Hintergrund läuft, kann ich ein Ereignis ausgeben und es funktioniert perfekt. Wenn die App geschlossen und durch Antippen der Benachrichtigung gestartet wird, wird nichts ausgegeben. Reaktionskontext ist ebenfalls leer. Wie kann ich dieses Ereignis beim Start der Benachrichtigung ausgeben?Wie kann ich Ereignis beim App-Start von Benachrichtigung ausstoßen?

import android.app.Application; 
import android.content.Intent; 
import android.view.View; 
import android.util.Log; 
import android.os.Bundle; 
import android.app.NotificationManager; 
import android.support.v4.content.LocalBroadcastManager; 
import com.facebook.react.modules.core.DeviceEventManagerModule; 

import com.facebook.react.bridge.ReactContext; 
import com.facebook.react.ReactActivity; 
import com.facebook.react.common.LifecycleState; 
import com.facebook.react.ReactInstanceManager; 
import com.facebook.react.shell.MainReactPackage; 

public class MainActivity extends ReactActivity { 

    /** 
    * Returns the name of the main component registered from JavaScript. 
    * This is used to schedule rendering of the component. 
    */ 
    @Override 
    protected String getMainComponentName() { 
     return "PurchaseButton"; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     onNewIntent(getIntent()); 
    } 

    @Override 
    public void onNewIntent(Intent intent) { 
     setIntent(intent); 
     Bundle bundle = intent.getExtras(); 

     if (bundle != null) { 
      String result = bundle.getString("response"); 
      int nid = bundle.getInt("nid"); 
      NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
      mNotifyMgr.cancel(nid); 

      ReactContext ctx = getReactInstanceManager().getCurrentReactContext(); 
      if (ctx != null) { 
       ctx.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("my.custom.event", result); 
       Log.d("PB", "sent broadcast.."); 
      } else { 
       Log.d("PB", "react context is null..."); 
      } 
     } 
    } 
} 
+0

Ich glaube, dass Ihre Aktivität aufgrund Android Lifecycle noch nicht erstellt wurde. Hast du versucht es zu verschieben, bis deine Aktivität onResume ausführt? – Oximer

+0

@Oximer Ich habe diesen Teil tatsächlich mit einem Handler nach onResume verschoben und ihn um eine Sekunde verschoben. So habe ich den Reaktionskontext tatsächlich gefunden. Um jedoch darauf reagieren zu können, musste ich es für fünf Sekunden einstellen. – Mengu

+0

Jetzt funktioniert es? Ich sehe keinen einfachen Weg, es zu lösen. Eine Option besteht darin, Ihre eigene Aktivität zu verwenden und selbst eine reaktive native Instanz zu erstellen. Dafür müssen Sie ReactInstanceManager und ReactInstanceEventListener.onReactContextInitialized – Oximer

Antwort

0

falls sich jemand darüber wundert. Hier ist die Frage beantwortet für reactive native 0.42.0.

android hat activity lifecycles und React Context ist nicht verfügbar/instanziiert on onCreate und onStart Life Cycle-Methoden, aber onResume. Wir brauchen React Context, weil wir so ein Event an unser reaktives natives Frontend senden können. daher die Möglichkeit, Ereignisse erfolgreich zu emittieren, müssen Sie eine Handler-Aufgabe erstellen, sie um 5 Sekunden verzögern und wenn sie ausgeführt wird, können Sie das Ereignis ausgeben. es ist erwähnenswert, dass in meinem Fall, wenn Sie sogar 1 Sekunde verzögern, Sie den Kontext bekommen, aber das Frontend ist nicht bereit, auf Ereignisse zu hören. Hier ist ein Beispielcode:

package com.purchasebutton; 

import android.app.Application; 
import android.content.Intent; 
import android.view.View; 
import android.util.Log; 
import android.os.Bundle; 
import android.os.Handler; 
import android.app.NotificationManager; 
import android.support.v4.content.LocalBroadcastManager; 
import com.facebook.react.modules.core.DeviceEventManagerModule; 

import com.facebook.react.bridge.ReactContext; 
import com.facebook.react.ReactActivity; 
import com.facebook.react.common.LifecycleState; 
import com.facebook.react.ReactInstanceManager; 
import com.facebook.react.shell.MainReactPackage; 

public class MainActivity extends ReactActivity { 

    /** 
    * Returns the name of the main component registered from JavaScript. 
    * This is used to schedule rendering of the component. 
    */ 
    @Override 
    protected String getMainComponentName() { 
     return "PurchaseButton"; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     onNewIntent(getIntent()); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        ReactContext ctx = getReactInstanceManager().getCurrentReactContext(); 
        if (ctx != null) { 
         Intent intent = getIntent(); 
         Bundle bundle = intent.getExtras(); 
         if (bundle != null) { 
          String result = bundle.getString("response"); 
          int nid = bundle.getInt("nid"); 
          NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
          notificationManager.cancel(nid); 
          ctx.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("product.changed", result); 
         } 
        } 
       } 
      }, 5000); 
    } 

    @Override 
    public void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     setIntent(intent); 
    } 
} 
Verwandte Themen