美国奥巴马总统下令,所有政府单位要开放 API 出来

笔者观察到即使是先进者美国,也在奥巴马的支持下,通过了类kickstarter群众募资平台的法源基础。进一步给予已经蓬勃发展的第三方支付,线上创新金流法律上支持的力道。这预计也将创造数以百万计的工作机会,鼓励更多的创新。

奥巴马发备忘录,要政府开放API

这两天,又看到奥巴马的新动作–他直接下了一个备忘录给联邦政府各级单位,限期要各单位在十二个月内完成美国政府资讯长发布的二十一世纪数字政府战略的规范,三个月内要看到每个单位放上网页,公开说明实行进度。

这个二十一世纪数位政府战略规定了什么呢?笔者简要如下:

1. 政府应将开放资料,内容与Web API为基本任务。尤其是既有高价值的资料,应尽速透过Web API开放。

2. 建立共用平台,节省政府支出。(例如未整合采购与开发的各单位做法)。

3. 以民众为导向,用现代技术及行动科技提供更好的数位服务。

4. 用新科技提升安全与隐私。

关于为什么要这么做的整体战略思维,欧巴马在备忘录中说得很清楚:

Ultimately, this Strategy will ensure that agencies use emerging technologies to serve the public as effectively as possible. As a Government, and as a trusted provider of services, we must never forget who our customers are — the American people.

这个战略将确保所有单位尽可能有效率地采用新兴科技来服务群众。身为政府,也是人们信任的服务提供者,我们永远不能忘记我们客户是— 美国人民。

每次看到美国的做法,不论是民间还是政府,都有耳目一新的感觉。嘴里说人民至上,动作上也能见到实际吻合的配套,令人激赏。

政府单位拥有的资料,不也就是我们大家的资料吗?开放除了能造就民间更多的创新外,也能便民,透过正确地实行数字策略,还可能促成政府营运成本的降低。

insert into 后获得自动插入的id(select @@identity)

当运行完插入语句后,执行select   @@identity就可得到自动生成的id

如果是sql server 最好用select SCOPE_IDENTITY() as id
因为@@identity全局的

同类还有IDENT_CURRENT(‘table’)

IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值

SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。

从程序员到经理的历练

作为一个技术人员,想成为管理者并不难,只要你坚持这个工作。在国内的氛围中,当技术人员,在经验、能力、年龄达到一定层面后,公司都会想办法提升他的职位,进入管理岗位,如项目经理、研发主管、技术部经理、技术总监等等。很少会有公司能允许一个三十多岁的程序员存在,即便他做着技术工作,也会给他安个什么大牌的头衔。

当进入管理岗位后,痛苦就开始了。专业技术人员与技术管理人员,虽然都是技术性工作,前者侧重于技术,后则侧重于管理,工作性质已经有了明显区别。相较于技术,管理工作更复杂。管理工作是面对人,技术工作是面对电脑,人比电脑复杂得太多了。没有学不会的技术,管理则需要岁月历炼。管理的英语单词“Manage”,就是男人与岁月的合成词。

我也是做技术出身的,我经历过的痛苦,或许可以帮助大家快速成长。

国王的命运

管理性工作,不管你做的有多好,总会有人给你提意见,总会有人不满意。相比较而言,做技术性工作,真是太幸福了,不用操心,专心至致,不会有人打扰,做起来也顺手,工作成果总会受到大家的赞誉。

当我在做经理后,总是忍不住回过头来写代码,一方面是因为管理能力不足,任务分解不出去,一方面是对他们做的工作不满意,最主要的还是,写代码的感觉实在太幸福了。虽然我现在也写代码,但目的已经不是为了体验幸福,而是觉得作为一个技术方面的管理者,不应该丢弃技术,工作重点已经不是程序编写。

在那个阶段,我非常迷茫,不知道怎么才能把工作做好,团队成员整天提意见,公司领导责备多于鼓励,我的自信心跌到了冰点,甚至有想过放弃管理工作。但说实话,又有些不甘心,也有些中国人官本位思想,毕竟是混到个小领导了,真是再下来了,多没有面子。

在这个过程中,我看了很多管理的书、管理的讲座,始终不得要领。有一次在书店闲逛,看到《沉思录》随手拿起来翻看,我知道这本书,之前中央领导向社会推荐读物,温家宝推荐了《沉思录》。也就是这一翻,看到了将会影响我终生的一句话(一点儿也不夸张)。

“国王的命运,就是行善事而遭恶誉”。

我毫不犹豫的买下这本书,如果一本书有一句话值得拥有,这几十块钱就花值了。

