因為老闆叫我要幫專案上Auth0,所以就在研究如何插入原生的java模組
新版React Native的MainActivity會繼承ReactActivity
onCreate的方法就會被他包起來而無法使用
所以要透過他內建的getPackages來新增模組
public class MainActivity extends ReactActivity {
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new LockReactPackage()
);
}
}
剛剛在getPackages插入的物件是ReactPackage的實作
這三個方法都是必須實作的對象
但我們不需要提供JS模組和View
所以直接傳空的回去給他
createNativeModules則是用來插入真正存放模組內容的物件
public class LockReactPackage implements ReactPackage {
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new LockReactModule(reactContext));
return modules;
}
@Override
public List<Class<? extends JavaScriptModule>> createJSModules() {
return new ArrayList<>();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return new ArrayList<>();
}
}
因為物件在getPackages的時候會new一次
所以constructor就相當於原來Android的onCreate
onCreate的時候程式還沒載入完成,所以不能getApplicationContext,要等到React開起來之後從JavaScript來叫
如果方法要給JavaScript叫的話,上面要加@ReactMethod才行
public class LockReactModule extends ReactContextBaseJavaModule {
private final LocalBroadcastManager broadcastManager;
public LockReactModule(ReactApplicationContext reactApplicationContext) {
super(reactApplicationContext);
this.broadcastManager = LocalBroadcastManager.getInstance(reactApplicationContext.getApplicationContext());
this.broadcastManager.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
UserProfile profile = intent.getParcelableExtra(Lock.AUTHENTICATION_ACTION_PROFILE_PARAMETER);
Token token = intent.getParcelableExtra(Lock.AUTHENTICATION_ACTION_TOKEN_PARAMETER);
//Your code to handle login information.
}
}, new IntentFilter(Lock.AUTHENTICATION_ACTION));
}
@ReactMethod
public void intercept() {
Lock.Builder lockBuilder = new Lock.Builder()
.loadFromApplication(getCurrentActivity().getApplication())
.closable(true);
LockContext.configureLock(lockBuilder);
Intent lockIntent = new Intent(getReactApplicationContext().getApplicationContext(), LockActivity.class);
lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getReactApplicationContext().getApplicationContext().startActivity(lockIntent);
}
@Override
public String getName() {
return "Auth0LockModule";
}
}
接著來到JavaScript的方面
從react-native那邊就可以直接引入模組
但模組的名字要看剛剛LockReactModule那邊寫的getName回傳了什麼
var { NativeModules } = require('react-native');
module.exports = NativeModules.Auth0LockModule;
只要執行上面那兩行把模組輸出之後就可以呼叫LockReactModule裡面寫的@ReactMethod了
var LockModule = require('./auth0lock');
LockModule.intercept();
你好,我目前在集成一个android的第三方im的功能到我的react native android应用;
我遇到的问题是在收到im信息后,无法通过该第三方模块的localbroadcastReceiver,onReceive 的上下文呼叫react 的 DeviceEventManagerModule 向js端发送信息;
你能帮助我吗,感谢
@lizhi
參考這個的做法看看
https://github.com/yamill/react-native-orientation/blob/master/android/src/main/java/com/github/yamill/orientation/OrientationModule.java#L38