React Native 冷启动 / 热启动
一、JS 层(React Native)
// App.tsx
import React, { useEffect, useRef, useState } from 'react';
import { AppState, AppStateStatus, Text, View, NativeModules } from 'react-native';
const { LaunchManager } = NativeModules; // 原生模块
export default function App() {
const [launchType, setLaunchType] = useState<string>('未知');
const appState = useRef<AppStateStatus>(AppState.currentState);
useEffect(() => {
// 调用原生埋点,获取是否冷启动
LaunchManager.getLaunchType().then((type: string) => {
setLaunchType(type); // "冷启动" / "热启动"
});
// 监听 AppState,区分前后台切换
const subscription = AppState.addEventListener('change', (nextAppState) => {
if (
appState.current.match(/inactive|background/) &&
nextAppState === 'active'
) {
setLaunchType('热启动');
}
appState.current = nextAppState;
});
return () => {
subscription.remove();
};
}, []);
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text style={{ fontSize: 20 }}>启动类型: {launchType}</Text>
</View>
);
}
二、Android 原生 (Kotlin)
package com.yourapp
import com.facebook.react.bridge.*
class LaunchManagerModule(reactContext: ReactApplicationContext) :
ReactContextBaseJavaModule(reactContext) {
companion object {
private var isColdStart = true
}
override fun getName(): String {
return "LaunchManager"
}
@ReactMethod
fun getLaunchType(promise: Promise) {
if (isColdStart) {
isColdStart = false
promise.resolve("冷启动")
} else {
promise.resolve("热启动")
}
}
}
再写一个LaunchManagerPackage.kt
package com.yourapp
import com.facebook.react.ReactPackage
import com.facebook.react.bridge.NativeModule
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.uimanager.ViewManager
class LaunchManagerPackage : ReactPackage {
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
return listOf(LaunchManagerModule(reactContext))
}
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
return emptyList()
}
}
然后在 MainApplication.kt 里注册:
packages.add(LaunchManagerPackage())
ios
新建一个 LaunchManager.swift
import Foundation
@objc(LaunchManager)
class LaunchManager: NSObject {
static var isColdStart = true
@objc
func getLaunchType(_ resolve: RCTPromiseResolveBlock,
reject: RCTPromiseRejectBlock) {
if LaunchManager.isColdStart {
LaunchManager.isColdStart = false
resolve("冷启动")
} else {
resolve("热启动")
}
}
}
在 LaunchManager.m (桥接文件):
#import <React/RCTBridgeModule.h>
@interface RCT_EXTERN_MODULE(LaunchManager, NSObject)
RCT_EXTERN_METHOD(getLaunchType:(RCTPromiseResolveBlock)resolve
reject:(RCTPromiseRejectBlock)reject)
@end
然后就启动大功告成啦
更多推荐

所有评论(0)