前一段,有个朋友刚当了项目经理,很痛苦,在QQ上向我诉苦。我说,我送你一句话,“国王的命运,就是行善事而遭恶誉”,管理者就要有王的胸怀,不仅要敢于担当,还要有胸襟承受非议,相信自己是对的,做就是了。几秒钟后,他的QQ签名变成了这句话;几个月后,说他感觉自己已经可以胜任了。

在我的管理工作中,每次提拔主管时,我都会赠送这句话给他们。我不担心他们的技术能力,我担心他们的心理承受能力。其实这句话,有些类似于“走自己路,让别人去说吧”的意思,但是它更有气魄。

《梓人传》

当刚开始做管理工作时,任务分解是一个让我非常头痛的问题。

如何能够合理的把任务分配给团队成员,让他们轻松完成,而且又能保证质量,这对我来说,实在是个难以解决的问题。

往往是,任务分解不出去,自己埋头干活,团队进度没时间把控;要么就是团队成员做完工作,不合要求,自己伸手把任务又重做一遍。很显然,我做得更好,更快。看着程序员们崇拜的目光,也有点小小的成就感。可到头来,自己累得要死,并没有落好,还净落埋怨。

在这个过程中,我着重学习了项目管理,后来还考了一个信息系统的项目管理师。我很清楚,自己应该高屋建棱,我还自己总结了一句话,“低姿态工作,高视角审视”。事实上,我根本不知道该如何去“高视角”。虽然书上讲了很多方法,但操作起来总是不能令自己满意。

很偶然的,我在图书馆看杂书,看到柳宗元的《梓人传》,有些感触,后来上班时无事时,在网又搜这篇文章,仔细的阅读,还看了很多人的点评。虽然没有醍醐灌顶吧,但也受用良多。

例如文中所述:

“彼将舍其艺,而专其心智,能知体要欤”

“不炫能,不矜名,不亲小劳,不侵众宫,日与天下英才讨论其大经。如梓人之善运众工,而不伐艺。”

它说的这些原则,我全违背了,思路不正确,方法再正确也没有用。

法、术、势

为了规范开发行为,我制订了很多制度,因为从我自身管理思想上来说,我是崇尚制度化管理的。我学习了很多开发方法、开发模式,研习了很久,但任何一种方法,应用到研发工作中,都是一堆问题。当有人质疑时,我总会引章据典的予以辩论,说得对方无可反驳,其实我也清楚,他是“口服心不服”。

我不知道自己哪里出了问题,我相信自己学习的东西都是正确的。为什么就实施不起来呢?

前几天和一个朋友还在聊这类事情,他也很迷茫,我告诉他,其实我也经历过这个阶段,我建议你有时间看看《韩非子》。我当时就是认真的看了《韩非子》(其实也没有看完了,至少比以前看得仔细了)之后,才有了较大改观。

《韩非子》是法家思想经典之作。我们总是以为,法家思想提倡“法”,就是制度化管理。事实上,法家的精髓不仅是“法”,而是包括:法、术、势。

法,是制度,是条例,也是规范,它有一定的约束性,但它不是为了约束,而是为了规范。

术,是手段,是技巧,例如,当发现别人做得不符合要求时,不要批评,而应该说:“你做得很好,但我认为,还有很大的提升空间。”

势,是权力,是职责,例如,韩非子中说,桀纣虽然很坏,但如果不是坐在王的位置上,也不能危害天下;尧舜虽然贤明,如果不是坐在王的位置上,也不能造福天下。

我们评论法家思想,总会说“法太苛”,并举秦朝失败的案例,事实上,至从秦朝之后,无论哪个朝代都在延用法家思想,也就是所谓的“儒表法里”(表面是儒,其实是法)。到了唐朝,则大范围照搬秦制,为了不让别人说闲话,柳宗元说了句名言为唐朝开脱,“秦之失,失于政,非失于制”,就是说秦朝的制度是非常好的,是他们管理上出了问题。

应用到我们管理中,制度化是必须的,其次还要考虑管理手段问题,不能完全依靠制度。最后,就是把合适的人放到合适的位置,明确其职责。

关于“法”,我们可以学习别人,甚至照搬。而“术”,则需要因地制异,需要管理艺术。而“势”,则需要因人而异、量才适用,它不仅需要高超的管理艺术,还要大胆授权、敢于放权。

后记

前一段想写篇文章,叫《保持精神世界的生物多样性》,后来起了个头,一直没有往下写。技术人员是专家,管理人员是杂家,多读书对自己会有好处的,只要是好书,管它哪个方面的,只管去读,总会有用到的时候。

