无法返回 Android 工作室中的主要 activity
Can't get back to main activity in Android studio
在我的项目中,我有两个活动:MainActivity.class 和 SecondActivity.class。
要从 MainActivity 切换到 SecondActivity,我使用以下代码:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
MainActivity.this.startActivity(intent);
而且有效。
我使用相同的代码从 SecondActivity 切换到 MainActivity,但应用程序崩溃了:
Intent intent = new Intent(getApplicationContext(),MainActivity.class);
SecondActivity.this.startActivity(intent);
如果我尝试从 MainActivity 本身打开 MainActivity,它也会崩溃,但如果我尝试从 SecondActivity 打开 SecondActivity,则不会发生这种情况。
有什么想法吗?
这是我的堆栈跟踪:
2021-09-29 17:25:56.843 25827-25827/st.com.st25androiddemoapp E/AndroidRuntime:致命异常:main
进程:st.com.st25androiddemoapp,PID:25827
java.lang.RuntimeException: 无法恢复 activity {st.com.st25androiddemoapp/st.com.st25androiddemoapp.MainActivity}: java.lang.NullPointerException: 尝试调用虚拟方法 'boolean java.lang.String.equals(java.lang.Object)' 在空对象引用上
在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:4270)
在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4302)
在 android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
在 android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044)
在 android.os.Handler.dispatchMessage(Handler.java:107)
在 android.os.Looper.loop(Looper.java:224)
在 android.app.ActivityThread.main(ActivityThread.java:7562)
在 java.lang.reflect.Method.invoke(本机方法)
在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'boolean java.lang.String.equals(java.lang.Object)'
在 st.com.st25androiddemoapp.MainActivity.onResume(MainActivity.java:279)
在 android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1454)
在 android.app.Activity.performResume(Activity.java:8050)
在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:4260)
谢谢
当您使用 startActivity(intent)
启动 MainActivity
时,Intent.getAction()
方法将 return null
。此方法在 MainActivity#onResume
.
中调用
为防止您的应用程序崩溃,您需要在调用任何方法之前确保 action
不是 null
(在您的情况下为 equals()
。)
我找到了源代码。只是和 action != null &&
这里
if (action != null && (action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED) ||
action.equals(NfcAdapter.ACTION_TECH_DISCOVERED) ||
action.equals(NfcAdapter.ACTION_TAG_DISCOVERED))) {
// If the resume was triggered by an NFC event, it will contain an EXTRA_TAG providing
// the handle of the NFC Tag
Tag androidTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (androidTag != null) {
// This action will be done in an Asynchronous task.
// onTagDiscoveryCompleted() of current activity will be called when the discovery is completed.
new TagDiscovery(this).execute(androidTag);
}
}
别忘了加括号()
它将修复 NPE,但我不确定这是否是最佳解决方案。我不知道你想达到什么目的。
更新
如果您想通过关闭在 MainActivity 顶部打开的 Second activity 导航回 main activity,则只需使用 finish()
方法
你试过用this
替换getapplicationcontext()
吗?
Intent intent = new Intent(SecondActivity.this,MainActivity.class);
startActivity(intent);
如果你想要的是 return 到 MainActivity
那么在 SecondActivity
你应该简单地做:
finish()
这将破坏 activity 和 return 到前一个。
在我的项目中,我有两个活动:MainActivity.class 和 SecondActivity.class。
要从 MainActivity 切换到 SecondActivity,我使用以下代码:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
MainActivity.this.startActivity(intent);
而且有效。
我使用相同的代码从 SecondActivity 切换到 MainActivity,但应用程序崩溃了:
Intent intent = new Intent(getApplicationContext(),MainActivity.class);
SecondActivity.this.startActivity(intent);
如果我尝试从 MainActivity 本身打开 MainActivity,它也会崩溃,但如果我尝试从 SecondActivity 打开 SecondActivity,则不会发生这种情况。
有什么想法吗?
这是我的堆栈跟踪:
2021-09-29 17:25:56.843 25827-25827/st.com.st25androiddemoapp E/AndroidRuntime:致命异常:main 进程:st.com.st25androiddemoapp,PID:25827 java.lang.RuntimeException: 无法恢复 activity {st.com.st25androiddemoapp/st.com.st25androiddemoapp.MainActivity}: java.lang.NullPointerException: 尝试调用虚拟方法 'boolean java.lang.String.equals(java.lang.Object)' 在空对象引用上 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:4270) 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4302) 在 android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52) 在 android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2044) 在 android.os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:224) 在 android.app.ActivityThread.main(ActivityThread.java:7562) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950) 由以下原因引起:java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'boolean java.lang.String.equals(java.lang.Object)' 在 st.com.st25androiddemoapp.MainActivity.onResume(MainActivity.java:279) 在 android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1454) 在 android.app.Activity.performResume(Activity.java:8050) 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:4260)
谢谢
当您使用 startActivity(intent)
启动 MainActivity
时,Intent.getAction()
方法将 return null
。此方法在 MainActivity#onResume
.
为防止您的应用程序崩溃,您需要在调用任何方法之前确保 action
不是 null
(在您的情况下为 equals()
。)
我找到了源代码。只是和 action != null &&
这里
if (action != null && (action.equals(NfcAdapter.ACTION_NDEF_DISCOVERED) ||
action.equals(NfcAdapter.ACTION_TECH_DISCOVERED) ||
action.equals(NfcAdapter.ACTION_TAG_DISCOVERED))) {
// If the resume was triggered by an NFC event, it will contain an EXTRA_TAG providing
// the handle of the NFC Tag
Tag androidTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
if (androidTag != null) {
// This action will be done in an Asynchronous task.
// onTagDiscoveryCompleted() of current activity will be called when the discovery is completed.
new TagDiscovery(this).execute(androidTag);
}
}
别忘了加括号()
它将修复 NPE,但我不确定这是否是最佳解决方案。我不知道你想达到什么目的。
更新
如果您想通过关闭在 MainActivity 顶部打开的 Second activity 导航回 main activity,则只需使用 finish()
方法
你试过用this
替换getapplicationcontext()
吗?
Intent intent = new Intent(SecondActivity.this,MainActivity.class);
startActivity(intent);
如果你想要的是 return 到 MainActivity
那么在 SecondActivity
你应该简单地做:
finish()
这将破坏 activity 和 return 到前一个。