要啓動Android活動,您需要創建自定義本機模塊。假設一個叫ActivityStarter
;
import { ..., NativeModules, ... } from 'react-native';
export default class DemoComponent extends Component {
render() {
return (
<View>
<Button
onPress={() => NativeModules.ActivityStarter.navigateToExample()}
title='Start example activity'
/>
</View>
);
}
}
ActivityStarter
就是實現所謂NativeModule
一個陣營機Java接口的Java類:它可能在JavaScript如下使用。該接口的繁重已被BaseJavaModule
完成的,所以人們通常將擴充一個或:
class ActivityStarterModule extends ReactContextBaseJavaModule {
ActivityStarterModule(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "ActivityStarter";
}
@ReactMethod
void navigateToExample() {
ReactApplicationContext context = getReactApplicationContext();
Intent intent = new Intent(context, ExampleActivity.class);
context.startActivity(intent);
}
}
這個類的名稱並不重要;暴露給JavaScript的ActivityStarter
模塊名稱來自getName()
方法。
由react-native init
生成的默認應用程序包含初始化React Native的MainApplication
類。除此之外它延伸ReactNativeHost
覆蓋其getPackages
方法:
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage()
);
}
如果您要添加本地做出反應到現有的應用程序,this page有你重寫你的Activity
的onCreate
如下:
@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, "HelloWorld", null);
setContentView(mReactRootView);
}
注意addPackage(new MainReactPackage())
。無論您使用哪種方法,您都需要添加一個公開自定義模塊的自定義軟件包。這可能是這樣的:
class ActivityStarterReactPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new ActivityStarterModule(reactContext));
return modules;
}
// UPDATE: This method was deprecated in 0.47
// @Override
// public List<Class<? extends JavaScriptModule>> createJSModules() {
// return Collections.emptyList();
// }
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
最後,更新MainApplication
,包括我們新的包:
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new ActivityStarterReactPackage(), // This is it!
new MainReactPackage()
);
}
或者你可以做addPackage(new ActivityStartecReactPackage())
到ReactInstanceManager.builder()
。
您可以找到一個完整的self-contained example here。
UPDATE
createJSModules
從ReactPackage
接口在0.47版本中刪除,並已被註釋掉樣品。出於某種原因,如果您遇到較舊版本的RN,您仍然需要它。