加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

#React Native#104混合开发基础篇<2>Android

(2017-11-07 17:27:39)
分类: 计算机相关
2安卓平台混合开发
2.1安卓端与原生代码的交互与IOS类似,先创建一个类,GetBaseInfoModule .java类,然后继承ReactContextBaseJavaModule类,实现RN希望调用的方法。
public class GetBaseInfoModule extends ReactContextBaseJavaModule { 
 private int version = 0; 
 public GetBaseInfoModule(ReactApplicationContext reactContext) { 
 super(reactContext); 
 
 @Override 
public String getName() { return "GetBaseInfo"; } 
 @ReactMethod 
public void getApkVersion(Promise promise) { 
 PackageManager packageManager = reactContext.getPackageManager(); 
 try { 
 PackageInfo packageInfo = packageManager.getPackageInfo(reactContext.getPackageName(), 0); 
 int versionCode = packageInfo.versionCode; 
 String versionName = packageInfo.versionName; 
 WritableMap writableMap = new WritableNativeMap(); writableMap.putInt("apkVersionCode", versionCode); writableMap.putString("apkVersionName", versionName); 
 promise.resolve(writableMap); 
 } catch (PackageManager.NameNotFoundException e) {
 e.printStackTrace(); 
 promise.reject(e.getMessage());
 }
 }
}
继承ReactContextBaseJavaModule  的类都要事先getName方法,返回原生代码模块名字,RN代码根据这个名字来调用该类返回的方法。@ReactMethod.而且该方法一般没有返回值,异步操作,所以只能用回调或者发送消息来实现信息互传。
最后一步是创建注册开发者编写的原生代码模块,实现一个React包管理类,继承自ReactPackage,并且要实现对应的createNativeModules方法。
public class GetBaseInfoPackage implements ReactPackage {
    @Override
    public List createNativeModules(ReactApplicationContext reactContext) {
        List modules = new ArrayList<>();
        modules.add(new GetBaseInfoModule(reactContext));
        return modules;
    }
    
    public List> createJSModules() {
        return Collections.emptyList();
    }

    @Override
    public List createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}
另外,该Package 需要在 MainApplication.java 中getPacakges()方法中被创建。
@Override 
 protected List getPackages() { 
return Arrays.asList( 
 new MainReactPackage(), 
 new GetBaseInfoPackage(), 
); }
在RN中调用,则是
var {NativeModules} = require('react-native'); 
const  GetBaseInfoModule = NativeModules.GetBaseInfoModule ;
GetBaseInfoModule .getApkVersion(promise);

2.2 与Android原生界面交互。
首先建立一个Empty Activity,引入布局文件,在AndroidManifest.xml 中引入对应权限控制,并且在MainActivity中增加onActivityResult方法,处理返回结果,引用上面的类,直接返回结果。
使用的方法与上面的类似,所有原生类的调用就跟直接写Java类一样。
2.3 Promise
原生端
@ReactMethod
public void aMethod(String pram,Promise promise){
try {
//处理业务逻辑
promise.resolve(msg);
} catch(Exception e){
//处理错误
promise.reject(msg);
}
}
在RN端
someManager.aMethod(param)
.then((msg) =>{
//成功处理函数})
.catch((err) =>{
//失败处理函数} 
);
2.4 生命周期监听
可以在基于ReactContextBaseJavaModule 中实现ActivityEventListener 的方法。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有