国外的管理书籍,都比较通俗易懂,但咱们中华文明的瑰宝,还有很多营养需要我们吸取。

Windows启动过程

当你启动计算机之后,windows的启动过程就开始执行了。下面是详细步骤:

1 BIOS执行一些初始系统检查,并读取磁盘的第零簇的内容。第零簇内容有一个特殊的称谓 – 操作系统主引导扇区 MBR(Master Boot Record)。

2 MBR保护两部分:

1 系统启动代码 (共有446 bytes)

2 分区表入口(16 bytes colored entries in the bottom)

3 根据系统代码,我们可以找到系统所有的分区,并找到系统启动分区。如果分区表入口的第一个字节值为0x80,那么可以确认这就是分区表入口,它也被称为根分区或系统卷 . MBR中有四个分区入口,是不是意味着我们只能有四个系统驱动?这也就意味着我们还得有扩展分区入口.

4 除了分区得到确认外,还能够确认系统启动分区的第一个磁盘簇。具体的值存储在启动代码的8th-12th字节。上图中这个值为3f 00 00 00,按照小端计算,其值为0000003f,即第63rd扇区。

5 启动入口第63rd扇区又称为启动扇区,从这里开始可以读取到文件读取根磁盘(c:)的文件ntldr(NT loader)。

6 有时候,系统启动中提示错误信息“NTLDR is missing”,正是因为读取不到这个文件。 读取这个文件的信息后,windows开始把内核文件加载到内存中。先确定页面大小,然后读取ntdetect.com,根据BIOS设置进行硬件检测,最后读取boot.ini以显示启动菜单,即提示有哪些操作系统。

 

如果系统上次关闭时是睡眠状态,它将读取hiberfil.sys,以恢复睡眠前的数据。它还会加载启动驱动。操作系统的核心功能依赖这些驱动,下表列出了初始的系统驱:

然后再设置CPU的寄存器的值,等等。这些任务完成后,ntldr把系统控制权交给进程ntoskrnl.exe (NT OS Kernel),它的使命就完成了。

6  NTOSKRNL是主要负责启动以下OS服务(此时你能看到的Windows XP的进度条显示过程)。

第0阶段初始下列服务

内存管理服务

流程管理服务(系统进程被创建的第一个内核模式进程)

对象管理器服务

即插即用管理服务

安全参考监视器服务

第1阶段的初始化

初始化HAL(硬件抽象层)

多处理器支持

调度支持(本质上取决于处理器架构)

电源管理

 

7  系统将控制权转交给 smss.exe (Session Manager Subsystem)。它也是windows启动后的第一个用户态进程。

1 smss进程执行下列任务:

1 检查磁盘(disc check):

2 挂起一些文件。文件被挂起后,os内核就暂时没有了一些文件的控制权限,一些应用软件可能重写操作系统内核相关的部分文件,改写完毕后,它就可能提示你重启系统。

3 创建页面文件(pagefile.sys):

 

 

2  从WindowsSystem32Config*.*.读取系统注册表

3 最后系统创建两个进程(Client Server Run-Time Subsystem), Winlogon.exe.

1 Csrss.exe负责系统的用户态,并向程序提供windows API接口

2   Winlogon.exe负责启动进程(services.exe),并创建sass.exe (Local Security and Authentication Subsystem),以对用户登录系统时进行验证。

3   Winlogon将把登录窗口呈献给用户,用户登录成功后,它将家在explorer.exe,并根据当前用户的配置信息显示桌面。

虽然本文没有具体的描述启动过程的每个细节,但是大的方面本文都有说明,以做到疏而不漏。欢迎读者批评指正。

参考文章

1 Windows Internals 4th Ed By Mark E. Russinovich, David A. Solomon

http://www.yale.edu/pclt/BOOT/PARTITIO.HTM

http://mirror.href.com/thestarman/asm/mbr/NTLDR.htm

说明

本文遵循协议 The Code Project Open License (CPOL)

written by: Vineel Kumar Reddy Kovvuri

url:   http://www.codeproject.com/Articles/129874/The-Birth-of-Windows-Desktop

柯达破产

美国华盛顿邮报报道,几乎是摄影同义词的柯达公司濒临破产,引来摄影爱好者的一片惋惜,他们纷纷在社交网站上发表评论表达自己的感伤。一条评论这样写道:“让人悲伤的是,我们的孩子有一天可能不明白何谓‘柯达时刻’”。尽管如此,柯达的破产却已进入倒计时。

在我很小很小的时候,家里开照相馆,每天的玩具就是这些圆滚滚的柯达胶卷,没想到以后连这个也只能是回忆了。

做自己

