You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native报错:期望AppCompatActivity,实际接收MyActivity

解决React Native启动MyActivity时的类型不匹配报错

问题场景

需要在收到静默通知时唤起React Native页面,当前通过PhoneStateListener广播接收器触发MyActivity加载RN代码测试,但启动MyActivity时抛出异常:

java.lang.IllegalStateException: Current Activity is of incorrect class, expected AppCompatActivity, received MyActivity

相关代码

1. PhoneStateListener广播接收器

package com.apartmentapp;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class PhoneStateListener extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            final Context ctx;
            ctx = context;

            final Intent intnt = new Intent(context, MyActivity.class);

            intnt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intnt.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

            intnt.putExtra("phone_no", "9876543210");
            intnt.putExtra("contact_name", "Test User");

            intnt.putExtra("id", "1234");

            ctx.startActivity(intnt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2. MyActivity类

package com.apartmentapp;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;

import com.facebook.hermes.reactexecutor.HermesExecutorFactory;
import com.facebook.react.BuildConfig;
import com.facebook.react.PackageList;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactPackage;
import com.facebook.react.ReactRootView;
import com.facebook.react.common.LifecycleState;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.soloader.SoLoader;

import java.util.List;

public class MyActivity extends Activity implements DefaultHardwareBackBtnHandler {
    private Window wind;
    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.setFinishOnTouchOutside(true);
        super.onCreate(savedInstanceState);
        SoLoader.init(this, false);

        mReactRootView = new ReactRootView(this);
        List<ReactPackage> packages = new PackageList(getApplication()).getPackages();

        mReactInstanceManager = ReactInstanceManager.builder()
                .setApplication(getApplication())
                .setCurrentActivity(this)
                .setBundleAssetName("index.android.bundle")
                .setJSMainModulePath("index")
                .addPackages(packages)
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .setJavaScriptExecutorFactory(new HermesExecutorFactory())
                .build();

        mReactRootView.startReactApplication(mReactInstanceManager, "AlertPopupFragment", null);

        setContentView(mReactRootView);
        setContentView(R.layout.dialog);

        FrameLayout alertPopUpFragment = findViewById(R.id.alertPopUpFragment);

        alertPopUpFragment.addView(mReactRootView);
    }

    private Bundle getLaunchOptions(String message) {
        Bundle initialProperties = new Bundle();
        initialProperties.putString("message", message);
        return initialProperties;
    }

    @Override
    protected void onResume() {
        super.onResume();

        wind = this.getWindow();
        wind.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
        wind.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
        wind.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
        wind.addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        wind.addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
    }

    @Override
    public void invokeDefaultOnBackPressed() {

    }
}

3. AndroidManifest中MyActivity配置

<activity
            android:name=".MyActivity"
            android:noHistory="true"
            android:taskAffinity=".MyActivity"
            android:theme="@style/MyActivity"
            android:exported="true"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

解决方案

核心修复

报错原因是React Native的部分依赖包要求宿主Activity继承自AppCompatActivity,但当前MyActivity继承的是原生Activity,直接修改继承关系即可:

将MyActivity的继承类从Activity改为AppCompatActivity,修改后的类定义如下:

public class MyActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {
    // 其余代码保持不变
}

额外优化建议

  • 移除onCreate中重复的setContentView(mReactRootView);,后续的setContentView(R.layout.dialog);会覆盖它,保留后者即可,确保RN的RootView正确添加到布局容器中
  • Android 10及以上版本中,TYPE_SYSTEM_ALERT和TYPE_SYSTEM_OVERLAY已被废弃,建议替换为TYPE_APPLICATION_OVERLAY,避免兼容性问题

内容的提问来源于stack exchange,提问作者Saurabh D Vyas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 07:05:00