2011年6月30日星期四

  Android周学习Step By Step(5)--常用widget组件

首先要说的是Android中对widget组件的一些列操作都是通过查找该组件的ID后的操作,和.NET中的双击直接编辑事件过程的傻瓜似的操作大大不同,但是这并不妨碍我们对Android的学习。

l  Button、ImageButton

外观控制方面:与.NET中的Button相比前者更加傻瓜化,Android在配置文件中控制Button的外观方面的参数,.NET则直接通过拖拖拽拽就可以方便的经行界面控制。

时间响应方面:Android同过监听实现对事件的响应,而.NET则是通过委托(在VB6中则直接通过过程函数名来实现对事件的响应)。至于ImageButton在事件响应方面和Button是一样,只不过多了增加图片的功能而已,也就是说Android中把Button分的更细了。

其他方面大同小异。

l  TextView

和.NET中的Label大致相同,明显的区别在于获得其文本值和对其赋值的方法不一样。Android中取出TextView的文本采用getText方法,而为TextView赋值则采用setText方法。

l  EditText

和.NET中的TextBox类似,同TextView一样取得EditText的文本内容和对其赋值同样用getText和setText两个方法,其他方面和.NET中的大致一致,可以照搬过来用。

l  CheckBox

和.NET中的CheckBox没有什么大的区别,还是在获得其文本内容以及设置文本内容的时候用getText以及setText两个方法而已。

l  RadioGroup

Android中的RadioGroup和.NET中的GroupBox以及RadioButton配合起来是一样的,都是提供单选的控件,没有明显的区别。

l  Spinner

和.NET中的ComboBox类似都是通过下拉菜单进行选择,都支持既能在程序代码中加载数据也能在布局文件中加载数据,用起来没有太大区别。

l  AutoCompleteTextView

自动完成文本控件是.NET中所没有的,如果.NET要实现这种效果的话比Android要费尽http://topic.csdn.net/u/20100909/09/0dd742c7-0e4c-4e55-8386-47d016bc3231.html

l  DatePicker、TimePicker

以上两个控件是用于选择日期和时间的在.NET中的DateTimePicker是一样的,只不过在Android中把日期和时间分开了而已。

l  ScrollView

滚动视图控件在.NET中也是分为两种,水平滚动和垂直滚动。功能一样都是在父窗体不够完全显示的时候通过滚动增加显示内容,但有些其他控件是自带滚动条的(比如TextBox控件)这样的话就不用人为的增加滚动条了。

l  ProgressBar

这个控件和.NET中的进度条用法是一致的,最大的不同是Android中有圆形的进度条,而.NET中貌似没有圆形的进度条。

l  SeekBar

拖动条控件更像是.NET中的TrackBar,通过拖动然后获取当前的值进行相关操作。

l  RatingBar

在.NET中貌似没有与其对应的控件。

l  ImageView

Android中的图片视图控件和.NET中的pictureBox非常类似,都是用于图片的显示没有太大的区别。

l  ImageSwitcher&Gallery以及GridView

这些个控件貌似就是为类似相册一类的应用设计的,用户体验非常棒。

image

image

在.NET中要实现这个效果恐怕需要不少代码,因为.NET中只提供了最基本的一些个图片的显示功能,但是在这里Android为我们封装好了,只要拿过来用就可以了。

l  Tab

标签在.NET中也有对应的控件,最大的差别在于Android需要为每个标签绑定(getTabHost)模板,而.NET中则直接用控件拖拽就可以了。

以上只是对Android自带的一些组件和.NET中的控件进行简单的对照,他们大同小异。通过对比对他们有个宏观的认识,具体详细用法还要参照Android的文档才行。

  高速PCB 的过孔设计(转)

摘要:在高速PCB 设计中,过孔设计是一个重要因素,它由孔、孔周围的焊盘区和POWER 层隔离区组成,通常分为盲孔、埋孔和通孔三类。在PCB 设计过程中通过对过孔的寄生电容和寄生电感分析,总结出高速PCB 过孔设计中的一些注意事项。
关键词:过孔;寄生电容;寄生电感;非穿导孔技术
  目前高速PCB 的设计在通信、计算机、图形图像处理等领域应用广泛,所有高科技附加值的电子产品设计都在追求低功耗、低电磁辐射、高可靠性、小型化、轻型化等特点,为了达到以上目标,在高速PCB 设计中,过孔设计是一个重要因素。
