在android:name值中使用$ symbol

时间:2014-10-29 19:19:54

标签: android android-activity android-manifest android-source

我试图了解android中的一些代码。我明白了

<activity
android:name="Settings$DemoRangeActivity"

有人可以解释名称中$符号的含义或用法。我找不到任何名为DemoRangeActivity的活动。这是正确的我想要的吗?

由于

1 个答案:

答案 0 :(得分:1)

Settings$DemoRangeActivity是对DemoRangeActivity类中定义的内部类Settings的引用。如果您注意到该类已在清单中引用,但未在Settings类中实际定义,则只要此特定类将作为Activity打开,应用程序就会崩溃。

在AOSP的设置应用程序部分,更具体地说,在Settings.java文件中,与设置应用程序相关的每个活动都在文件底部引用,并带有空体。它们都扩展了Settings类。这包括以下内容:

/*
 * Settings subclasses for launching independently.
 */
public static class BluetoothSettingsActivity extends Settings { /* empty */ }
public static class WirelessSettingsActivity extends Settings { /* empty */ }
...

如上所述,每个通常都有一个在单独的源文件中实现的关联片段,它扩展了SettingsPreferenceFragment类。这样做是为了使您的片段(在另一个文件中实现)可以作为活动单独启动。如果您密切关注,Settings课程为PreferenceActivity

如果要将自己的片段添加到“设置”应用,则可能需要在Settings.java文件及其清单文件中声明它。所以基本上,你在一个单独的文件中有一个DemoRange片段,以及在DemoRangeActivity和清单文件中声明的Settings.java,这样一个声明的例子会是:

<!-- Demo range settings activity -->
<activity android:name="Settings$DemoRangeActivity">
   <intent-filter>
       <action android:name="android.intent.action.MAIN" />
       <category android:name="android.intent.category.DEFAULT" />
       <category android:name="com.android.settings.SHORTCUT" />
   </intent-filter>
   <!-- Here is your actual binding between the activity and the fragment -->
   <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
      android:value="com.android.settings.DemoRange" />
   <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
       android:resource="@id/demo_range_settings" />
</activity>