如何将REACT原生js文件切换到Android活动
我需要在JS文件中的按钮单击事件上从反应本机活动切换到本机android活动。我已经找了很多了。请帮助我。为您的原生android活动创建一个意向过滤器如何将REACT原生js文件切换到Android活动,android,facebook,reactjs,npm,react-native,Android,Facebook,Reactjs,Npm,React Native,我需要在JS文件中的按钮单击事件上从反应本机活动切换到本机android活动。我已经找了很多了。请帮助我。为您的原生android活动创建一个意向过滤器 <activity> <intent-filter> <data android:scheme="my.special.scheme" /> <action android:name="android.intent.action.VIEW" />
<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>
为本机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>
您可以创建一个模块,并向JS公开一个
ReactMethod
,它将为您打开活动
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) {
...
}
}
在JavaScript代码(index.js)中,导入RctActivity
模块:
从“/RctActivity”导入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;
}
}
不要忘记,现在您的main活动
需要扩展RctActivity
您可以创建一个模块并向JS公开一个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) {
...
}
}
在JavaScript代码(index.js)中,导入RctActivity
模块:
从“/RctActivity”导入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;
}
}
不要忘记,现在您的main活动
需要扩展RctActivity
获取错误:console.error:“发生错误”,{“framestoop”:1,“code:“EUNSPECIFIED”},堆栈:error@56404:12@15859:94缺少下面的行:获取错误:console.error:“发生错误”,{“framestoop”:1,“代码”:“EUNSPECIFIED”},堆栈:error@56404:12@15859:94缺少下面的行:无法解析类“RctActivityModule”中的“ContextProvider”。上下文提供程序是我编写的一个小帮助程序类。我将把它添加到我在js文件中导入的答案中:import'./home/ttnd/ReactTestProject/android/app/src/main/java/com/ReactTestProject/RctActivity'............并且面临错误。。。。。。。。。需要未知模块“/home/ttnd/ReactTestProject/android/app/src/main/java/com/ReactTestProject/RctActivity”。如果您确定模块在那里,请尝试重新启动包。创建本机模块的JavaScript表示是常见的做法。创建一个js文件并将其命名为RctActivity
<代码>从“react native”导入{NativeModules}代码>module.exports=NativeModules.RctActivity代码>我重新启动了应用程序,但再次遇到错误,要求未知模块无法解析类“RctActivityModule”中的“ContextProvider”。上下文提供程序是我编写的一个小助手类。我将把它添加到我在js文件中导入的答案中:import'./home/ttnd/ReactTestProject/android/app/src/main/java/com/ReactTestProject/RctActivity'............并且面临错误。。。。。。。。。需要未知模块“/home/ttnd/ReactTestProject/android/app/src/main/java/com/ReactTestProject/RctActivity”。如果您确定模块在那里,请尝试重新启动包。创建本机模块的JavaScript表示是常见的做法。创建一个js文件并将其命名为RctActivity
<代码>从“react native”导入{NativeModules}代码>module.exports=NativeModules.RctActivity代码>我重新启动了应用程序,但再次面临错误,需要未知模块我已经尝试了很多方法来解决它,这两个答案也无法解决问题。它不应该被搁置。我已经尝试了很多来解决它,这两个答案也无法解决问题。它不应该被搁置。