1、过孔
  过孔是多层PCB 设计中的一个重要因素,一个过孔主要由三部分组成,一是;二是孔周围的焊盘区;三是POWER 层隔离区。过孔的工艺过程是在过孔的孔壁圆柱面上用化学沉积的方法镀上一层金属,用以连通中间各层需要连通的铜箔,而过孔的上下两面做成普通的焊盘形状,可直接与上下两面的线路相通,也可不连。过孔可以起到电气连接,固定或定位器件的作用。过孔示意图如图1 所示。

过孔一般又分为三类:盲孔、埋孔和通孔
盲孔,指位于印刷线路板的顶层和底层表面,具有一定深度,用于表层线路和下面的内层线路的连接,孔的深度与孔径通常不超过一定的比率。
埋孔,指位于印刷线路板内层的连接孔,它不会延伸到线路板的表面。
  盲孔与埋孔两类孔都位于线路板的内层,层压前利用通孔成型工艺完成,在过孔形成过程中可能还会重叠做好几个内层。
通孔,这种孔穿过整个线路板,可用于实现内部互连或作为元件的安装定位孔。由于通孔在工艺上更易于实现,成本较低,所以一般印制电路板均使用通孔。过孔的分类如图2 所示。

2、过孔的寄生电容
  过孔本身存在着对地的寄生电容,若过孔在铺地层上的隔离孔直径为D2,过孔焊盘的直径为D1,PCB的厚度为T,板基材介电常数为ε,则过孔的寄生电容大小近似于:
C =1.41εTD1/(D2-D1)
    过孔的寄生电容会给电路造成的主要影响是延长了信号的上升时间,降低了电路的速度,电容值越小则影响越小。
3、过孔的寄生电感
  过孔本身就存在寄生电感,在高速数字电路的设计中,过孔的寄生电感带来的危害往往大于寄生电容的影响。过孔的寄生串联电感会削弱旁路电容的作用,减弱整个电源系统的滤波效用。若L指过孔的电感,h是过孔的长度,d是中心钻孔的直径,
过孔的寄生电感近似于:
L=5.08h[ln(4h/d)+1]
  从式中可以看出,过孔的直径对电感的影响较小,而对电感影响最大的是过孔的长度。
4、非穿导孔技术
非穿导孔包含盲孔埋孔
  在非穿导孔技术中,盲孔和埋孔的应用,可以极大地降低PCB的尺寸和质量,减少层数,提高电磁兼容性,增加电子产品特色,降低成本,同时也会使得设计工作更加简便快捷。在传统PCB设计和加工中,通孔会带来许多问题。首先它们占居大量的有效空间,其次大量的通孔密集一处也对多层PCB内层走线造成巨大障碍,这些通孔占去走线所需的空间,它们密集地穿过电源与地线层的表面,还会破坏电源地线层的阻抗特性,使电源地线层失效。且常规的机械法钻孔将是采用非穿导孔技术工作量的20倍。
  在PCB设计中,虽然焊盘、过孔的尺寸已逐渐减小,但如果板层厚度不按比例下降,将会导致通孔的纵横比增大,通孔的纵横比增大会降低可靠性。随着先进的激光打孔技术、等离子干腐蚀技术的成熟,应用非贯穿的小盲孔和小埋孔成为可能,若这些非穿导孔的孔直径为0.3mm,所带来的寄生参数是原先常规孔的1/10左右,提高了PCB的可靠性。
  由于采用非穿导孔技术,使得PCB上大的过孔会很少,因而可以为走线提供更多的空间。剩余空间可以用作大面积屏蔽用途,以改进EMI/RFI性能。同时更多的剩余空间还可以用于内层对器件和关键网线进行部分屏蔽,使其具有最佳电气性能。采用非穿导孔,可以更方便地进行器件引脚扇出,使得高密度引脚器件(如BGA 封装器件)很容易布线,缩短连线长度,满足高速电路时序要求。
5、普通PCB 中的过孔选择
  在普通PCB 设计中,过孔的寄生电容和寄生电感对PCB 设计的影响较小,对1-4层PCB 设计,一般选用0.36mm/0.61mm/1.02mm(钻孔/ 焊盘/POWER 隔离区)的过孔较好,一些特殊要求的信号线(如电源线、地线、时钟线等)可选用0.41mm/0.81mm/1.32mm 的过孔,也可根据实际选用其余尺寸的过孔。
