Android SDK范例源码学习系列四 AppNavigation

   (本系列基于Jelly Bean,Android OS4.2,API 17版本)

  就算是最简单的应用程序也会拥有不止一项功能,因此我们经常要应对多个Activity。主Activity随应用程序启动而启动,可以通过触发事件开启另外的Activity。要想激活应用中的某个特定组件,可以用显式命名的Intent来实现,也可以采用隐式Intent,尽可能选用隐式的,它能为模块化功能提供强大的框架。

  隐式Intent不需要指定要使用哪个组件,它们通过过滤器指定所需的功能,而Android系统必须决定使用哪个组件是最佳选择。Intent过滤器可以是动作action,数据data或者分类category。最常用的Intent过滤器是动作,(本例用的是category,IntentFilter中可以有多个Category,可以比Intent中的Category多,但是必须包含Intent对象中所有的Category)。

  下面是使用隐式Intent启用Activity的具体步骤。

  (1)声明Intent,同时指定合适的过滤器(如ACTION_VIEW,ACTION_WEB_SEARCH等)。

  (2)为运行Activity所需的该Intent附加额外信息。

  (3)将该Activity传递给startActivy()方法。

  本例另外一个技巧就是,提供给用户选择列表,供用户点选。这一功能是通过ListActiviy实现。ListActivity是Activity的一个子类,它会根据用户选择来触发对应事件。下面是创建选择列表的步骤:

  (1)创建一个扩展ListActivity的类。

public class AppNavHomeActivity extends ListActivity{

//...

}

  (2)创建一个存储各个选项信息(本例是名称和Intent对象)的List,

  static class SampleInfo{/*...*/}

  ...

  private List<SampleInfo> mItems;

  private List<SampleInfo> querySampleActivities(){/*...*/}

  (3)以Adapter为参数调用setListAdapter(),并指定选择列表及一个布局:

  class SampleAdapter extends BaseAdapter{

    //...

    //指定布局方法

    public View getView(){...}

  }    

  setListAdapter(new SampleAdapter(querySampleActivities()));

  在这里简单介绍下Adapter的概念和用法。 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter,换句话说Adapter的作用就是把data装配好以后展示在View上。set方法用来设置,get方法用来获取。更详尽的介绍可以自行查找学习。

  (4)启动OnItemClickListener或者实现onListItemClick方法以确定选中了哪个选项,并做出对应动作:  

   protected void onListItemClick(ListView lv, View v, int pos, long id) {
     SampleInfo info = (SampleInfo) getListAdapter().getItem(pos);
     startActivity(info.intent);
   }

  下面写出主Activity类,大家可以对照学习:

  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.view.ViewGroup;
  import android.widget.BaseAdapter;
  import android.widget.ListView;
  import android.widget.TextView;

  import java.util.ArrayList;
  import java.util.List;

  public class AppNavHomeActivity extends ListActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setListAdapter(new SampleAdapter(querySampleActivities()));
    }

    @Override
    protected void onListItemClick(ListView lv, View v, int pos, long id) {
    SampleInfo info = (SampleInfo) getListAdapter().getItem(pos);
    startActivity(info.intent);
    }

  protected List<SampleInfo> querySampleActivities() {
    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.setPackage(getPackageName());

    //调用方法addCatgory来为Intent添加Category

    intent.addCategory(Intent.CATEGORY_SAMPLE_CODE);

    PackageManager pm = getPackageManager();
    List<ResolveInfo> infos = pm.queryIntentActivities(intent, 0);

    ArrayList<SampleInfo> samples = new ArrayList<SampleInfo>();

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

      Intent target = new Intent();
      target.setClassName(info.activityInfo.applicationInfo.packageName,info.activityInfo.name);
      SampleInfo sample = new SampleInfo(label, target);
      samples.add(sample);
    }

    return samples;
  }

  static class SampleInfo {
    String name;
    Intent intent;

    SampleInfo(String name, Intent intent) {
    this.name = name;
    this.intent = intent;
    }
  }

  class SampleAdapter extends BaseAdapter {
    private List<SampleInfo> mItems;
    public SampleAdapter(List<SampleInfo> items) {
    mItems = items;
  }

    @Override
    public int getCount() {
      return mItems.size();
    }

    @Override
    public Object getItem(int position) {
      return mItems.get(position);
    }

    @Override
    public long getItemId(int position) {
      return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      if (convertView == null) {
      convertView = getLayoutInflater().inflate(android.R.layout.simple_list_item_1,parent, false);
       convertView.setTag(convertView.findViewById(android.R.id.text1));
      }
      TextView tv = (TextView) convertView.getTag();
      tv.setText(mItems.get(position).name);
      return convertView;
    }
  }
}

