// BatteryModule.javapackage com.yourapp;
import android.os.BatteryManager;import android.content.Intent;import android.content.IntentFilter;import com.facebook.react.bridge.ReactApplicationContext;import com.facebook.react.bridge.ReactContextBaseJavaModule;import com.facebook.react.bridge.ReactMethod;import com.facebook.react.bridge.Promise;
public class BatteryModule extends ReactContextBaseJavaModule { BatteryModule(ReactApplicationContext context) { super(context); }
@Override public String getName() { return "BatteryModule"; }
@ReactMethod public void getBatteryLevel(Promise promise) { try { IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = getReactApplicationContext().registerReceiver(null, ifilter); int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); promise.resolve(level); } catch (Exception e) { promise.reject("Error", e); } }}
import { NativeModules, Button, Text, View } from 'react-native';import React, { useState } from 'react';
export default function App() { const [batteryLevel, setBatteryLevel] = useState(null);
const fetchBatteryLevel = async () => { try { const level = await NativeModules.BatteryModule.getBatteryLevel(); setBatteryLevel(level); } catch (error) { console.error(error); } };
return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Battery Level: {batteryLevel !== null ? batteryLevel + '%' : 'Unknown'}</Text> <Button title="Get Battery Level" onPress={fetchBatteryLevel} /> </View> );}
// MyJSIModule.cpp#include <jsi/jsi.h>#include <react-native/jsi/jsilib.h>
using namespace facebook::jsi;
void install(Runtime &jsiRuntime) { auto addNumbers = Function::createFromHostFunction( jsiRuntime, PropNameID::forAscii(jsiRuntime, "addNumbers"), 2, [](Runtime &rt, const Value &, const Value *args, size_t) -> Value { double a = args[0].asNumber(); double b = args[1].asNumber(); return Value(a + b); } ); jsiRuntime.global().setProperty(jsiRuntime, "addNumbers", std::move(addNumbers));}
import React, { useEffect, useState } from 'react';import { Text, View, Button } from 'react-native';
export default function App() { const [result, setResult] = useState(0);
useEffect(() => { const sum = global.addNumbers(10, 20); setResult(sum); }, []);
return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Result: {result}</Text> <Button title="Calculate 10 + 20" onPress={() => setResult(global.addNumbers(10, 20))} /> </View> );}
npx react-native upgrade
android/gradle.properties
newArchEnabled=true
use_react_native!(:new_architecture => true)
Lợi ích | Mô tả |
---|---|
Cải thiện hiệu suất | Khởi động nhanh, UI mượt mà hơn |
Kích thước bundle nhỏ | Tải module theo nhu cầu, tiết kiệm bộ nhớ |
Độ nhất quán cao | Tính nhất quán giữa iOS và Android |
Dễ bảo trì | Quản lý module và code đơn giản, mở rộng dễ dàng |
// BatteryHealthModule.javapackage com.yourapp;
import android.os.BatteryManager;import android.content.Intent;import android.content.IntentFilter;import com.facebook.react.bridge.ReactApplicationContext;import com.facebook.react.bridge.ReactContextBaseJavaModule;import com.facebook.react.bridge.ReactMethod;import com.facebook.react.bridge.Promise;
public class BatteryHealthModule extends ReactContextBaseJavaModule { BatteryHealthModule(ReactApplicationContext context) { super(context); }
@Override public String getName() { return "BatteryHealthModule"; }
@ReactMethod public void getBatteryHealth(Promise promise) { try { IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); Intent batteryStatus = getReactApplicationContext().registerReceiver(null, ifilter); int health = batteryStatus.getIntExtra(BatteryManager.EXTRA_HEALTH, BatteryManager.BATTERY_HEALTH_UNKNOWN);
String status; switch (health) { case BatteryManager.BATTERY_HEALTH_GOOD: status = "Good"; break; case BatteryManager.BATTERY_HEALTH_OVERHEAT: status = "Overheat"; break; case BatteryManager.BATTERY_HEALTH_DEAD: status = "Dead"; break; case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE: status = "Over Voltage"; break; default: status = "Unknown"; } promise.resolve(status); } catch (Exception e) { promise.reject("Error", e); } }}
import { NativeModules, Button, Text, View } from 'react-native';import React, { useState } from 'react';
export default function App() { const [batteryHealth, setBatteryHealth] = useState(null);
const fetchBatteryHealth = async () => { try { const health = await NativeModules.BatteryHealthModule.getBatteryHealth(); setBatteryHealth(health); } catch (error) { console.error(error); } };
return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Battery Health: {batteryHealth !== null ? batteryHealth : 'Unknown'}</Text> <Button title="Get Battery Health" onPress={fetchBatteryHealth} /> </View> );}
metro.config.js
:module.exports = { transformer: { experimentalImportSupport: false, inlineRequires: true, },};
npm start --reset-cache