6、高速PCB 中的过孔设计
  通过上面对过孔寄生特性的分析,我们可以看到,在高速PCB 设计中,看似简单的过孔往往也会给电路的设计带来很大的负面效应。为了减小过孔的寄生效应带来的不利影响,在设计中可以尽量做到:
(1)选择合理的过孔尺寸。对于多层一般密度的PCB 设计来说,选用0.25mm/0.51mm/0.91mm(钻孔/ 焊盘/ POWER 隔离区)的过孔较好;对于一些高密度的PCB 也可以使用0.20mm/0.46mm/0.86mm 的过孔,也可以尝试非穿导孔;对于电源或地线的过孔则可以考虑使用较大尺寸,以减小阻抗;
(2)POWER 隔离区越大越好,考虑PCB 上的过孔密度,一般为D1=D2+0.41
(3)PCB 上的信号走线尽量不换层,也就是说尽量减少过孔;
(4)使用较的PCB 有利于减小过孔的两种寄生参数;
(5)电源和地的管脚要就近过孔,过孔和管脚之间的引线越短越好,因为它们会导致电感的增加。同时电源和地的引线要尽可能粗,以减少阻抗;
(6)在信号换层的过孔附近放置一些接地过孔,以便为信号提供短距离回路。
  当然,在设计时还需具体问题具体分析。从成本和信号质量两方面综合考虑,在高速PCB 设计时,设计者总是希望过孔越小越好,这样板上可以留有更多的布线空间,此外,过孔越小,其自身的寄生电容也越小,更适合用于高速电路。在高密度PCB设计中,采用非穿导孔以及过孔尺寸的减小同时带来了成本的增加,而且过孔的尺寸不可能无限制地减小,它受到PCB 厂家钻孔和电镀等工艺技术的限制,在高速PCB 的过孔设计中应给以均衡考虑。
**************************我是分割线*********************************
PCB设计中过孔的概念和分类 作者:mhpcbsix
过孔(via)是多层PCB的重要组成部分之一,钻孔的费用通常占PCB制板费用的30%到40%。简单的说来,PCB上的每一个孔都可以称之为过孔。
从作用上看,过孔可以分成两类:一是用作各层间的电气连接;二是用作器件的固定或定位。
从工艺制程上来说,这些过孔一般又分为三类,即盲孔(blind via)埋孔(buried via)通孔(through via)盲孔位于印刷线路板的顶层和底层表面,具有一定深度,用于表层线路和下面的内层线路的连接,孔的深度通常不超过一定的比率(孔径)。埋孔是指位于印刷线路板内层的连接孔,它不会延伸到线路板的表面。上述两类孔都位于线路板的内层,层压前利用通孔成型工艺完成,在过孔形成过程中可能还会重叠做好几个内层。第三种称为通孔,这种孔穿过整个线路板,可用于实现内部互连或作为元件的安装定位孔。由于通孔在工艺上更易于实现,成本较低,所以绝大部分印刷电路板均使用它,而不用另外两种过孔。
从设计的角度来看,一个过孔主要由两个部分组成,一是中间的钻孔(drill hole),二是钻孔周围的焊盘区,小决定了过孔的大小。很显然,在高速,高密度的PCB设计时,设计者总是希望过孔越小越好,这样板上可以留有更多的布线空间,此外,过孔越小,其自身的寄生电容也越小,更适合用于高速电路。但孔尺寸的减小同时带来了成本的增加,而且过孔的尺寸不可能无限制的减小,它受到钻孔(drill)和电镀(plating)等工艺技术的限制:孔越小,钻孔需花费的时间越长,也越容易偏离中心位置;且当孔的深度超过钻孔直径的6倍时,就无法保证孔壁能均匀镀铜。比如,如果一块正常的6层PCB板的厚度(通孔深度)为50Mil,那么,一般条件下PCB厂家能提供的钻孔直径最小只能达到8Mil。随着激光钻孔技术的发展,钻孔的尺寸也可以越来越小,一般直径小于等于6Mils的过孔,我们就称为微孔。在HDI(高密度互连结构)设计中经常使用到微孔,微孔技术可以允许过孔直接打在焊盘上(Via-in-pad),这大大提高了电路性能,节约了布线空间。过孔在传输线上表现为阻抗不连续的断点,会造成信号的反射。一般过孔的等效阻抗比传输线低12%左右,比如50欧姆的传输线在经过过孔时阻抗会减小6欧姆(具体和过孔的尺寸,板厚也有关,不是绝对减小)。但过孔因为阻抗不连续而造成的反射其实是微乎其微的,其反射系数仅为:(44-50)/(44+50)=-0.06,过孔产生的问题更多的集中于寄生电容和电感的影响。

  j2se 数组的创建