我们各自心中都有某些不愿意摒弃的东西,即使这个东西使我们痛苦得要死。我们就是这样,就像古老的凯尔特传说中的荆棘鸟,泣血而啼,呕出了血淋淋的心而死。咱们自己制造了自己的荆棘,而且从来不计算其代价,我们所做的一切就是忍受痛苦的煎熬,并且告诉自己这非常值得。–麦卡洛《荆棘鸟》

JSP表单中的form传值

不同JSP页面之间、不同action之间,以及JSP中form与其对应的action之间,JSP中form与其不对应的action之间如何传值。本文将介绍JSP表单中的form传值。

页面间链接和数据传递的三种方式

(1)通过JSP表单form将数据提交到下一个页面;

(2)通过JSP表单链接将数据提交到下一个页面;

(3)通过JSP表单Session将数据提交到后续页面,session是一次会话只要浏览器不关闭就不会关闭会话,一般默认保存30分钟可以根据自己的需要更改 。

例:

  1. 01.html
  2. <html>
  3. <head>
  4. <title>利用表单传递数据</title>
  5. </head>
  6. <body>
  7. <h3>利用表单传递数据</h3>
  8. <form name=“form1” method=“post” action=“02.jsp”>
  9. <p>你的姓名:
  10.      <input type=“text” name=“name”>
  11. </p>
  12. <p>你的爱好:
  13.      <input type=“text” name=“hobby”>
  14. </p>
  15. <p>你所从事的行业:
  16.      <select name=“work”>
  17.            <option></option> <!–默认为空,从下拉菜单中选择–>
  18.         <option value=“学生”>学生</option>
  19.         <option value=“IT业”>IT业</option>
  20.         <option value=“商业”>商业</option>
  21.         <option value=“制造业”>制造业</option>
  22.         <option value=“服务业”>服务业</option>
  23.      </select>
  24. </p>
  25. <p>
  26.      <input type=“Submit” value=“提交”>
  27.      <input type=“Reset” value=“重置”>
  28. </p>
  29. </form>
  30. </body>
  31. </html>
  32. 02.jsp
  33. <html>
  34. <head>
  35. <title>从表单中获取数据</title>
  36. </head>
  37. <%@ page contentType=“text/html;charset=GB2312”%>
  38. <body>
  39. <h3>从表单中获取数据</h3>
  40. <p>
  41. <%
  42.    //从表单中获取数据
  43.    String namerequest.getParameter(“name”);
  44.    String hobby=request.getParameter(“hobby”);
  45.    String workrequest.getParameter(“work”);
  46.    //验证”名字(name)”的长度是否符合要求
  47.    if(name.length()<3||name.length()>8)
  48.       out.println(“你输入的名字长度不符合要求”);
  49.    else
  50.    {
  51.       out.println(“你的姓名是:”+name+”<br>“);
  52.         out.println(“你的爱好是:”+hobby+”<br>“);
  53.       out.println(“你所从事的工作是:”+work+”<br>“);
  54.       //将”名字(name)”保存到session对象中,让后续页面(下个页面、下下个页面、……)引用
  55.       session.setAttribute(“name”,name);
  56.    }
  57. %>
  58. <br>
  59. <!–将”爱好(hobby)”和”工作(work)”以链接的形式传递给下个页面–>
  60. <a href=“03.jsp?hobby=<%=hobby%>&work=<%=work%>”>提交</a>
  61. </p>
  62. <hr>
  63. <p><font size=“2”>*将”名字(name)”保存到session对象中,让后续页面(下个页面、下下个页面、……)引用</font></p>
  64. <p><font size=“2”>*将”爱好(hobby)”和”工作(work)”以链接的形式递给下个页面</font></p>
  65. </body>
  66. </html>
  67. 3.jsp
  68. <html>
  69. <head>
  70. <title>从session对象中获取”名字(name)”的值;从链接中获取”爱好(hobby)”和”工作(work)”</title>
  71. </head>
  72. <%@ page contentType=“text/html;charset=GB2312”%>
  73. <SCRIPT language=“JavaScript”>
  74.      function submit1()
  75.         {
  76.          document.forms[“form1”].action=“04.jsp”;
  77.         document.form1.submit();
  78.         }
  79.         function edit1()
  80.         {
  81.           document.forms[“form1”].action=“01.jsp”;
  82.        document.form1.submit();
  83.         }
  84. </SCRIPT>
  85. <%@ page contentType=“text/html;charset=GB2312” %>
  86. <body>
  87. <h3>从session对象中获取”名字(name)”的值;从链接中获取”爱好(hobby)”和”工作(work)”</h3>
  88. <%
  89.    String name=(String)session.getAttribute(“name”);
  90.    String hobby=request.getParameter(“hobby”);
  91.    String workrequest.getParameter(“work”);
  92.    out.println(“你的姓名是:”+name+”<br>“);
  93.    out.println(“你的爱好是:”+hobby+”<br>“);
  94.    out.println(“你所从事的工作是:”+work+”<br>“);
  95.    //将”爱好(hobby)”和”工作(work)”保存在session对象中
  96.    session.setAttribute(“hobby”,hobby);
  97.   session.setAttribute(“work”,work);
  98. %>
  99. <form name=“form1” method=“post”>
  100. <input type=“hidden” name=“name” value=“<%=name%>”>
  101. <input type=“hidden” name=“hobby” value=“<%=hobby%>”>
  102. <input type=“hidden” name=“work” value=“<%=work%>”>
  103. <p><h3>确认提交这些信息吗?</h3></p>
  104. <input type=“Button” name=“Submit” value=“确认” onClick=“javascript:submit1()”>
  105. <input type=“Button” name=“Edit” value=“修改” onClick=“javascript:edit1()”>
  106. </form>
  107. <hr>
  108. <p><font size=“2”>*将”爱好(hobby)”和”工作(work)”保存在session对象中,让后续页面(下个页面、下下个页面、……)引用</font></p>
  109. <p><font size=“2”>*由于”名字(name)”在上个页面中已经保存在session对象中了,这里没必要再次保存</font></p>
  110. </body>
  111. </html>
  112. 4.jsp
  113. <html>
  114. <head>
  115. <title>从sessoin对象中获取数据</title>
  116. </head>
  117. <%@ page contentType=“text/html;charset=GB2312” %>
  118. <body>
  119. <h3>从sessoin对象中获取数据</h3>
  120. <%
  121.    //从sessoin对象中获取数据
  122.    String name=(String)session.getAttribute(“name”);
  123.    String work=(String)session.getAttribute(“work”);
  124.    String hobby=(String)session.getAttribute(“hobby”);
  125. %>
  126. <p>
  127. <font color=“#0000FF”><%=name%></font>,你好!你所从事的工作是<font color=“#0000FF”><%=work%></font>,在业余时间喜欢<font color=“#0000FF”><%=hobby%></font>
  128. </p>
  129. </body>
  130. </html>
  131. 1.jsp
  132. <html>
  133. <head>
  134. <title>利用表单传递数据</title>
  135. </head>
  136. <%@ page contentType=“text/html;charset=GB2312” %>
  137. <%
  138.    String name=request.getParameter(“name”);
  139.    String hobby=request.getParameter(“hobby”);
  140.    String work=new String(request.getParameter(“work”).getBytes(“ISO8859_1″),”GBK”);
  141. %>
  142. <body>
  143. <h3>利用表单传递数据</h3>
  144. <form name=“form1” method=“post” action=“02.jsp”>
  145. <p>你的姓名:
  146.      <input type=“text” name=“name” value=“<%=name%>”>
  147. </p>
  148. <p>你的爱好:
  149.      <input type=“text” name=“hobby” value=“<%=hobby%>”>
  150. </p>
  151. <p>你所从事的行业:
  152.      <select name=“work”>
  153.           <%if(work.equals(“学生”)){%>
  154.         <option value=“学生” selected>学生</option>
  155.         <option value=“IT业”>IT业</option>
  156.         <option value=“商业”>商业</option>
  157.         <option value=“制造业”>制造业</option>
  158.         <option value=“服务业”>服务业</option>
  159.           <%}else if(work.equals(“IT业”)){%>
  160.         <option value=“学生”>学生</option>
  161.         <option value=“IT业” selected>IT业</option>
  162.         <option value=“商业”>商业</option>
  163.         <option value=“制造业”>制造业</option>
  164.         <option value=“服务业”>服务业</option>
  165.           <%}else if(work.equals(“商业”)){%>
  166.         <option value=“学生”>学生</option>
  167.         <option value=“IT业”>IT业</option>
  168.         <option value=“商业” selected>商业</option>
  169.         <option value=“制造业”>制造业</option>
  170.         <option value=“服务业”>服务业</option>
  171.           <%}else if(work.equals(“制造业”)){%>
  172.         <option value=“学生”>学生</option>
  173.         <option value=“IT业”>IT业</option>
  174.         <option value=“商业”>商业</option>
  175.        <option value=“制造业” selected>制造业</option>
  176.         <option value=“服务业”>服务业</option>
  177.               <%}else if(work.equals(“服务业”)){%>
  178.         <option value=“学生”>学生</option>
  179.        <option value=“IT业”>IT业</option>
  180.         <option value=“商业”>商业</option>
  181.         <option value=“制造业”>制造业</option>
  182.         <option value=“服务业” selected>服务业</option>
  183.               <%}%>
  184.      </select>
  185. </p>
  186. <p>
  187.      <input type=“Submit” value=“提交”>
  188.      <input type=“Reset” value=“重置”>
  189. </p>
  190. </form>
  191. </body>
  192. </html>

