2016-03-15 30 views

回答

1

您的原生Android活动

<activity> 
    <intent-filter> 
     <data android:scheme="my.special.scheme" /> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT"></category> 
    </intent-filter> 
</activity> 

使用Linking openURL API创建的意图过滤器。

Linking.openURL('my.special.scheme://other/parameters/here') 

Link to sample application working

+0

得到错误: console.error: “出错”,{ “framesToPop”:1, “代码”: “EUNSPECIFIED”},栈: 错误@ 56404:12 @ 15859:94 – Shivang

+0

线以下是丢失: Shivang

2

您可以创建一个模块,并暴露ReactMethod到JS将打开活动为您服务。

public class RctActivityModule extends ReactContextBaseJavaModule { 
    public static final String REACT_CLASS = "RctActivity"; 

    public RctActivityModule(ReactApplicationContext reactContext) { 
     super(reactContext); 
    } 

    @Override 
    public String getName() { 
     return REACT_CLASS; 
    } 

    @ReactMethod @SuppressWarnings("unused") 
    public void startActivity(String extraParam) { 
     Activity context = ContextProvider.getActivityContext(); 
     if (context != null && !context.isFinishing()) { 
      Intent rctActivityIntent = new Intent(context, RctActivity.class); 
      rctActivityIntent.putExtra(RctActivity.EXTRA_PARAM, extraParam); 
      context.startActivity(rctActivityIntent); 
     } 
    } 
} 

不要忘了你的新模块添加到您的包

public class RCCPackage implements ReactPackage { 

    @Override 
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { 
     return Arrays.<NativeModule>asList(
       new RctActivityModule(reactContext) 
     ); 
    } 

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

    @Override 
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { 
    ... 
    } 
} 

创建代表你的模块(RctActivity.js)JS文件。现在将其放置在react-native项目的根目录中。

RctActivity.js:

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

在你的JavaScript代码(index.js),导入RctActivity模块:

import RctActivity from './RctActivity'

,并使用你露出这样的方法: RctActivity.startActivity('MyExtraParam');

编辑: 为了打开一个新的活动,我必须保持对当前正在运行的活动的引用。所以我用这个小帮手类:

public class ContextProvider { 
    private static WeakReference<Activity> sActivityWR; 

    public static void setActivityContext(Activity activity) { 
     if (sActivityWR == null) { 
      sActivityWR = new WeakReference<>(activity); 
     } 
    } 

    public static Activity getActivityContext() { 
     return sActivityWR != null ? sActivityWR.get() : null; 
    } 

    public static void clearActivityContext() { 
     if (sActivityWR != null) { 
      sActivityWR.clear(); 
     } 
     sActivityWR = null; 
    } 
} 

要使用它,其连接到你的基地活动onResume和方法:

public class RctActivity extends com.facebook.react.ReactActivity { 
    @Override 
    protected void onResume() { 
     Log.v(getTag(), "onResume"); 
     ContextProvider.setActivityContext(this); 
     super.onResume(); 
    } 

    @Override 
    protected void onPause() { 
     Log.v(getTag(), "onPause"); 
     ContextProvider.clearActivityContext(); 
     super.onPause(); 
    } 
} 

不要忘了,现在你的MainActivity需要延长RctActivity

+0

无法解析类“RctActivityModule”中的“ContextProvider”。 – Shivang

+0

上下文提供者是我写的一个小帮助类。我将它添加到答案 –

+0

我正在导入js文件: import'./home/ttnd/ReactTestProject/android/app/src/main/java/com/reacttestproject/RctActivity'..... and facing错误......... 要求未知模块“./home/ttnd/ReactTestProject/android/app/src/main/java/com/reacttestproject/RctActivity”。如果您确定该模块在那里,请尝试重新启动打包程序 – Shivang