恢复时出现 NullPointerException activity

NullPointerException while resuming activity

我在 Nexus 设备上遇到此崩溃(具有相同 OS 版本的索尼设备不会崩溃):

02-20 14:38:14.551 22255 22255 I DebugActivity: java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference
02-20 14:38:14.551 22255 22255 I DebugActivity:     at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2180)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2233)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at android.support.v4.app.FragmentController.execPendingActions(FragmentController.java:379)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at android.support.v4.app.FragmentActivity.onResume(FragmentActivity.java:461)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at com.whatever.sdk.MyActivity.onResume(MyActivity.java:109)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at com.whatever.sdk.MyActivity.onCallStateChanged(MyActivity.java:231)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at android.telephony.PhoneStateListener.handleMessage(PhoneStateListener.java:295)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at android.os.Handler.dispatchMessage(Handler.java:102)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at android.os.Looper.loop(Looper.java:148)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at android.app.ActivityThread.main(ActivityThread.java:5417)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at java.lang.reflect.Method.invoke(Native Method)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
02-20 14:38:14.551 22255 22255 I DebugActivity:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这里是相关的代码片段:

public class MyActivity extends AppCompatActivity {
...
    private final PhoneStateListener phoneStateListener = new PhoneStateListener() {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            if(state == TelephonyManager.CALL_STATE_IDLE) {
                MyActivity.this.onResume();
...
    @Override
    protected void onResume() {
        try {
            super.onResume();
...

activity 未使用任何启动模式声明,尝试在启动 activity 时添加不同的标志(例如 Intent.FLAG_ACTIVITY_CLEAR_TOP)无济于事。我们有 supportLibraryVersion = '27.0.2'

是否有明显的解决方法?为什么它发生在某些设备上而不是其他设备上?

不要像 onCallStateChanged() 中的 onResume() 那样调用 Android 生命周期方法,只需在单独的方法中删除 onResume() 的相关代码,然后从 [=11] 中调用该方法=].这样当 Activity 将恢复调用相关代码时,也可以在需要时调用该方法以 运行 相关代码。当然,您需要在这个新创建的方法中添加适当的对象条件检查。

从错误日志中我可以看到您正在使用 Fragments。我以前遇到过类似的错误。想到的另一件事是保存对 MainActivity 的引用,例如在 Activity mainActivityRef = getActivity() 之类的引用中的 Fragments 中。稍后尝试将其用作 mainActivityRef.onMyFunc()。这使我免于出现此错误 Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference

感谢@ben-p 对 undocumented info on "only the Android framework should call [onResume()]" (mind you, this is a public method, along with onPostResume 的评论),解决方案是删除 phoneStateListener。在模拟器上测试,很明显 activity(及其托管的视频)在收到来电通知、通知被取消或用户完成 phone打电话。令人困惑的部分是,在大多数设备上,直接调用 onResume() 不会 导致崩溃,从而隐藏了错误。