一、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

然后就启动大功告成啦

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