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

三星设备多窗口模式下异常崩溃问题求助

解决方案:三星旧机型多窗口接收器注销崩溃问题

Great question! This is a common crash issue tied to Samsung's MultiWindow framework on older Android 6.0.1/7.0 devices, and I've helped several developers fix similar problems. Let's break down the root cause first, then jump into actionable fixes:

Root Cause Analysis

Looking at your crash stack trace, the crash occurs in LoadedApk.forgetReceiverDispatcher when the system tries to unregister a VideoCapabilityReceiver from MultiPhoneWindow. This almost always happens because:

  • Samsung's legacy MultiWindow service automatically registers this receiver for apps, even if you don't explicitly enable multiwindow features.
  • There's a timing bug in the system's cleanup logic: when your Activity is destroyed, the system tries to unregister a receiver that was either never registered properly, or already unregistered earlier.
  • Since you haven't declared Samsung's multiwindow metadata, the framework's internal state gets out of sync, triggering the unregister failure.

Actionable Solutions

1. Catch Unregister Exceptions (Quickest Fix)

Since this is a system-level race condition, the most reliable immediate fix is to wrap the unregisterReceiver call in a try-catch block to handle the IllegalArgumentException that's thrown when trying to unregister an unregistered receiver.

You can override the method in your base Activity to apply this globally:

@Override
public void unregisterReceiver(BroadcastReceiver receiver) {
    try {
        super.unregisterReceiver(receiver);
    } catch (IllegalArgumentException e) {
        // Log the error for debugging, but don't let it crash the app
        Log.w("ReceiverCleanup", "Attempted to unregister an unregistered receiver", e);
    }
}

This will intercept all receiver unregister calls for your Activity and swallow the exception that's causing the crash.

2. Add Samsung MultiWindow Metadata (Preventative Fix)

Even if you don't use multiwindow features, declaring the Samsung-specific metadata can help the framework manage its internal receiver state correctly. Add these to your AndroidManifest.xml:

Under the <application> tag:

<meta-data 
    android:name="com.samsung.android.sdk.multiwindow.enable" 
    android:value="true"/>
<meta-data 
    android:name="com.samsung.android.sdk.multiwindow.multiinstance.enable" 
    android:value="false"/> <!-- Disable multi-instance to avoid extra edge cases -->
<meta-data 
    android:name="com.sec.android.multiwindow.STYLE" 
    android:value="freeform"/>

And add the multiwindow category to your Activity's intent filter:

<activity android:name=".YourMainActivity">
    <intent-filter>
        <!-- Keep your existing intent filters, add this line -->
        <category android:name="android.intent.category.MULTIWINDOW_LAUNCHER" />
    </intent-filter>
</activity>

This tells Samsung's framework that your app is aware of multiwindow, which helps it align its receiver registration/unregistration logic.

3. Samsung-Specific Timing Adjustment

For stubborn cases, you can add a small delay to your Activity's destruction logic on affected Samsung devices to let the system finish its receiver cleanup first:

First, create a helper method to detect the affected devices:

private boolean isAffectedSamsungDevice() {
    String deviceBrand = Build.BRAND.toLowerCase();
    int sdkVersion = Build.VERSION.SDK_INT;
    // Target Samsung devices on Android 6.0.1 (M) or 7.0 (N)
    return deviceBrand.contains("samsung") 
        && (sdkVersion == Build.VERSION_CODES.M || sdkVersion == Build.VERSION_CODES.N);
}

Then override onDestroy in your Activity:

@Override
protected void onDestroy() {
    if (isAffectedSamsungDevice()) {
        // Delay super.onDestroy() by 100ms to let the system clean up receivers first
        new Handler(Looper.getMainLooper()).postDelayed(() -> super.onDestroy(), 100);
    } else {
        super.onDestroy();
    }
}

This small delay can resolve timing conflicts between your app's destruction and the system's receiver cleanup.

4. Audit Your App's Receiver Logic

Double-check that all BroadcastReceivers your app registers are properly unregistered:

  • Receivers registered in onCreate should be unregistered in onDestroy
  • Receivers registered in onResume should be unregistered in onPause
  • Avoid registering receivers in static contexts or forgetting to unregister them
    A messy receiver lifecycle in your app can exacerbate the system-level bug.

Recommendation

Start with Solution 1 (catching the exception) because it's the fastest to implement and will immediately stop the crashes. If you still see edge cases, add Solution 2 to align with Samsung's framework. Solutions 3 and 4 are supplementary for more stubborn scenarios.

内容的提问来源于stack exchange,提问作者moskis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:15:51