The JavaTM Virtual Machine Specification Second Edition
5.3.3 Creating Array Classes
The following steps are used to create the array class C denoted by N using class loader L. Class loader L may be either the bootstrap class loader or a user-defined class loader.
If L has already been recorded as an initiating loader of an array class with the same component type as N, that class is C, and no array class creation is necessary. Otherwise, the following steps are performed to create C:

If the component type is a reference type, the algorithm of this section (§5.3) is applied recursively using class loader L in order to load and thereby create the component type of C.

The Java virtual machine creates a new array class with the indicated component type and number of dimensions. If the component type is a reference type, C is marked as having been defined by the defining class loader of the component type. Otherwise, C is marked as having been defined by the bootstrap class loader. In any case, the Java virtual machine then records that L is an initiating loader for C (§5.3.4). If the component type is a reference type, the accessibility of the array class is determined by the accessibility of its component type. Otherwise, the accessibility of the array class is public.
http://java.sun.com/docs/books/jvms/second_edition/html/ConstantPool.doc.html#79473

1.类加载器检查数组类是否已经创建了。没有,则需要创建数组类。否则,就无需创建了。
2.如果数组元素是引用类型,那么类加载器会先加载数组类。
3.JVM根据元素类型和维度,创建相应的数组类。     (解释:数组类由维度和定义类型所决定,即维度不同类型相同则不属于同一个类,维度相同类型相同(即使长度不一样)才是同一个类,(注意:长度不是这个类的成员变量,虽然看上去很像,我们可以通过反射的机制检查下))

1.为什么获取数组的长度用.length(成员变量的形式),而获取String的长度用.length()(成员方法的形式)     class loader加载完数组类后,都是调用 arraylength,对于String本身是一个新的不同于数组类的对象,暴露的length()方式也是arraylength的调用
2.数组对象的类是什么?  不是java.util.Arrays,首先需要明确和这个没有关系      数组类由维度和定义类型所决定,即维度不同类型相同则不属于同一个类,维度相同类型相同(即使长度不一样)才是同一个类,(注意:长度不是这个类的成员变量,虽然看上去很像,通过反射的机制检查下)....这个类是一个非法命名类,估计是为了避免和其他自定义类产生冲突,java.lang.Class  550行中有描述
3.JVM没有为数组类生成length这个成员变量,那么Array.length这样的语法如何通过编译执行的?需要阅读字节码

int[] xxx = new int[1];
Class clazz = xxx.getClass();
//class [I      没有任何package的非法类名
//数组的类名由若干个'['和数组元素类型的内部名称组成,'['的数目 代表了数组的维度
System.out.println(xxx.getClass().getName());
System.out.println(clazz.getDeclaredFields().length);
System.out.println(clazz.getDeclaredMethods().length);
System.out.println(clazz.getDeclaredConstructors().length);
System.out.println(clazz.getDeclaredAnnotations().length);
System.out.println(clazz.getDeclaredClasses().length);
System.out.println(clazz.getSuperclass());

[I
0
0
0
0
0
class java.lang.Object

public class Test {
public static void main(String[] args) {
int ab[] = new int[3]; int ii = ab.length;
}
}

public static void main(java.lang.String[]);
  Code:
   Stack=1, Locals=3, Args_size=1
   0:   iconst_3   //将int型常量3压入操作数栈
   1:   newarray int  //常量3出栈,初始化维度为1个int数值,引用压栈
   3:   astore_1   //引用出栈,保存索引到1位置(即将数组引用赋值给ab)
   4:   aload_1    //将ab压栈(ab.length调用)
   5:   arraylength  //ab出栈,获取数组长度(具体长度获取由jvm获取),将数组长度压栈
   6:   istore_2   //变量存贮数组长度到索引2位置
   7:   return
  LineNumberTable:
   line 3: 0
   line 4: 7

}

编译器也可以对Array.length()这样的语法做特殊处理,直接编译成arraylength指令。这样的话,我们就可 以使用方法调用的风格获取数组的长度了,这样看起来貌似也更加OO一点。那为什么不使用Array.length()的语法呢?也许是开发Java的那帮 天才对.length有所偏爱,或者抛硬币拍脑袋随便决定的吧。 形式不重要,重要的是我们明白了背后的机理。

