2015-11-28 2 views
3

Итак, у меня есть этот текст на стороне java, который поступает с Intent, который я хотел бы сохранить до AsyncStorage, чтобы иметь возможность получить к нему доступ через React afterwards.React Native: напишите в AsyncStorage с java

Любой шанс, которого я могу достичь?

у меня есть:

package com.myapp; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.content.Intent; 


import com.facebook.react.LifecycleState; 
import com.facebook.react.ReactInstanceManager; 
import com.facebook.react.ReactRootView; 
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler; 
import com.facebook.react.shell.MainReactPackage; 
import com.facebook.soloader.SoLoader; 

public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler { 

    private ReactInstanceManager mReactInstanceManager; 
    private ReactRootView mReactRootView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mReactRootView = new ReactRootView(this); 

     mReactInstanceManager = ReactInstanceManager.builder() 
       .setApplication(getApplication()) 
       .setBundleAssetName("index.android.bundle") 
       .setJSMainModuleName("index.android") 
       .addPackage(new MainReactPackage()) 
       .setUseDeveloperSupport(BuildConfig.DEBUG) 
       .setInitialLifecycleState(LifecycleState.RESUMED) 
       .build(); 

     mReactRootView.startReactApplication(mReactInstanceManager, "BrowseItLater", null); 

     setContentView(mReactRootView); 

     // This code is from http://developer.android.com/training/sharing/receive.html 
     Intent intent = getIntent(); 
     String action = intent.getAction(); 
     String type = intent.getType(); 
     if (Intent.ACTION_SEND.equals(action) && type != null) { 
      handleSendText(intent); 
     }   
    } 

    void handleSendText(Intent intent) { 
     String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); 
     if (sharedText != null) { 
      // How can I handle this ???? 
     } 
    } 
// ... 
} 

Или есть другое решение, чтобы сделать MainActivity.java общаться с JS?

ответ

4

После некоторого боя Я наконец нашел решение. Он не использует AsyncStorage, поскольку я прочитал в исходном коде AsyncStorage, фактически, может быть расположен по-разному (SQLite или что-то еще) в зависимости от телефона. Было бы грязно дублировать эту логику.

Вместо этого я создал модуль, например the doc suggests, и передал inputText в качестве аргумента для вызова .addPackage(new EphemeralStoragePackage(inputText)) в MainActivity.java.

Модуль предоставляет метод readOnceAsync в мире JS, который я могу позже позвонить с:

NativeModules.EphemeralStorage.readOnceAsync((text :string) => { 
    if (text.length) { 
    this._addValue(text); // this method is in charge of storing in AsyncStorage 
    } 
}) 

Вот деталь:

// android/app/src/main/java/com/appname/modules/ephemeralstorage/EphemeralStorageModule.java 

package com.browseitlater.modules.ephemeralstorage; 

import com.facebook.react.bridge.NativeModule; 
import com.facebook.react.bridge.ReactApplicationContext; 
import com.facebook.react.bridge.ReactContext; 
import com.facebook.react.bridge.ReactContextBaseJavaModule; 
import com.facebook.react.bridge.ReactMethod; 
import com.facebook.react.bridge.Callback; 

import java.util.Map; 

public class EphemeralStorageModule extends ReactContextBaseJavaModule { 
    private String inputText; 

    public EphemeralStorageModule(ReactApplicationContext reactContext, String _inputText) { 
    super(reactContext); 
    this.inputText = _inputText; 
    } 

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

    public String getInputText() { 
    return inputText; 
    } 

    @ReactMethod 
    public void readOnceAsync(Callback successCallback) { 
    successCallback.invoke(getInputText()); 
    this.inputText = null; 
    } 

} 

И

// android/app/src/main/java/com/appname/modules/ephemeralstorage/EphemeralStoragePackage.java 
package com.browseitlater.modules.ephemeralstorage; 

import android.app.Activity; 

import java.util.*; 

import com.facebook.react.ReactPackage; 
import com.facebook.react.bridge.JavaScriptModule; 
import com.facebook.react.bridge.NativeModule; 
import com.facebook.react.bridge.ReactApplicationContext; 
import com.facebook.react.uimanager.ViewManager; 


public class EphemeralStoragePackage implements ReactPackage { 
    private String inputText; 

    public EphemeralStoragePackage(String _inputText) { 
    super(); 
    this.inputText = _inputText; 
    } 

    @Override 
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { 
    List<NativeModule> modules = new ArrayList<>(); 
    modules.add(new EphemeralStorageModule(reactContext, getInputText())); 
    return modules; 
    } 

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

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

    public String getInputText() { 
    return inputText; 
    } 

} 

Наконец, в MainActivity.java, мой onCreate метод выглядит следующим образом:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mReactRootView = new ReactRootView(this); 

    Intent intent = getIntent(); 
    String action = intent.getAction(); 
    String type = intent.getType(); 
    String inputText = intent.getStringExtra(Intent.EXTRA_TEXT); 

    mReactInstanceManager = ReactInstanceManager.builder() 
     .setApplication(getApplication()) 
     .setBundleAssetName("index.android.bundle") 
     .setJSMainModuleName("index.android") 
     .addPackage(new MainReactPackage()) 
     .addPackage(new EphemeralStoragePackage(inputText)) 
     .setUseDeveloperSupport(BuildConfig.DEBUG) 
     .setInitialLifecycleState(LifecycleState.RESUMED) 
     .build(); 

    mReactRootView.startReactApplication(mReactInstanceManager, "BrowseItLater", null); 

    setContentView(mReactRootView); 

    } 
0

Если вы не хотите, чтобы написать собственный модуль, вы можете сделать это в MainActivity.java

Объявите глобальную переменную внутри класса MainActivity (не забудьте импорт com.facebook.react.modules.storage.ReactDatabaseSupplier):

private ReactDatabaseSupplier mReactDatabaseSupplier; 

Внутри onCreate метод инициализации глобальной переменной:

mReactDatabaseSupplier = ReactDatabaseSupplier.getInstance(getApplicationContext()); 

Объявите частный метод, чтобы сохранить пару ключ/значение внутри AsyncStorage

private void saveKeyValuePair(String key, String value) { 
    String sql = "INSERT OR REPLACE INTO catalystLocalStorage VALUES (?, ?);"; 
    SQLiteStatement statement = mReactDatabaseSupplier.get().compileStatement(sql); 
    try { 
     mReactDatabaseSupplier.get().beginTransaction(); 
     statement.clearBindings(); 
     statement.bindString(1, key); 
     statement.bindString(2, value); 
     statement.execute(); 
     mReactDatabaseSupplier.get().setTransactionSuccessful(); 
    } catch (Exception e) { 
     Log.w("YOUR_TAG", e.getMessage(), e); 
    } finally { 
     try { 
      mReactDatabaseSupplier.get().endTransaction(); 
     } catch (Exception e) { 
      Log.w("YOUR_TAG", e.getMessage(), e); 
     } 
    } 
} 

Затем вы можете сохранить пары ключ/значение, как это (внутри onCreate, например):

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mReactDatabaseSupplier = ReactDatabaseSupplier.getInstance(getApplicationContext()); 
    saveKeyValuePair("myAsyncStorageKey", "myValueInAsyncStorageKey"); 

}

Это простой способ сэкономить в AsyncStorage приложения, основанного на действии React. Подумайте о написании собственного модуля.