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
相关产品推荐
相关产品推荐

