ApiDemos 2.3研读笔记(2)

来源:互联网 发布:手机网络延迟 编辑:程序博客网 时间:2024/04/28 18:56

1、通过配置文件AndroidManifest.xml中可以看出ApiDemos的入口是ApiDemos.java。

<activity android:name="ApiDemos">      <intent-filter>          <action android:name="android.intent.action.MAIN" />          <category android:name="android.intent.category.DEFAULT" />          <category android:name="android.intent.category.LAUNCHER" />      </intent-filter></activity>

2、ApiDemos.java代码加上个人注释如下:

/** Copyright (C) 2007 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      [url]http://www.apache.org/licenses/LICENSE-2.0[/url]** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.example.android.apis;import android.app.ListActivity;import android.content.Intent;import android.content.pm.PackageManager;import android.content.pm.ResolveInfo;import android.os.Bundle;import android.view.View;import android.widget.ListView;import android.widget.SimpleAdapter;import java.text.Collator;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;/** 主要是通过对Activity的label信息进行分析,从而将Activity进行分类并通过ListView显示出来。* 例如<activity android:name=".app.HelloWorld" android:label="@string/activity_hello_world">的label为* App/Activity/Hello World,程序运行的结果是一级目录含有App选项,点击App出现的二级目录含有Activity选项,* 点击Activity出现的三级目录含有Hello World选项,点击Hello World会出现Hello World这个Activity运行的结果*/public class ApiDemos extends ListActivity {    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);                Intent intent = getIntent();        /*        * 当程序启动要显示一级目录(App, Content, ...)时,Intent对象里绑定的附加信息path为空        * 当点击一级目录选项进入二级目录(例如App下的Activity, Alarm, ...)时,path就不为空了(例如为App)        */        String path = intent.getStringExtra("com.example.android.apis.Path");                if (path == null) {            path = "";        }        // 通过adapter为当前ListActivity传递数据        setListAdapter(new SimpleAdapter(this, getData(path),                android.R.layout.simple_list_item_1, new String[] { "title" },                new int[] { android.R.id.text1 }));        // 允许当前ListView可以根据用户输入的值进行过滤        getListView().setTextFilterEnabled(true);    }    /*    * 获取应用列表,包括一级目录,二级目录,等等    */    protected List getData(String prefix) {        List<Map> myData = new ArrayList<Map>();        /*        * 获取在AndroidManifest.xml文件中的Intent Filter里配置了        * Intent.ACTION_MAIN和Intent.CATEGORY_SAMPLE_CODE的所有Activity        */        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;                // 当要显示一级目录时,prefix为空字符串;当点击App进入要显示二级目录时,prefix为App;        if (prefix.equals("")) {            prefixPath = null;        } else {            prefixPath = prefix.split("/");        }                int len = list.size();                Map<String, Boolean> entries = new HashMap<String, Boolean>();        for (int i = 0; i < len; i++) {            ResolveInfo info = list.get(i);            // 获取Activity的label信息,例如App/Activity/Hello World            CharSequence labelSeq = info.loadLabel(pm);            String label = labelSeq != null                    ? labelSeq.toString()                    : info.activityInfo.name;                        if (prefix.length() == 0 || label.startsWith(prefix)) {                // 例如labelPath = [App, Activity, Hello World]                String[] labelPath = label.split("/");                // 例如要显示一级目录时nextLabel = "App",要显示二级目录时,nextLabel = "Activity"                String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length];                // 当要显示的label为Activity而非目录时,需要为label绑定跳转到相关Activity的Intent                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> sDisplayNameComparator = new Comparator<Map>() {        private final Collator  collator = Collator.getInstance();        public int compare(Map map1, Map map2) {            return collator.compare(map1.get("title"), map2.get("title"));        }    };    /*    * 为label绑定跳转到相关Activity的Intent    */    protected Intent activityIntent(String pkg, String componentName) {        Intent result = new Intent();        result.setClassName(pkg, componentName);        return result;    }        /*    * 为label绑定跳转到当前Activity的Intent,附加信息path为当前目录    * 例如为Activity这个label绑定的Intent中附加值为App/Activity    */    protected Intent browseIntent(String path) {        Intent result = new Intent();        result.setClass(this, ApiDemos.class);        result.putExtra("com.example.android.apis.Path", path);        return result;    }    /*    * 将符合条件的选项加入List中    */    protected void addItem(List<Map> 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    protected void onListItemClick(ListView l, View v, int position, long id) {        Map map = (Map) l.getItemAtPosition(position);        Intent intent = (Intent) map.get("intent");        startActivity(intent);    }}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 快递员不给验货怎么办 顺丰验货不要了怎么办 闲鱼买家掉包了怎么办 闲鱼正在退款中怎么办 拒收货物卖家拒绝退款怎么办 货物没问题淘宝卖家拒收怎么办 头发稀少长的慢怎么办 没满16岁怎么办银行卡 网上买东西手机号填错了怎么办 买东西电话号码填错了怎么办 淘宝联盟扣54分怎么办 联盟被扣54分怎么办 ofo押金退了余额怎么办 网购还没收货就已签收怎么办 理财公司倒闭分公司法人怎么办 公司让离职不想走怎么办 公司让离职自己不想走怎么办 小孩子有购物狂病怎么办 拉杆箱的轮子卡怎么办 想你了怎么办的英文 那现在怎么办 英文怎写 平安证券账号忘了怎么办 发现发票是假的怎么办 公司收到假发票入账了怎么办 手表皮带有汗味怎么办 利客来购物卡丢了怎么办 乐天玛特倒闭卡怎么办 lv皮带买长了怎么办 密袋鼠咬了人怎么办 lv皮带如果长了怎么办 天赐农场公众号进不去了怎么办 苹果删了订阅号怎么办 蚂蚁借呗没有自动扣款怎么办 有对方qq号名字怎么办 腾讯模拟器刺激现场注册上限怎么办 丹阳智慧人社登入密码忘了怎么办? ipad系统被锁了怎么办 电脑管理员账号删了怎么办 自己电脑删文件需要管理员怎么办 苹果电脑管理员密码忘记了怎么办 电脑提示安全设置不允许下载怎么办