Android应用Options Menu周期性崩溃并关闭上一Activity问题排查
我给开发中的应用加了带「home」按钮的Options Menu,按钮多数时候正常,但点击会周期性崩溃。崩溃常发生在按钮至少点过一次或按下系统返回键之后。另外,点击该按钮后会关闭上一Activity,按返回键回不到之前的页面。
Toolbar代码
// Creates toolbar override fun onCreateOptionsMenu(menu: Menu?): Boolean { val menuInflater = menuInflater menuInflater.inflate(R.menu.home, menu) return true } // Listens to click of toolbar override fun onOptionsItemSelected(item: MenuItem): Boolean { val id = item.itemId if (id == R.id.home) { val intent = Intent(this, Menu::class.java) startActivity(intent) } return super.onOptionsItemSelected(item) }
Logcat崩溃日志
2023-11-28 11:58:15.760 6693-6693 AndroidRuntime
com.benwhittington.flanges D Shutting down VM 2023-11-28
11:58:15.765 6693-6693 AndroidRuntime
com.benwhittington.flanges E FATAL EXCEPTION: main
Process: com.benwhittington.flanges, PID: 6693
android.content.ActivityNotFoundException: Unable to find explicit
activity class {com.benwhittington.flanges/android.view.Menu}; have
you declared this activity in your AndroidManifest.xml, or does your
intent not match its declared ?
at
android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2171)
at
android.app.Instrumentation.execStartActivity(Instrumentation.java:1805)
at android.app.Activity.startActivityForResult(Activity.java:5596)
at
androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:780)
at android.app.Activity.startActivityForResult(Activity.java:5554)
at
androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:761)
at android.app.Activity.startActivity(Activity.java:6052)
at android.app.Activity.startActivity(Activity.java:6019)
at
com.benwhittington.flanges.FlangeInspection.onOptionsItemSelected(FlangeInspection.kt:242)
at android.app.Activity.onMenuItemSelected(Activity.java:4532)
at
androidx.activity.ComponentActivity.onMenuItemSelected(ComponentActivity.java:528)
at
androidx.fragment.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:352)
at
androidx.appcompat.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:269)
at
androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:110)
at
androidx.appcompat.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:66)
at
androidx.appcompat.widget.Toolbar$1.onMenuItemClick(Toolbar.java:225)
at
androidx.appcompat.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:781)
at
androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:836)
at
androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:159)
at
androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:987)
at
androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:977)
at
androidx.appcompat.widget.ActionMenuView.invokeItem(ActionMenuView.java:625)
at
androidx.appcompat.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:156)
at android.view.View.performClick(View.java:7892)
at android.widget.TextView.performClick(TextView.java:16220)
at android.view.View.performClickInternal(View.java:7869)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:30891)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8762)
at java.lang.reflect.Method.invoke(Native Method)
at
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)
Manifest文件
<?xml version="1.0" encoding="utf-8"?> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Flanges" tools:targetApi="31"> <activity android:name=".ViewISO" android:exported="false" /> <activity android:name=".ViewInspection" android:exported="false" /> <activity android:name=".AddEmail" android:exported="false" /> <activity android:name=".FlangeInspection" android:exported="false" /> <activity android:name=".SignUp" android:exported="false" /> <activity android:name=".Menu" android:exported="false" /> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>
解决方案
折腾许久后发现问题根源:我的Activity命名为Menu,这和Android框架自带的android.view.Menu类名冲突,导致启动Menu::class.java的Intent时,系统混淆了自定义Activity和系统类,引发随机崩溃。将Activity名称修改为其他非冲突名称后,所有问题都解决了——按钮正常工作,返回键也能回到之前的页面。
内容的提问来源于stack exchange,提问作者Whitt