菜鸟的Android 学习笔记 之四大组件总结

Activity :

activity是Android提供的界面,所有和用户交互的事情都发生在这个类。

Activity的生命周期:

OnCreate() 创建的时候会调用这个方法 设置这个Activity设置布局控件,初始化数据等。

OnStart() 当控件被我们看到的时候,就调用OnStart()方法 在OnCreate()之后 或者OnStop()后调用。

OnResume() 当重新获得用户焦点的时候就调用这个方法。

onPause() 保护现场用的 可能被另外一个透明的Dialog窗口覆盖,失去焦点,但是他仍然和窗口管理器保持连接,系统可以继续保护Activity的内部状态。

onStop()  停止和OnStart()对应,注意OnStop()和OnPause()不一样的地方是他是完全被另外一个窗口覆灭。也就是失去焦点而且不可见。

onDestory()销毁

创建一个Activity的要点

1.一个Activity就是一个类,并且这个类要继承Activity

2.需要复写onCreate方法

3.要在Androidmanifest.xml进行配置(四大组件都要进行配置)

4.为Activity添加必要的控件

在一个Activity启动另外一个Activity

Intent intent=new Intent(CurrentActivity.this,OtherActivity.class) //OtherActivity也要在AndroidManifest.xml中注册。

startActivity(intent);