java要比c/c++中的数组更安全,Java使用特定的指令访问数组的元素,这些指令都会对数组的长度(arraylenth)进行检查,java.lang.ArrayIndexOutOfBoundsException

汇编书籍推荐< >王爽

  Android周学习Step By Step(7)--Activity简介

Activity可以算是Android开发者遇到最频繁,也是最基本的模块之一。在Android的程序当中,Activity一般代表手机屏幕的一屏。如果把手机比作一个浏览器,那么Activity就相当于一个网页。在Activity当中,我们可以添加一些Button元素,或者Check box当。可以看到Activity之间可以进行互相跳转,例如,按下一个Button按钮后,可能会跳转到其他的Activity。和网页跳转稍微有些不一样的是,Activity之间的跳转有可能返回值,例如,从Activity A跳转到Activity B,那么当Activity B运行结束的时候,可能会给Activity A一个返回值。这样做在很多时候是相当方便了。

当打开一个新的屏幕时,之前一个屏幕会被置为暂停状态,并且压入历史堆栈中。用户可以通过回退操作返回到以前打开过的屏幕。我们可以选择性的一处一些没有必要保留的屏幕,应为Android会把每个应用的开始到当前的每个屏幕保存在堆栈中。

Activity是由Android系统进行维护的,它也有自己的生命周期,即它的一个产生、运行、销毁的一个周期……了解Activity的生命周期对程序的设计编写是非常有益的。

---Android 开发与实战

image

1、onCreate()

当Activity创建时被调用。

该函数在Acitvity生命周期中只被调用一次。

拥有一个参数,或者为null,或者是通过函数onSaveInstanceState()预先保存的状态信息。

2、onStart()

在Activity即将显示给用户时被调用。

3、onResume()

当Activity可以与用户交互时被调用。

如果需要播放音乐或者动画,该函数最佳。

4、onPause()

当Activity将要进入后台时被调用。

通常是一个新的Activity启动并显示时,这时需要保存程序持久化数据,比如正在编辑的数据记录。

5、onStop()

当Activity不在可见并且在一段时间内不会需要时调用。

如果内存紧张,该函数可能永远不会调用,系统会直接结束掉进程。

6、onRestart()

当Activity由Stop状态重新转为可见状态时被调用。

7、onDestroy()

当Activity被销毁前被调用。

内存紧张时,该函数可能永远不会被调用,系统会直接结束掉进程。

  PHP date与gmdate的区别及如何修改PHP的默认时区

PHP中的时间有2个格式化函数:date()和gmdate(),在官方的文档中的描述为:

date — 格式化一个本地时间/日期

gmdate — 格式化一个 GMT/UTC 日期/时间,返回的是格林威治标准时(GMT)。

举个例子,我们现在所在的时区是+8,那么服务器运行以下脚本返回的时间应该是这样的:

当前时间假定是2007-03-14 12:15:27

echo date(‘Y-m-d H:i:s’, time()); 输出为:2007-03-14 12:15:27

echo gmdate(‘Y-m-d H:i:s’, time()); 输出为:2007-03-14 04:15:27

但是这只是在Linux+Apache下运行PHP所得的结果,如果在Windows下运行,则2个函数返回都是:2007-03-14 04:15:27。

所以,我们应该给一个兼容性的写法,统一使用gmdate,并手工设置当前时区,写法改进如下:

echo gmdate(‘Y-m-d H:i:s’, time() + 3600 * 8);

这样不管在Linux+Apache下还是Windows下都得到了正确的结果,当然这样写还有一个好处,当网站是面向全世界的时候,那么网站用户只要设置所在的时区,程序自动根据用户设置的时区进行时间计算,数据库中信息发布时间只存当前的time()所生成的时间,那么在中国+8时区看到的发布时间是:2007-03-14 12:15:27,那么在欧洲+2时区用户看到这个信息的发布时间是:2007-03-14 06:15:27,这样信息的时间就全部对应正确了。

====================================================

修改PHP的默认时区

   每个地区都有自己的本地时间,在网上以及无线电通信中,时间的转换问题就显得格外突出。整个地球分为二十四个时区,每个时区都有自己的本地时间。在国际无线电或网络通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC,Universal Time Coordinated),是由世界时间标准设定的全球标准时间。UTC原先也被称为格林威治标准时间(GMT,Greenwich Mean Time),都与英国伦敦的本地时间相同。