本例中的几个子Activity各不相同,用到了不同的知识点,感兴趣的同学可以进一步研究。

时间: 2024-10-24 23:58:20

Android SDK范例源码学习系列四 AppNavigation的相关文章

ubuntu12.04 安装android sdk /ndk/源码 编译环境

做android已经近5年了,期间android的各种环境都自己配过,自己是个想法比较多的人,各自神奇到想法都有,包括写博客,但是一直是没有具体落实...想法再多,不去努力实现也只能是想法了,今天准备从写博客这个小事开始做起,磨练自己到,不废话了,直接进入主题: 一.JDK(下载并安装jdk),注意事项如下: a.32位需要下32的,64位的也注意是下载64位的: b.配置环境变量: $ sudo gedit /etc/profile           在文件的末尾加上如下内容:       

【JDK1.8】 Java小白的源码学习系列:HashMap

目录 Java小白的源码学习系列:HashMap 官方文档解读 基本数据结构 基本源码解读 基本成员变量 构造器 巧妙的tableSizeFor put方法 巧妙的hash方法 JDK1.8的putVal方法 JDK1.8的resize方法 初始化部分 数组搬移部分 Java小白的源码学习系列:HashMap 春节拜年取消,在家花了好多天时间啃一啃HashMap的源码,同样是找了很多很多的资料,有JDK1.7的,也有JDK1.8的,当然本文基于JDK1.8.将所学到的东西进行整理,希望回过头再看

Android SDK与源码下载

http://www.cnblogs.com/tianjian/p/3430136.html 第一部分:开发前的准备-第八章 Android SDK与源码下载

JDK源码学习系列07----Stack

                                                               JDK源码学习系列07----Stack 1.Stack源码非常简单 package java.util; public class Stack<E> extends Vector<E> { // 版本ID.这个用于版本升级控制,这里不须理会! private static final long serialVersionUID = 122446316454

JDK源码学习系列08----HashMap

                                                          JDK源码学习系列08----HashMap 1.HashMap简介 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashMap 的实现不是同步的,这意味着它不是线程安全的.它的key.value都可以为null.此外,

JDK源码学习系列06----Vector

                                            JDK源码学习系列06----Vector 1.Vector简介 Vector的内部是数组实现的,它和ArrayList非常相似,最大的不同就是 Vector 是线程安全(同步)的. public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.S

JDK源码学习系列05----LinkedList

                                         JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实现的,它也可以被当作堆栈.队列或双端队列进行操作. public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, jav

Java 源码学习系列(三)——Integer

Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法. 类定义 public final class Integer extends Number implements Comparable<Integer> 从类定义中我们可以知道以下几点: 1.Integer类不能被继承 2.Integer类

jquery 源码学习(四)构造jQuery对象-工具函数

jQuery源码分析-03构造jQuery对象-工具函数,需要的朋友可以参考下. 作者:nuysoft/高云 QQ:47214707 EMail:[email protected] 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 读读写写,不对的地方请告诉我,多多交流共同进步,本章的的PDF等本章写完了发布. jQuery源码分析系列的目录请查看 http://nuysoft.iteye.com/blog/1177451,想系统的好好写写,目前还是从我感兴趣的部分开始,如果大家有对哪