9

可能重复:
注册活动时的“点”是什么

在所有 Android 示例中,Activity、Services 等的名称都以点开头:

<activity android:name=".MyActivity" />

我忘了在所有 Android 项目中都这样做——但它们确实工作得很好。

我的问题:这个前导点真的需要吗?

编辑:这是我的一个应用程序中的一个小快照示例。这个应用程序完美。它不使用限定名称,也不使用点:

<activity
        android:exported="false"
    android:name="Tankvorgaenge" >

    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>

    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

<activity android:name="Tankvorgangdetails" />
<activity android:name="Tankvorgangdetailsbearbeiten" />
<activity android:name="TankvorgangUebersicht" />
<activity android:name="Verbrauch" />

<service android:name="MyService" />
4

4 回答 4

23

当且仅当指定的类不是应用程序中子包的一部分时,省略点并且不完全限定包/类名称才有效。

如果您的应用程序包名称是com.example.myapp,并且您有一个活动类com.example.myapp.MyActivity

  1. android:name="MyActivity"将工作。
  2. android:name=".MyActivity"将工作。
  3. android:name="com.example.myapp.MyActivity"将工作。

但是,如果您在源代码树中的子包中有相同的应用程序包和活动类,例如com.example.myapp.myactivities.MyActivity事情发生了变化。

  1. android:name=".myactivities.MyActivity"将工作
  2. android:name="com.example.myapp.myactivities.MyActivity"将工作
  3. android:name="MyActivity" 不管用
  4. android:name="myactivities.MyActivity" 不管用

3 不起作用,因为这将推断出您所指的类名实际上com.example.myapp.MyActivity就像上面的第一个示例一样。找不到具有此名称的类,您将收到错误消息。

4 不起作用,因为它看起来像一个完全限定的类名,即系统会将其解释为myactivities.MyActivity是完全限定名本身,而不是com.example.myapp.myactivities.MyActivity.

您需要此处的前导点来说明您使用的是相对路径,而不是绝对路径。如果您只指定一个完全没有包信息的类名,系统会推断该类位于应用程序包层次结构的根部。

于 2012-08-26T19:21:11.180 回答
2

点是使用应用程序提供的相对路径package_name。您可以替换.MyActivitycom.yourActivityPackage.MyActivity

于 2012-08-26T16:01:15.587 回答
1

是的,activity[android:name]应该指定一个完全限定的package.Class,或者如果它以点开头,那么它会附加到application的包中。

查看文档

于 2012-08-26T16:02:20.803 回答
0

这是必需的。它是包名的缩写。android:name 应该指定完整的类名。通过放置一个前导点,我们可以表明以下类名在清单中上面声明的“包”内。

于 2012-08-26T15:59:37.523 回答