PHP默认的时区设置是UTC时间,而北京正好位于时区的东八区,领先UTC八个小时。所以在使用PHP中像time()等获取当前时间的函数时,得到的时间总是不对,表现是和北京时间相差八个小时。如果希望正确的显示北京时间,就需要修改默认的时区设置,可以通过以下两种方式完成。

如果使用的是独立的服务器,有权限修改配置文件,设置时区就可以通过修改php.ini中的date.timezone属性完成。我们可以将这个属性的值设置为”Asia/Shang”、”Asia/Chongqing”、”Etc/GMT-8″或PRC等中的一个,再在PHP脚本中获取的当前时间就是北京时间。修改PHP的配置文件如下所示:

date.timezone = Etc/GMT-8       
//在配置文件中设置默认时区为东8区(北京时间)

如果您使用的是共享服务器,没有权限修改配置文件php.ini,并且PHP版本又在5.1.0以上,也可以在输出时间之前调用date_default_timezone_set()函数设置时区。该函数需要提供一个时区标识符作为参数,和配置文件中date.timezone属性的值相同。该函数的使用如下所示:

date_default_timezone_set(‘PRC’);          
//在输出时间之前设置时区,PRC为中华人民共和国 echo date(‘Y-m-d H:i:s’, time());        
//输出的当前时间为北京时间

测试:

代码

date_default_timezone_set(‘Etc/GMT’);     
//在输出时间之前设置时区,Etc/GMT为时间标准时间
echo(time()); 
echo(‘
’);
echo date(‘Y-m-d H:i:s’, time());        
echo(‘
’);
echo gmdate (“Y-m-d H:i:s”,  time());
echo(‘
’);

date_default_timezone_set(‘PRC’);     
//在输出时间之前设置时区,PRC为中华人民共和国 
echo(time()); 
echo(‘
’);
echo date(‘Y-m-d H:i:s’, time());        
echo(‘
’);
echo gmdate (“Y-m-d H:i:s”,  time());

?>

结果:

1276257131
2010-06-11 11:52:11
2010-06-11 11:52:11
1276257131
2010-06-11 19:52:11
2010-06-11 11:52:11

结论:

time() :标准时间戳

  指返回自从 Unix 纪元(格林威治时间 1970 年 1 月 1 日 00:00:00)到当前时间(指的是当前GMT标准时间)的秒数,它的值跟php系统设置的时区无关
date():返回的是当前 GMT标准时间的本地化时间的“自定义格式”时间,跟php系统设置的时区有关。

gmdate():返回的是当前 GMT标准时间的“自定义格式”时间,跟php系统设置的时区无关。

=====================================================

unix时间戳:指的是当前(GMT标准)时间离unix纪元时间(1970-01-01 00:00:00)的秒数;

代码

date_default_timezone_set(‘Etc/GMT’);     
//在输出时间之前设置时区,Etc/GMT为时间标准时间
echo(strtotime(’1970-01-01 08:00:00′));

echo(‘
’);
date_default_timezone_set(‘PRC’);     
//在输出时间之前设置时区,PRC为中华人民共和国

echo(strtotime(’1970-01-01 08:00:00′));

?>

测试结果:

28800
0

strtotime(a):当前时间的GMT标准时间的unix时间戳,如果当前php系统的设置的时区不是GMT标准时区,则在应用strtotime(a)时,系统会自动把时间a折算成相应的GMT标准时间,然后计算这个时间的unix时间戳。跟php系统设置的时区有关

  Android周学习Step By Step(8)--Intent之启动新的Activity

Intent的官方定义:An intent is an abstract description of an operation to be performed。一个Intent就是一次对将要执行的操作的抽象描述。

l  启动一个特定的Activity,代码如下:

   1:  Intent intent=new Intent(CurrentActivity.this,OtherActivity.class);
   2:  startActivity (intent);

其中CurrentActivity是当前的Activity,OtherActivity是要启动的那个Activity,这就类似于窗体之间的跳转,只不过和.NET不同的是指明了谁在新“窗体”之前(或者说谁产生了新“窗体”)。

l  启动一个未指明的Activity,代码如下:

   1:  Intent intent=new Intent(Intent.ACTION_DIAL,Uri.parse("tel:115-1345"));
   2:  startActivity(intent);

以上代码没有指明要启动那个Activity只是把要启动的那个Activity的描述放在了Intent中,让系统去查找符合这个描述的Activity,然后启动并执行。

l  处理一个Activity的返回值,界面设计以及代码如下:

ActivityMain:

