2014-02-27 13 views
4

我为具有不同元数据的活动设置了一些别名。活动别名的起始目的

在这个元数据中,我设置了我通过反射加载的片段的名称。
我不知道这是否是一个“干净的”解决方案,尽管通过使用Fragments并将功能放在里面我有一个SuperActivity和2个Empty SubActivities只是为了指定清单中的每一个。

现在的问题是:我可以通过意图启动别名吗? new Intent(Context, Class)将不起作用,因为我找不到通过意向调用设置元数据的方法。

我需要通过<activity android:name="XXX"/>开始一个意图,有没有一种简单的方法来做到这一点?

通用的活性和它的别名,我需要后者的一个新的意图:

<activity 
     android:name="ActivityList" 
     android:label="@string/app_name" 
     android:launchMode="singleTop" 
     android:screenOrientation="portrait" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.app.default_searchable" 
      android:value="ActivityListItem" /> 
     <meta-data 
      android:name="fragment" 
      android:value="FragmentLocationList" /> 
    </activity> 

    <activity-alias 
     android:name="ActivityListItem" 
     android:label="@string/locations" 
     android:parentActivityName="ActivityList" 
     android:targetActivity="ActivityList" > 
     <intent-filter> 
      <action android:name="android.intent.action.SEARCH" /> 
     </intent-filter> 

     <meta-data 
      android:name="android.app.searchable" 
      android:resource="@xml/searchable" /> 
     <meta-data 
      android:name="android.app.default_searchable" 
      android:value="ActivityListItem" /> 
     <meta-data 
      android:name="fragment" 
      android:value="FragmentItemList" /> 
    </activity-alias> 

回答

16

要指定别名,你需要在一个空的意图()对象使用setComponent(ComponentName)

我倾向于设置清单项是一个相对名称

<activity-alias 
    android:name=".ActivityListItem" 

(注意名字开头的时期),然后使用形成的意图单元名

Intent intent = new Intent(); 
String packageName = context.getPackageName(); 
ComponentName componentName = new ComponentName(packageName, 
               packageName + ".ActivityListItem"); 
intent.setComponent(componentName); 
+1

仅供参考,类名不一定总是以packageName作为前缀(例如,有效的活动组件名称可以是com.example.a/com.example.c.TestActivity) – user697495

+2

也可以使用Intent#setClassName()。 – tynn