Intent还可以放入各种数据 传入下一个Activity。

可以用下面的方式接收传过来的数据:

还可以用Bundel的方法发送数据。Bundel就像一个承载数据的List<> 里面可以放各种数据。但是他的key只能是string类型的,放入Intent的方式也是intent.putExtra(bundle);

Service

Service在什么时候会用到呢?比如说音乐程序的时候,需要后台运行,但是又看不到界面,此时就用到Service。这也是Service和Activity最大的不同。

Service 分类:

本地Service和远程Service。

本地Service是同一个进程内Service彼此之间共同的内存区域。

远程Service是同一个系统内的不同进程之间访问(注意是同一个系统内,不是不同系统)。

Service生命周期:

onCreate()->onStart()->onDestory() 三个方法 继承的时候如果要用到记得重新写下。

创建一个Service要点:

1.  创建一个类,要继承Service

2.  要在androidManifest.xml中进行配置

3.  在Activity中配置调用它

Broadcast Receiver

在android中可以通过broadcast告诉其他程序发生了什么事情。比如电源,比如短信,比如信号。

Broadcast Receiver相比于其他组件比较特别的地方是他还提供了一种所谓的热注册,就是不用写在androidManifest.xml中,直接用

registerReceiver(Broadcastreceiver,IntentFilter)注册。然后用unregisterReceiver()消除注册。

一些常用的Action:

ACTION_CALL                                              activity                        启动一个电话.
ACTION_EDIT                                               activity                       显示用户编辑的数据.
ACTION_MAIN                                               activity                      作为Task中第一个

Activity启动
ACTION_SYNC                                             activity                         同步手机与数据服务器上的数据.
ACTION_BATTERY_LOW                           broadcast receiver       电池电量过低警告.
ACTION_HEADSET_PLUG                        broadcast receiver        插拔耳机警告
ACTION_SCREEN_ON                               broadcast receiver        屏幕变亮警告.
ACTION_TIMEZONE_CHANGED              broadcast receiver         改变时区警告.

Content Provider

这个组件比较复杂

ContentProvider可以支持多个应用的数据共享。可以用来操作音频,视频,图片,私人通讯录等等。但是要记得获取适当的读取权限。当然也可以用来公开自己的数据。(难道Content Provider是全局变量?整个手机的程序都能访问得到?)

创建Content Provider 要点:

1.  创建一个Content Provider首先要继承ContentProvider类。

2.       在androidManifest中配置

3.       在Activity类中调用insert() query()可以调用

 

实际上所有的contentprovider用户都不能直接访问contentprovider实例,只能通过ContentResolver的中间代理。而要得到ContentResolver的实例可以用Activity的getContentResolver方法。如下

可以自己去调用ContentProvider相应的方法。

 

