错误信息,通常直指问题根源。-----箴言-----
内容简介:
本节来看一个常见的崩溃问题。
问题描述:
在进行Android应用程序开发时,经常遇到“AndroidRuntime: FATAL EXCEPTION: main”,“android.content.ActivityNotFoundException: Unable to find explicit activity class ”问题,程序直接崩溃。
分析:
直接看log错误信息,很明显,是没有声明对应的Activity导致的。尤其是刚开始进行Android开发时,经常忘记声明Activity。参考关键log如下:
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.test.myapplication5/com.test.myapplication5.activity.SubFrameActivity}; have you declared this activity in your AndroidManifest.xml?
“在AndroidManifest.xml中,你声明了这个activity么?”
再一检查代码,确实是没有声明。
解决方式:
只要在AndroidMenifest.xml文件中进行Activity的声明即可。
举例:
下面是一个AndroidMenifest.xml,如果注释掉SubFrameActivity,就会出现“Unable to find explicit activity class”这种问题。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.myapplication5">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication5">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/Theme.MyApplication5.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- <activity android:name=".activity.SubFrameActivity"></activity>-->
</application>
</manifest>
具体的错误信息参考如下:
10-16 20:32:50.481 564-929/system_process D/Interception: result: allow, reason: callerPkg == calleePkg, rule: runType===activity|||callerPkg===com.test.myapplication5|||calleePkg===com.test.myapplication5|||calleeClass===com.test.myapplication5.activity.SubFrameActivity|||action===null
10-16 20:32:50.481 564-929/system_process I/ActivityManager: START u0 {cmp=com.test.myapplication5/.activity.SubFrameActivity} from uid 10042 on display 0
10-16 20:32:50.482 2699-2699/com.test.myapplication5 D/AndroidRuntime: Shutting down VM
--------- beginning of crash
10-16 20:32:50.483 2699-2699/com.test.myapplication5 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.test.myapplication5, PID: 2699
android.content.ActivityNotFoundException: Unable to find explicit activity class {com.test.myapplication5/com.test.myapplication5.activity.SubFrameActivity}; have you declared this activity in your AndroidManifest.xml?
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1794)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1512)
at android.app.Activity.startActivityForResult(Activity.java:3942)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:675)
at android.app.Activity.startActivityForResult(Activity.java:3902)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:662)
at android.app.Activity.startActivity(Activity.java:4231)
at android.app.Activity.startActivity(Activity.java:4199)
at com.test.myapplication5.MainActivity$1.onClick(MainActivity.java:34)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21153)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5539)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)
10-16 20:32:50.489 564-1639/system_process W/ActivityManager: Force finishing activity com.test.myapplication5/.MainActivity
10-16 20:32:50.492 564-596/system_process D/ActivityManager: Nemu don't show crash dialog of ProcessRecord{2592e89 2699:com.test.myapplication5/u0a42}
10-16 20:32:50.493 564-594/system_process D/Interception: result: allow, reason: calleePkg is system app, rule: runType===broadcast|||callerPkg===android|||calleePkg===com.mumu.acc|||calleeClass===com.mumu.acc.AccMsgReceiver|||action===uu.intent.action.STOP_ACCELERATE
10-16 20:32:50.493 906-1068/com.netease.nemu_vapi_android.nemu D/com.netease.nemu_android_watchdog_lib.core.Watchdog: upload event: {"architecture":"x86_64","channel":"mac-nochannel","engine":"MAC","language":"zh-Hans","package":"mac-nopackage","usage":"0","uuid":"2909ab3a6d7656d98d4abc40b42ebc06","version":"1.9.21","x":{"app_elapse":29,"app_name":"MyApplication5","app_package":"com.test.myapplication5","error":{"code":0,"msg":"ok"},"token":""}} type: ExitAPP sign: I2Zjzeiz7/+eE95c77VVf/5xrqA= uid: 1000
10-16 20:32:50.495 1082-1082/com.mumu.acc D/AccService: AccMsgReceiver: uu.intent.action.STOP_ACCELERATE
10-16 20:32:50.497 564-1639/system_process I/com.android.server.tabs.TabManagerService: notifyClosing:741: notify tab closed in android as it's closed task com.test.myapplication5, taskId: 742, elapseTime: 29578
10-16 20:32:50.502 2699-2699/com.test.myapplication5 I/Process: Sending signal. PID: 2699 SIG: 9
扩展:
从log信息中,看可以看到一个Activity被启动时的堆栈信息。这有利于理解Activity的生命周期。
这不就是很多面试官最喜欢问的问题么? 建议读者一定要深刻理解这些错误信息。
注:重视错误信息,重视警告信息,重视提示信息。