image
   1:  package com.eoeAndroid.activity;
   2:  import android.app.Activity;
   3:  import android.content.Intent;
   4:  import android.net.Uri;
   5:  import android.os.Bundle;
   6:  import android.view.View;
   7:  import android.view.View.OnClickListener;
   8:  import android.widget.Button;
   9:  public class ActivityMain extends Activity
  10:  {
  11:      OnClickListener listener1=null;
  12:      OnClickListener listener2=null;
  13:      Button button1;
  14:      Button button2;
  15:      static final int REQUEST_CODE=1;
  16:      @Override
  17:      public void onCreate(Bundle savedInstanceState)
  18:      {
  19:          super.onCreate(savedInstanceState);
  20:          listener1=new OnClickListener()
  21:          {            
  22:              @Override
  23:              public void onClick(View v)
  24:              {
  25:                  Intent intent1=new Intent(ActivityMain.this,Activity1.class);
  26:                  intent1.putExtra("activityMain", "数据来自activityMain");
  27:                  startActivityForResult(intent1, REQUEST_CODE);
  28:              }
  29:          };        
  30:          listener2 =new OnClickListener()
  31:          {            
  32:              @Override
  33:              public void onClick(View v)
  34:              {
  35:                  setTitle("这是在ActivityMain");
  36:                  Intent intent2=new Intent(ActivityMain.this,Activity2.class);
  37:                  startActivity(intent2);
  38:              }
  39:          };
  40:          setContentView(R.layout.main);
  41:          button1=(Button)findViewById(R.id.button1);
  42:          button1.setOnClickListener(listener1);
  43:          button2=(Button)findViewById(R.id.button2);
  44:          button2.setOnClickListener(listener2);
  45:          setTitle("ActivityMain");
  46:      }
  47:      @Override
  48:      protected void onActivityResult(int requestCode,int resuleCode,Intent data)
  49:      {
  50:          if (requestCode==REQUEST_CODE)
  51:          {
  52:              if (resuleCode==RESULT_CANCELED)
  53:                  setTitle("取消");
  54:              else if (resuleCode==RESULT_OK)
  55:              {
  56:                  String temp=null;
  57:                  Bundle extras=data.getExtras();
  58:                  if (extras!=null)
  59:                  {
  60:                      temp=extras.getString("stroe");
  61:                  }
  62:                  setTitle(temp);            
  63:              }        
  64:          }
  65:      }
  66:  }

Activity1:

image

   1:  package com.eoeAndroid.activity;
   2:  import android.app.Activity;
   3:  import android.content.Intent;
   4:  import android.os.Bundle;
   5:  import android.view.View;
   6:  import android.view.View.OnClickListener;
   7:  import android.widget.Button;
   8:  public class Activity1 extends Activity {
   9:      OnClickListener listener1 = null;
  10:      Button button1;
  11:      /** Called when the activity is first created. */
  12:      @Override
  13:      public void onCreate(Bundle savedInstanceState) {
  14:          super.onCreate(savedInstanceState);
  15:          setContentView(R.layout.activity1);
  16:          listener1 = new OnClickListener() {
  17:              public void onClick(View v) {
  18:                  Bundle bundle = new Bundle();
  19:                  bundle.putString("store", "数据来自Activity1");
  20:                  Intent mIntent = new Intent();
  21:                  mIntent.putExtras(bundle);
  22:                  setResult(RESULT_OK, mIntent);
  23:                  finish();
  24:              }
  25:          };
  26:          button1 = (Button) findViewById(R.id.button3);
  27:          button1.setOnClickListener(listener1);
  28:          String data=null;
  29:           Bundle extras = getIntent().getExtras();
  30:              if (extras != null) {
  31:                   data = extras.getString("activityMain");
  32:              }
  33:          setTitle("现在是在Activity1里:"+data);
  34:      }
  35:  }

Activity2:

image
   1:  package com.eoeAndroid.activity;
   2:  import android.app.Activity;
   3:  import android.os.Bundle;
   4:  import android.view.View;
   5:  import android.view.View.OnClickListener;
   6:  import android.widget.Button;
   7:  public class Activity2 extends Activity {
   8:      OnClickListener listener = null;
   9:      Button button;
  10:      /** Called when the activity is first created. */
  11:      @Override
  12:      public void onCreate(Bundle savedInstanceState) {
  13:          super.onCreate(savedInstanceState);
  14:          setContentView(R.layout.activity2);
  15:          listener = new OnClickListener() {
  16:              public void onClick(View v) {
  17:                  finish();
  18:              }
  19:          };
  20:          button = (Button) findViewById(R.id.button4);
  21:          button.setOnClickListener(listener);
  22:          setTitle("现在是在Activity2里");
  23:      }
  24:  }

  Android周学习Step By Step(9)--Intent之广播(完)