Uri使用方法:来自http://blog.sina.com.cn/s/blog_5688414b0100xagp.html

为系统的每一个资源给其一个名字,比方说通话记录。

1、每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。

2、Android所提供的ContentProvider都存放在android.provider包中。 将其分为A,B,C,D 4个部分:

 

A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;”content://”

B:URI 的标识,它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的 类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称;”content://hx.android.text.myprovider”

C:路径,不知道是不是路径,通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就ok了

“content://hx.android.text.myprovider/tablename”

D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部;”content://hx.android.text.myprovider/tablename/#” #表示数据id

 

 

数据模型:

ContentProvider返回的数据结构是Cursor类似于DataSet,每一个contentprovider 定义一个唯一公开的URI,用于指定他的数据集。一个contentprovider可以包含多个数据集。这样就需要多个URI与之对应。URI的开头必须是 “content://”

表示这个Uri指定一个contentprovider。

 

增删查改:

 

查询

Cursor cursor = getContentResolver().query(

ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,null,null);

得到查询数据:

 

Cursor.moveToNext()读取到下一条 类似于C#的sdr.read()

条件发在哪里?

可以放在

修改:

 

插入:

数据放在values内,values是键值对。如下:

ContentValues values = new ContentValues();

values.put(People.NAME, “Abraham Lincoln”);

Uri uri = getContentResolver().insert(People.CONTENT_URI, values);

 

错误应该很多 求指点….刚刚开始的Android之旅。。。

设计模式之Factory

工厂模式定义:提供创建对象的接口.

为何使用?
工厂模式是我们最常用的模式了,著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。

为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。

我们以类Sample为例, 如果我们要创建Sample的实例对象:

Sample sample=new Sample();

可是,实际情况是,通常我们都要在创建sample实例时做点初始化的工作,比如赋值 查询数据库等。

首先,我们想到的是,可以使用Sample的构造函数,这样生成实例就写成:

Sample sample=new Sample(参数);

但是,如果创建sample实例时所做的初始化工作不是象赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那你的代码很难看了(就需要Refactor重整)。

为什么说代码很难看,初学者可能没有这种感觉,我们分析如下,初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有背于Java面向对象的原则,面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。

在本例中,首先,我们需要将创建实例的工作与使用实例的工作分开, 也就是说,让创建实例所需要的大量初始化工作从Sample的构造函数中分离出去。

这时我们就需要Factory工厂模式来生成对象了,不能再用上面简单new Sample(参数)。还有,如果Sample有个继承如MySample, 按照面向接口编程,我们需要将Sample抽象成一个接口.现在Sample是接口,有两个子类MySample 和HisSample .我们要实例化他们时,如下:

Sample mysample=new MySample();
Sample hissample=new HisSample();

随着项目的深入,Sample可能还会”生出很多儿子出来”, 那么我们要对这些儿子一个个实例化,更糟糕的是,可能还要对以前的代码进行修改:加入后来生出儿子的实例.这在传统程序中是无法避免的.

但如果你一开始就有意识使用了工厂模式,这些麻烦就没有了.

工厂方法
你会建立一个专门生产Sample实例的工厂:

public class Factory{

public static Sample creator(int which){

//getClass 产生Sample 一般可使用动态类装载装入类。
if (which==1)
return new SampleA();
else if (which==2)
return new SampleB();

}

}

那么在你的程序中,如果要实例化Sample时.就使用

Sample sampleA=Factory.creator(1);

这样,在整个就不涉及到Sample的具体子类,达到封装效果,也就减少错误修改的机会,这个原理可以用很通俗的话来比喻:就是具体事情做得越多,越容易范错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,范错误可能性就越少.好象我们从编程序中也能悟出人生道理?呵呵.

使用工厂方法 要注意几个角色,首先你要定义产品接口,如上面的Sample,产品接口下有Sample接口的实现类,如SampleA,其次要有一个factory类,用来生成产品Sample,如下图,最右边是生产的对象Sample:

进一步稍微复杂一点,就是在工厂类上进行拓展,工厂类也有继承它的实现类concreteFactory了

抽象工厂
工厂模式中有: 工厂方法(Factory Method) 抽象工厂(Abstract Factory).

这两个模式区别在于需要创建对象的复杂程度上。如果我们创建对象的方法变得复杂了,如上面工厂方法中是创建一个对象Sample,如果我们还有新的产品接口Sample2.

这里假设:Sample有两个concrete类SampleA和SamleB,而Sample2也有两个concrete类Sample2A和SampleB2

那么,我们就将上例中Factory变成抽象类,将共同部分封装在抽象类中,不同部分使用子类实现,下面就是将上例中的Factory拓展成抽象工厂:

