在調試的過程中發現一直報這個錯誤"Unable to start activity ComponentInfo",從字面的意思看是無法啟動某個activity組件,但是看了manifest文件,所有的activity組件都已經注冊過了,為什么會報這種錯誤?后來發現原來是注冊路徑出了問題,最開始的代碼是這樣的:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.music"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="5" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
對於MainActivity這個組件,程序啟動的時候尋找它的時候,根據包的路徑"package="com.music"加上".MainActivity"就是
"com.music.MainActivity",但是在工程中MainActivity是在"com.music.activity"這個包下,顯然路徑就是錯的,因此會報無法找到某個組件的錯誤。因此更改組件的注冊路徑就可以解決這個問題:
可以將<activity android:name=".MainActivity">
改成其相對路徑
<activity android:name=".activity.MainActivity">
或者也可以直接用絕對路徑
<activity android:name="com.music.activity.MainActivity">
注意:在注冊組件的時候,如果在名稱前面加了點'.',則表示該組件的路徑是package的路徑加上組件名,比如package='com.music',<activity android:name='.MainActivity'></activity>,則其完整路徑為'com.music.MainActivity'。
如果沒有加點,則表示絕對路徑,如<activity android:name="com.music.activity.MainActivity">。
有一種特殊情況是,如果要注冊的activity在當前package的根目錄下,則前面的點'.'可寫可不寫。但是如果是在package包的子包下,如package='com.music',而MainActivity的絕對路徑為'com.music.activity.MainActivity',則
<activity android:name=".activity.MainActivity">中的".activity.MainActivity"前面的點'.'不能省略。