通过broadcast Intent机制可以将一个Intent发送给任何对这个Intent感兴趣的BroadcastReceiver。

image

 

通过new Intent(ACTION_1)新建Action为ACTION_1的Intent。

通过sendBroadcast(intent)将这个intent进行广播。代码如下

ActivityMain代码:

   1:  package com.eoeandroid.broadcastReceiver;
   2:  import android.app.NotificationManager;
   3:  import android.content.BroadcastReceiver;
   4:  import android.content.Context;
   5:  import android.content.Intent;
   6:  public class EoeAndroidReceiver2 extends BroadcastReceiver {
   7:      Context context;
   8:      @Override
   9:      public void onReceive(Context context, Intent intent) {
  10:          // TODO Auto-generated method stub
  11:          this.context = context;
  12:          DeleteNotification();
  13:      }
  14:      private void DeleteNotification() {        
  15:          NotificationManager notificationManager = (NotificationManager) context
  16:                  .getSystemService(android.content.Context.NOTIFICATION_SERVICE);
  17:          notificationManager.cancel(EoeAndroidReceiver1.NOTIFICATION_ID);
  18:      
  19:      }
  20:  }

当单击MENU的第一项后,程序执行到EoeAndroidReceiver1,通过OnRecievie方法将一个Notification显示在了状态栏中。其中showNotification()负责显示一个Notification。代码如下:

EoeAndroidReceiver1代码

   1:  package com.eoeandroid.broadcastReceiver;
   2:  import android.app.Notification;
   3:  import android.app.NotificationManager;
   4:  import android.app.PendingIntent;
   5:  import android.content.BroadcastReceiver;
   6:  import android.content.Context;
   7:  import android.content.Intent;
   8:  public class EoeAndroidReceiver1 extends BroadcastReceiver {
   9:      Context context;
  10:      public static int NOTIFICATION_ID = 21321;
  11:      @Override
  12:      public void onReceive(Context context, Intent intent) {
  13:          this.context = context;
  14:          showNotification();
  15:      }
  16:      private void showNotification() {
  17:          NotificationManager notificationManager = (NotificationManager) context
  18:                  .getSystemService(android.content.Context.NOTIFICATION_SERVICE);
  19:          Notification notification = new Notification(R.drawable.icon,
  20:                  "在EoeAndroidReceiver1中", System.currentTimeMillis());
  21:          PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
  22:                  new Intent(context, ActivityMain.class), 0);
  23:          notification.setLatestEventInfo(context, "在EoeAndroidReceiver1中", null,
  24:                  contentIntent);
  25:          notificationManager.notify(NOTIFICATION_ID, notification);
  26:      }
  27:  }

单击第二个按钮后程序开始广播,这个广播被EoeAndroidReceiver2截获然后开始执行EoeAndroidReceiver2里的OnReceive方法,其中DeleteNotification()方法负责将刚才生成的Notification从状态栏中删除。代码如下:

EoeAndroidReceiver2代码

   1:  package com.eoeandroid.broadcastReceiver;
   2:  import android.app.NotificationManager;
   3:  import android.content.BroadcastReceiver;
   4:  import android.content.Context;
   5:  import android.content.Intent;
   6:  public class EoeAndroidReceiver2 extends BroadcastReceiver {
   7:      Context context;
   8:      @Override
   9:      public void onReceive(Context context, Intent intent) {
  10:          // TODO Auto-generated method stub
  11:          this.context = context;
  12:          DeleteNotification();
  13:      }
  14:      private void DeleteNotification() {        
  15:          NotificationManager notificationManager = (NotificationManager) context
  16:                  .getSystemService(android.content.Context.NOTIFICATION_SERVICE);
  17:          notificationManager.cancel(EoeAndroidReceiver1.NOTIFICATION_ID);    
  18:      }
  19:  }

Android学习到此告一段落,经过一周的学习(严格的说学习的时间外加写论文的时间是一周,总结、写博客的时间远远大于一周)只能对Android有个大致的了解,还有很多方面由于时间的原因不能够深入学习,甚至很多都没有接触到,以后有时间再学习吧。

Android,有缘我们还会再见!