1

我正在创建一个活动启动器,以便它可以检测我的 Android 项目中的所有可用活动并显示为活动列表,并在我单击一个项目时启动。

Android 的 API 演示

它应该像谷歌 API 演示项目一样工作。我参考了 ApiDemos.java 并尝试将代码修改为 -->mainIntent.addCategory("com.mypackage")、getStringExtra(...)、putStringExtra(...) 并添加了一些“intent-filter” "category android:name="com.mypackage" 到 manifest 中的其他活动,但是只有 1 ,主要活动显示在列表中,其他活动不显示。如果您知道解决方案,请告诉我。非常感谢:

package com.example.android.apis;

import android.app.ListActivity;

public class ApiDemos extends ListActivity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();
    String path = intent.getStringExtra("com.example.android.apis.Path");

    if (path == null) {
        path = "";
    }

    setListAdapter(new SimpleAdapter(this, getData(path),
            android.R.layout.simple_list_item_1, new String[] { "title" },
            new int[] { android.R.id.text1 }));
    getListView().setTextFilterEnabled(true);
}

protected List<Map<String, Object>> getData(String prefix) {
    List<Map<String, Object>> myData = new ArrayList<Map<String, Object>>();

    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_SAMPLE_CODE);

    PackageManager pm = getPackageManager();
    List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);

    if (null == list)
        return myData;

    String[] prefixPath;
    String prefixWithSlash = prefix;

    if (prefix.equals("")) {
        prefixPath = null;
    } else {
        prefixPath = prefix.split("/");
        prefixWithSlash = prefix + "/";
    }

    int len = list.size();

    Map<String, Boolean> entries = new HashMap<String, Boolean>();

    for (int i = 0; i < len; i++) {
        ResolveInfo info = list.get(i);
        CharSequence labelSeq = info.loadLabel(pm);
        String label = labelSeq != null
                ? labelSeq.toString()
                : info.activityInfo.name;

        if (prefixWithSlash.length() == 0 || label.startsWith(prefixWithSlash)) {

            String[] labelPath = label.split("/");

            String nextLabel = prefixPath == null ? labelPath[0] :   labelPath[prefixPath.length];

            if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) {
                addItem(myData, nextLabel, activityIntent(
                        info.activityInfo.applicationInfo.packageName,
                        info.activityInfo.name));
            } else {
                if (entries.get(nextLabel) == null) {
                    addItem(myData, nextLabel, browseIntent(prefix.equals("") ? nextLabel : prefix + "/" + nextLabel));
                    entries.put(nextLabel, true);
                }
            }
        }
    }

    Collections.sort(myData, sDisplayNameComparator);

    return myData;
}

private final static Comparator<Map<String, Object>> sDisplayNameComparator =
    new Comparator<Map<String, Object>>() {
    private final Collator   collator = Collator.getInstance();

    public int compare(Map<String, Object> map1, Map<String, Object> map2) {
        return collator.compare(map1.get("title"), map2.get("title"));
    }
};

protected Intent activityIntent(String pkg, String componentName) {
    Intent result = new Intent();
    result.setClassName(pkg, componentName);
    return result;
}

protected Intent browseIntent(String path) {
    Intent result = new Intent();
    result.setClass(this, ApiDemos.class);
    result.putExtra("com.example.android.apis.Path", path);
    return result;
}

protected void addItem(List<Map<String, Object>> data, String name, Intent intent) {
    Map<String, Object> temp = new HashMap<String, Object>();
    temp.put("title", name);
    temp.put("intent", intent);
    data.add(temp);
}

@Override
@SuppressWarnings("unchecked")
protected void onListItemClick(ListView l, View v, int position, long id) {
    Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position);

    Intent intent = (Intent) map.get("intent");
    startActivity(intent);
}
}
4

1 回答 1

0

我通过正确编辑 manyfest android:label 找到了解决方案:

<activity android:name=".app.HelloWorld" android:label="app/HelloWorld">
         <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="com.tungnd.android.labs.TUNGND" />
         </intent-filter>
    </activity>
于 2012-10-06T15:05:24.820 回答