public abstract class Factory{

public abstract Sample creator();

public abstract Sample2 creator(String name);

}

public class SimpleFactory extends Factory{

public Sample creator(){
………
return new SampleA
}

public Sample2 creator(String name){
………
return new Sample2A
}

}

public class BombFactory extends Factory{

public Sample creator(){
……
return new SampleB
}

public Sample2 creator(String name){
……
return new Sample2B
}

}

 

从上面看到两个工厂各自生产出一套Sample和Sample2,也许你会疑问,为什么我不可以使用两个工厂方法来分别生产Sample和Sample2?

抽象工厂还有另外一个关键要点,是因为 SimpleFactory内,生产Sample和生产Sample2的方法之间有一定联系,所以才要将这两个方法捆绑在一个类中,这个工厂类有其本身特征,也许制造过程是统一的,比如:制造工艺比较简单,所以名称叫SimpleFactory。

在实际应用中,工厂方法用得比较多一些,而且是和动态类装入器组合在一起应用。

举例

我们以Jive的ForumFactory为例,这个例子在前面的Singleton模式中我们讨论过,现在再讨论其工厂模式:

public abstract class ForumFactory {

private static Object initLock = new Object();
private static String className = “com.jivesoftware.forum.database.DbForumFactory”;
private static ForumFactory factory = null;

public static ForumFactory getInstance(Authorization authorization) {
//If no valid authorization passed in, return null.
if (authorization == null) {
return null;
}
//以下使用了Singleton 单态模式
if (factory == null) {
synchronized(initLock) {
if (factory == null) {
……

try {
//动态转载类
Class c = Class.forName(className);
factory = (ForumFactory)c.newInstance();
}
catch (Exception e) {
return null;
}
}
}
}

//Now, 返回 proxy.用来限制授权对forum的访问
return new ForumFactoryProxy(authorization, factory,
factory.getPermissions(authorization));
}

//真正创建forum的方法由继承forumfactory的子类去完成.
public abstract Forum createForum(String name, String description)
throws UnauthorizedException, ForumAlreadyExistsException;

….

}

 

 

因为现在的Jive是通过数据库系统存放论坛帖子等内容数据,如果希望更改为通过文件系统实现,这个工厂方法ForumFactory就提供了提供动态接口:

private static String className = “com.jivesoftware.forum.database.DbForumFactory”;

你可以使用自己开发的创建forum的方法代替com.jivesoftware.forum.database.DbForumFactory就可以.

在上面的一段代码中一共用了三种模式,除了工厂模式外,还有Singleton单态模式,以及proxy模式,proxy模式主要用来授权用户对forum的访问,因为访问forum有两种人:一个是注册用户 一个是游客guest,那么那么相应的权限就不一样,而且这个权限是贯穿整个系统的,因此建立一个proxy,类似网关的概念,可以很好的达到这个效果.

看看Java宠物店中的CatalogDAOFactory:

public class CatalogDAOFactory { 

/**

* 本方法制定一个特别的子类来实现DAO模式。
* 具体子类定义是在J2EE的部署描述器中。
*/

public static CatalogDAO getDAO() throws CatalogDAOSysException {

CatalogDAO catDao = null;

try {

InitialContext ic = new InitialContext();
//动态装入CATALOG_DAO_CLASS
//可以定义自己的CATALOG_DAO_CLASS,从而在无需变更太多代码
//的前提下,完成系统的巨大变更。

String className =(String) ic.lookup(JNDINames.CATALOG_DAO_CLASS);

catDao = (CatalogDAO) Class.forName(className).newInstance();

} catch (NamingException ne) {

throw new CatalogDAOSysException(”
CatalogDAOFactory.getDAO: NamingException while
getting DAO type : n” + ne.getMessage());

} catch (Exception se) {

throw new CatalogDAOSysException(”
CatalogDAOFactory.getDAO: Exception while getting
DAO type : n” + se.getMessage());

}

return catDao;

}

}

 

CatalogDAOFactory是典型的工厂方法,catDao是通过动态类装入器className获得CatalogDAOFactory具体实现子类,这个实现子类在Java宠物店是用来操作catalog数据库,用户可以根据数据库的类型不同,定制自己的具体实现子类,将自己的子类名给与CATALOG_DAO_CLASS变量就可以。

由此可见,工厂方法确实为系统结构提供了非常灵活强大的动态扩展机制,只要我们更换一下具体的工厂方法,系统其他地方无需一点变换,就有可能将系统功能进行改头换面的变化。

设计模式如何在具体项目中应用见《Java实用系统开发指南》