当前位置:文档之家› Android_SDK开发范例完整版

Android_SDK开发范例完整版

Android_SDK开发范例完整版
Android_SDK开发范例完整版

本文由kingwj6贡献

pdf文档可能在WAP端浏览体验不佳。建议您优先选择TXT,或下载源文件到本机查看。 Google Android SDK 开发范例大全

第二章:Android 初体验 Android 操作系统顶着 Google 与 Open Handset Alliance 的光环,让很多程序员在 Android 手机还没上市之前,就开始紧追着官方文档、Early SDK 版本更新,这是 IT 业界罕见的现象,因为大家都抱持着“不想输在起跑点上”的心态。这也是手机发展的历史中,第一次有机会让所有的程序员站在同一个起跑点开始,无论是 Java World 论坛、或是 Google 官方的 Developer Discussion Group 都见到相当热烈的讨论。从这一章开始,将对 Android 的程序架构、程序进入点、编译以及执行,进行一系列的导航,而本书规划之初,并非针对 Java 初学者或从未接触过程序设计的朋友所设计,故在这一章简要的 overview 当中,则以快速掌握开发条件、开发环境为目的,若你是第一次接触 Java 程序语言,或从未写过面向对象程序设计,建议你先学习 Java 语言,打好基础后,再回过头来进入本章。接下来的内容分成五个部分:安装 Android SDK、创建 Android 手机开发项目(Project)、了解 Android 程序的生命周期,初探可视化的开发工具,最后将应用程序部署到模拟器和 Android 手机上,为避免过于概念性的论述及篇幅的浪费,所有操作练习皆以步骤的方法描述,只要跟着操作即可上手,在体验完本章的内容之后,你就可以开始本书范例的学习之旅了。在开始之前,你需要先准备以下作业环境以及程序:必备项目 Microsoft Windows XP/Microsoft Windows Vista 操作系统或 Mac OS X 10.4.8 或更新的版本(硬件必须是 x86 的版本)或 Linux Android SDK 1.0r2 以上(本书所有范例皆以 Android SDK 1.1r1 为开发环境) Java Development Kit(JDK)v6.0 以上 Eclipse 开发 IDE 程序(本书所有范例皆以 eclipse-jee-ganymede-SR1-win32 版本为编译环境)自我检查(ˇ)

准备就绪之后,就可以前往 Android 官方网站(https://www.doczj.com/doc/937605361.html,/)下载 Android SDK,也可以到( https://www.doczj.com/doc/937605361.html,)去下载。

▲图 2-1 到 Android 官方网站下载 SDK 下载后的 Android SDK 为压缩文件,请将它解压缩到磁盘中,例如下面的文件夹: D:\SDK\android 而 Eclipse 编译 IDE 环境中,需安装 ADT(Android Development Tools) plug-in,此为 Android 的开发工具,启动Eclipse 后,请运行“Help—Software Updates>>Find and Install”,并按下“Add Site”输入ADT plug-in 网址后(如下),按下“Install”便开始自动下载安装:https://https://www.doczj.com/doc/937605361.html,/android/eclipse/

▲图 2-2 安装 ADT Plug-in 下载后,安装向导会显示两项必须安装的程序:Android Development Tools 与 Android Editors。

▲图 2-3 选择安装 Android 开发工具及编辑器

虽然 Android ADT 可以免费下载安装,但在使用上仍然有其局限性,跟一般应用程序许可条款的签署类似。

▲图 2-4 同意使用 Android 软件开发条款安装 ADT 所需的时间不长,也可以在后台运行,不会影响现有的操作系统程序。安装完毕后,需要重新启动 Eclipse,才能使用Android ADT。

▲图 2-5 可以在后台运行安装 ADT,并需要重新启动 Eclipse 至此 Android SDK 及ADT 已安装完毕,所有准备工作都已经就绪,随时可以开始建立 Android 项目。这一节将建立本书第一个 Android 项目,不过,在初次建立 Android 项目之前,需要设置 Android SDK 的路径,让 Eclipse 可以找到 Android SDK,先执行“Window—Preferences”。

▲图 2-6 运行 Eclipse 的 Preferences 设置功能点击“Android”的树状列表,单击“Browse”按钮,选择刚才解压的 Android SDK 的路径,而后按下“Apply”设置让 Eclipse

引用的 SDK 文件夹。

▲图 2-7 设置 Android Preferences 路径 Android SDK 的引用路径设置完成之后,就可以开始建立 Hello World 这个经典范例了;运行“File—New>>Project”建立新项目。

▲图 2-8 建立新的项目新建项目向导需要指定一种应用程序类型,故展开“Android”后,点击“Android Project”,按下“Next”按钮继续。

▲图 2-9 选择建立项目类型为 Android Project 新建 Android 项目需输入项目名称( Project name)、Package name、 Activity name 以及 Application name,最后按下“Finish”按钮,项目随即建立完成。

▲图 2-10

输入项目名称及 Package name 建立新项目

到目前为止,新建 Android 项目已经完成,而且这个新建立的程序也已经可以运行,运行的方法是在“Package Explorer”窗口里,点开刚建立好的“HelloWorld”项目文件夹,并在项目名称上单击鼠标右键,在功能菜单上运行“Run As>Android Application”功能。

▲图 2-11

运行“Run As—Android Application”功能

假若此时尚未将手机与计算机联机,那么 Eclpise 将打开默认的 Android 模拟器(Emulator),运行画面就如同真的手机开机一样,随着计算机硬件环境的不同,运行模拟器也会有不同的性能表现,开机之后,随即打开刚建立好的 Hello World 程序。

▲图 2-12

没写一行程序的 Hello World

要退出被启动的“Hello World”程序,可以按下手机模拟器上的退格键(Backspace)。

▲图 2-13

按下退格键离开程序,回到手机的桌面

虽然半行代码都没有写,但向导却帮忙写好了程序进入点、布局配置、字符串常数、应用程序访问权限等,除了可作为程序模板之外,也是 Android 手机程序的最佳学习范例。让我们回过头来看看刚才 Android 项目建立向导帮忙做了哪些工作,以此来了解 Android 应用程序的生命周期及其文件组成方式;首先,展开“Package Explorer”窗口里的“HelloWorld”项目名称,可以看见如下数据结构的文件: +HelloWorld +-src

+https://www.doczj.com/doc/937605361.html, +-HelloWorld.java +-R.java +-Android Library +-android.jar - D:\SDK\android +-assets +-res +-drawable +-icon.png +-layout +-main.xml +-values +-strings.xml +-AndroidManifest.xml 在展开的文件夹层中,“src”、“Android Library”、“assets”、“res”与“AndroidManifest.xml”同属一层,放置在“\src”里的为主程序、程序类(class);放置在“\res”里的为资源文件(Resource Files),如程序 ICON 图标、布局文件(\layout)与常数(\values)。以此 Hello World 程序为例,主程序为“HelloWorld.java”,其内容与一般 Java 程序格式相类似: package https://www.doczj.com/doc/937605361.html,; import android.app.Activity; import android.os.Bundle; public class HelloWorld extends Activity {

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/937605361.html,yout.main); } } 主程序里可看见 HelloWorld 类继承自 Activity 类,在类中重写了 onCreate() 方法,在方法内以 setContentView() 来设置这个 Acvitity 要显示的布局(https://www.doczj.com/doc/937605361.html,yout.main),使用布局配置“\layout\main.xml”,布局文件是以 XML 格式编写的,内容如下:

android:layout_height="wrap_content" android:text="@string/hello" /> 布局配置中设置了一个 TextView TAG,用以配置文本标签 Widget,其内部设置的android:text 属性,则是要显示的文字内容,引用“@string”里的 hello 字符串常数。查看“values/strings.xml”字符串常数设置如下: Hello World, HelloWorld HelloWorld 其中“hello”字符串变量的内容为“Hello World, HelloWorld”,这即是刚才看见的 Hello World 程序显示的文字内容了。 Android 应用程序有以下三种类型: l l l 前端 Activity (Foreground Activities)。后台服务(Background Services)。间隔执行 Activity (Intermittent Activities)。

前端 Activity 就如同这个 Hello World 一样,运行在手机前端程序中;后台服务可能是看不见的系统服务(System Service)、系统 Broadcast(广播信息)与 Receiver(广播信息)接收器);间隔执行 Activity 则类似如进程(Threading)、Notification Manager 等等。每一个项目都有一个“AndroidManifest.xml”设置文件,里头包含这个 Android 应用程序具有哪些 Activity、Service 或者 Receiver,先来看看 Hello World 制作好的“AndroidManifest.xml”设置文件的内容描述:

android:versionName="1.0.0"> 在 manifest 文件中有一个名为HelloWorld 的Activity,设置其intent-filter 的category android:name 为 "https://www.doczj.com/doc/937605361.html,UNCHER",写在 intent-filter 里是指定此Activity 为默认运行的主要 Activity,除了在 manifest 文件中手动设置之外,也可在Eclipse 右击项目名称,运行“Run As—Run Configurations”,设置 Launch Action:▲图 2-14

设置项目要执行的 Action 方式或 Activity

Activity 类的应用程序有其默认运行的方式,为了确保应用程序运行的优先级,理解Activity 在手机运行时的生命周期,及其可视性(Visible)周期。

▲图 2-15

Activity 自 onStop 之后,程序即可被关闭

以 Hello World 程序里继承自 Activitry 类开始,一旦程序被执行,即会照以上流程顺序进行,若需要在 Activity 程序里编写程序,默认常见的进入点为重写 onCreate (Activity)或 onStart(Service),重写的方式可通过 Eclipse 来选择,方法为将鼠标光标停在继承自 Activity 的空白处,单击鼠标右键展开菜单,点开执行“Source—Override/Implement Methods”功能。

▲图 2-16

执行“Source—Override/Implement Methods”功能

在重写于实现方法的对话框中,点开“Activity”树状列表,在其中找到了onCreate(Bundle)方法,勾选前方的选择项(CheckBox),再按下“OK”按钮即可。

▲图 2-17

选择要重写的方法,向导会自动在主程序中描述重写内容

最后,比较值得一提的是 onResume() 与 onPause(),这两个方法为 Activity 在onCreate 之后运行过程中的生命周期,当程序失去前端焦点、或者被关闭,就会触发Activity 的 onPause() 状态;当应用程序被再次唤醒,则会回到 onResume() 状态,故在编写与 User 互动的程序过程中,需注意 User 暂时离开 Activity(或前往不同的

Activity、不同的 Service)前,需要处理的工作都会摆在 onPause() 当中执行。以一个通过网络 FTP 下载 mp3 的 Activity 为例,

暂停下载工作可以写在 onPause 里,需要接续前一次的下载等处理,则由 onResume 负责。 Android 手机有着华丽的机身、流畅的执行速度,唯一欠缺的就是“具有视觉美感的 UI 设计员”,但自 Android SDK rc20a 一路发展到 1.0_r2, Open Handset Alliance 提供的ADT (Android Development Tools),终于有了预览界面的功能,只要点开项目的“res—layout”,双击 main.xml 运行“Android Layout Editor”,或在其上单击鼠标右键展开菜单单,执行“Open With—Android Layout Editor”。

▲图 2-18

单击 XML 布局配置文件,选择以 Android Layout Editor 编辑

Android Editor 的功能虽然阳春,但至少还算齐备,具有文字模式与 UI 配置模式可供切换,如下图的“Layout”与“main.xml”页签切换所示。

▲图 2-19

Android Layout Editor 具有文字模式与 UI 配置模式可供切换编辑

目前的 ADT 版本,虽然提供了预览接口功能,但没有提供类似 Microsoft Visual Studio 的拖拉界面组件开发工具,所以布局的配置虽然直观,但还是不

够自然,所幸,在 Google 还未完整推出 GUI 的拖拉工具之前,已有网友以 Java 写出了好用的可视化 GUI 布局拖拉工具程序:DroidDraw。 DroidDraw 目前是一个公开的 Google Code,除了可以在线免费下载(http://code.google .com/p/droiddraw/)使用到计算机端执行之外,也提供在线直接使用的版本(http://www https://www.doczj.com/doc/937605361.html,/);DroidDraw 同时还提供了源代码(Source Code),可供程序员自行参考或修改。

▲图 2-20

DroidDraw 提供了可视化拖拉组件的方式设计布局期待未来 Google 能将拖拉布局的功能纳入 Android Editor 当中,如此一来更能整合 Android SDK 以及开发环境的功能,且让我们拭目以待吧!要部署程序在模拟器上运行,在先前 Hello World 的程序已经看过了,在项目名称上单击右键执行 Android 应用程序即可,但事实上,要将 Android 程序,部署在手机环境中进行测试,方法也是相同的,同样调用“Run As—Android Application”的方式执行,不同的是,需要事先安装好 Android 的 USB Driver,并且通过 USB 联机至手机,在与手机联机的状况下,就可以让 Eclipse 在运行 Android 程序时,直接将程序部署于实机环境中执行。 Android USB 驱动程序是随着 Android SDK 所提供的,每一个版本的SDK 都可能有不同版本的 USB Driver Version,其存放在以下 Android SDK 解开后的参考位置,如: D:\SDK\android\usb_driver\ 安装的步骤是先将手机以 USB 与计算机连接,操作系统会找到名为 Android Phone 的设备,但是却在装置管理员当中无法正确被识别,如下所示。

▲图 2-21

操作系统找到名为 Android Phone 的装置,但无法正确被识别

接着画面会跳出添加硬件向导,选择“从列表或指定位置安装(高级)”来自行挑选驱动程序位置。

▲图 2-22

选择“从列表或指定位置安装”自己安装驱动程序

在“搜索和安装选项”的画面中,选择“不要搜索,我要自己选择要安装的驱动程序”选项,选择“显示所有设备”后,按下“下一步”。

▲图 2-23

选择不要搜索系统数据,改以自行挑选硬件的方式

利用浏览按钮选择复制源为 Android USB Driver 程序路径:

▲图 2-24

选择 Android SDK 里所附的 USB Driver

选择驱动程序后,于显示兼容硬件列表中选择“HTC Dream Composite ADB Interface”,程序将 Android 手机的 USB ADB Interface 安装完成。

▲图 2-25

安装 Android USB ADB Interface 完成

设备管理器会自动新增一项 ADB Interface 的项目,表示已经顺利安装了 Android 手机与计算机的联机。

▲图 2-26

顺利安装了 Android 手机与计算机的联机

安装完 ADB Interface 之后,暂时还无法通过 Eclipse 将 Android 项目程序部署至手机上,必须先将手机上的 USB 调试(Debug)模式打开,在手机上执行“应用程序设置—开发>>USB 调试”。

▲图 2-27

将手机的 USB 调式模式打开

在 Eclipse 执行项目时,若程序发现先前已打开的模拟器与手机同时并存,那么将会跳出 Device Chooser 的窗口让开发者选择要部署的设备,下图为选择 Android G1 手机之后,于 Console 里显示正确执行的 Log 纪录。

▲图 2-28

上图中的警告为开发使用的是 SDK 1.1 但手机是 SDK 1.0 的警告

部署程序到手机上测试是最适合的方法,因为许多功能皆需要手机才能进行测试,如WiFi 驱动程序、平衡感应器、电池剩余计量等等。看完了本章介绍的内容,相信各位已快速掌握了 Android SDK 的安装方法、 Eclipse 开发环境的设置、使用可视化布局开发工具,以及试写了一个 Android Hello World 的应用程序(咳~虽然一行程序都没写~),最后将程序部署于实机上运行,这是每一位 Android 程序员都必须快速掌握的重点,也是进入本书范例必须要具备的基本操作能力。接下来将是丰富精彩的范例系列,相信通过边学边操作,你将获得更多宝贵的实战经验,祝大家学习愉快!

第三章:用户人机界面

范例说明

前一章写了 Hello World 之后,一直觉得没有写半行代码对不起自己,所以在本章人机界面一开始,则延续 Hello Wolrd 的气势,进行与 TextView 文字标签的第一次接触。在此范例中,将会在 Layout 中创建 TextView 对象,并学会定义 res/values/strings.xml 里的字符串常数,最后通过 TextView 的 setText 方法,在预加载程序之初,更改 TextView 文字。

运行结果

▲图 3-1 认识 TextView.setText 更改默认 Layout 里定义的文本字符串

范例程序

src/irdc.ex03_01/EX03_01.java

主程序示范以 setText 方法,输出 String 类型的字符串变量。

package irdc.ex03_01; import android.app.Activity; import android.os.Bundle; /*必须引用widget.TextView 才能在程序里声明TextView 对象*/ import android.widget.TextView; public class EX03_01 extends Activity {

/*必须引用 widget.TextView 才能在程序里声明 TextView 对象*/ private TextView

mTextView01;

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

/* 载入main.xml Layout,此时myTextView01:text 为str_1 */ setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

/* 使用 findViewBtId 函数,利用 ID 找到该 TextView 对象 */ mTextView01 = (TextView) findViewById(R.id.myTextView01);

String str_2 = "欢迎来到Android 的TextView 世界……"; mTextView01.setText(str_2); } }

res/layout/main.xml

以 android:id 命名 TextView 的 ID 为 mTextView01;在较旧的版本写法与 1.0 的不同,请特别留意。

扩展学习

TextView 里的 setText 方法支持以下多态构造方法:

public final void setText(CharSequence text) public final void setText(int resid) public void setText(CharSequence text, TextView.BufferType type) public final void setText(int resid, TextView.BufferType type) public final void setText(char[] text, int start, int len)

在此,以最后 setText(char[] text, int start, int len) 为例,第一个参数为 char 数组作为输出依据,第二个参数为从哪一个元素索引开始选取,第三个参数则为要取出多少个元素,请看以下的例子:

char char_1[] = new char[5]; char_1[0] = 'D'; char_1[1] = 'a'; char_1[2] = 'v'; char_1[3] = 'i'; char_1[4] = 'd'; mTextView01.setText(char_1,1,3);

如上述程序所示,输出的结果是“avi”,因为从第 1 个元素索引开始,共取 3 个元素;最后则要提醒你,TextView.setTextView 不支持 HTML TAG 的输出,所以即便写成这样: mTextView01.setText("戴维的博客");

实际输出时,也就是纯文本而已,并不会作 HTML TAG 的转换。但若撇开 HTML TAG 之外(如“<”开头的标记),在 TextView 里加上了 android:autoLink="all",那么正文中若有网址(http://),是可以被显示的,以下这个范例就交给你自己实现看看。

xmlns:android="https://www.doczj.com/doc/937605361.html,/apk/res/android"

android:layout_width="fill_parent" android:layout_height="wrap_content" android:autoLink="all" android:text="请访问戴维的博客:http://shop.teac.idv.tw/MyBlog/" />

范例说明

在之前的范例运行结果,窗口的底色一律是“深黑色”,这是 SDK 默认的颜色,要更改Activity 里的窗口底色有许多方法,最简单的方法就是将颜色色码事先定义在 drawable 当中,

当程序 onCreate 创建的同时,加载预先定义的画面颜色。此范例程序的设计方式是在drawable 里指定 Layout 的背景色(BackGround)为白色,但这里的“白色”(颜色色码为

#FFFFFFFF)预先定义在 drawable 当中,当程序运行时,背景就会变为白色。这是指定Activity Layout 背景颜色最简单的方法,在范例最末,则将示范如何创建色彩板(color table),让 Android 手机程序可以像使用“常数”般直接取用,并反应在应用程序的运行阶段。

运行结果

▲图 3-2 使用 drawable 设置颜色常数,应用于程序运行时的结果

范例程序

src/irdc.ex03_02/EX03_02.java

程序继承自 Activity 类,并在重写 onCreate 创建之初,直接显示 https://www.doczj.com/doc/937605361.html,yout.main main.xml)(这个页面安排的布局配置。

package irdc.ex03_02; import android.app.Activity; import android.os.Bundle; public class EX03_02 extends Activity

{ /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/937605361.html,yout.main); } }

res/layout/main.xml

在页面布局上,使用了 2 个 TextView 对象,以及 2 个 EditText 对象,关键在于android: background="@drawable/white" 让程序背景变成了白色,而android:textColor="@drawable/ darkgray" 将TextView 里的文字颜色( textColor )设为灰色,当中“@drawable/white”及“@drawable/darkgray”的写法则是参考事先于 drawable 里定义好的颜色常数,将在res/values/color.xml 里看见颜色的定义描述。

android:id="@+id/widget28" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/str_id" android:textColor="@drawable/darkgray" android:layout_x="61px" android:layout_y="69px" >

android:layout_x="114px" android:layout_y="57px" >

扩展学习

事先将定义好的颜色代码(color code)以 drawable 的名称(name)存放于 resources 当中,这是开发 Android 程序的好习惯,正如同字符串常数一样,颜色也是可以事先定义好的。在本范例中学会了使用 drawable 的 resource 的定义方法:

color_value

定义好的 drawable name 常数,必须存放于 res/values 下面,作为资源取用,但定义好的背景颜色并非只能当作是“默认”颜色声明使用,在程序的事件里,是可以通过程序

来更改的,如以下程序所示:

Resources resources = getBaseContext().getResources(); Drawable HippoDrawable = resources.getDrawable(R.drawable.white);

TextView tv = (TextView)findViewByID(R.id.text); tv.setBackground(HippoDrawable);

范例说明

上一个范例通过 Drawable 来定义颜色常数,但实际设计中最常用的方法,则是使用程序控制 TextView 或其它对象的背景色(setBackgroundDrawable 方法)如判断对象被点击时,的背景色亮起、当失去焦点时,又恢复成原来的背景色等等。以下的范例,将扩展前一个范例的实现,预先在 Layout 当中设计好两个 TextView,并在 onCreate 同时,通过两种程序描述方法,实时更改原来 Layout 里 TextView 的背景色以及文字颜色,最后学会使用 Android 默认的颜色常数(graphics.Color)来更改文字的前景色。

运行结果

▲图3-3 通过setBackgroundDrawable 方法更改TextView 的背景色以及graphics.Color 更改前景色

范例程序

src/irdc.ex03_03/EX03_03.java

程序里新建两个类成员变量: mTextView01 与 mTextView02,这两个变量在 onCreate 之初,以 findViewById 方法使之初始化为 layout(main.xml)里的 TextView 对象。在当中使用了Resource 类以及Drawable 类,分别创建了resources 对象以及HippoDrawable 对象,并将前一个范例中所创建的 R.drawable.white 以getDrawable 方法加载,最后则调用了setBackgroundDrawable 来更改mTextView01 的文字底纹。更改 TextView 里的文字,则使用了 setText 方法。

在mTextView02 当中,使用了graphics.Color 里的颜色常数,接着,再利用setTextColor 更改文字的前景色。

package irdc.ex03_03; import android.app.Activity; import android.content.res.Resources; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.widget.TextView; public class EX03_03 extends Activity { private TextView mTextView01; private TextView mTextView02;

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

mTextView01 = (TextView) findViewById(R.id.myTextView01); mTextView01.setText("我是应用 Drawable 背景色的戴维文本。");

Resources resources = getBaseContext().getResources(); Drawable HippoDrawable = resources.getDrawable(R.drawable.white); mTextView01.setBackgroundDrawable(HippoDrawable);

mTextView02 = (TextView) findViewById(R.id.myTextView02);

/*下使用Color.MAGENTA 指定文本的颜色为紫红色*/ mTextView02.setTextColor(Color.MAGENTA); } }

扩展学习

Resources resources = getBaseContext().getResources(); Drawable HippoDrawable = resources.getDrawable(R.drawable.white);

上述这 2 行代码,在前一版本中的写法是这样的:

Resources.resources = getDrawable(R.drawable.solid_red); Drawable HippoDrawable = resources.getDrawable(R.drawable.white);

但是在 1.0 之后的版本, Resources 不再支持直接使用 .getDrawable 方法直接取用drawable,而必须先取得基类的Context 才行。此外,在程序里使用了Color.MAGENTA 让 TextView 里的文字变成了粉红色,事实上,在 Android 里还有以下 12 种常见的颜色:

Color.BLACK Color.BLUE Color.CYAN Color.DKGRAY

Color.GRAY Color.GREEN Color.LTGRAY Color.MAGENTA Color.RED Color.TRANSPARENT Color.WHITE Color.YELLOW

这些颜色常数是定义在 android.graphics.Color 里的:

类型 int int int int int int int int int int int int

常数 BLACK BLUE CYAN DKGRAY GRAY GREEN LTGRAY MAGENTA RED TRANSPARENT WHITE YELLOW

值 -16777216 -16776961 -16711681 -12303292 -7829368 -16711936 -3355444 -65281 -65536 0 -1 -256

色码0xff000000 0xff0000ff 0xff00ffff 0xff444444 0xff888888 0xff00ff00 0xffcccccc 0xffff00ff 0xffff0000 0x00000000 0xffffffff 0xffffff00 范例说明

从一开始自 Layout 里通过 Resource 初始化 TextView 的文字,到程序中动态更改TextView 文字,但要如何在代码里取得 Resource 的字符串呢?在 Android 里,确实是有些方法可以直接以 R.string.*直接转换 ID 为 String,不过,这样的数据类型转换是非常规甚至是不妥的,正确的方法是利用 Context.getString 方法来取得存放在 global 里的 Resource ID。以下这个范例将示范如何在程序运行时(runtime),通过 CharSequence 依据 Resource ID 取出字符串,并正确更改 TextView 的文字。

运行结果

▲图 3-4 通过 https://www.doczj.com/doc/937605361.html,ng.CharSequence 这个 Interface 来取得存放在 global 里的Resource ID

范例程序

src/irdc.ex03_04/EX03_04.java

主程序的差异主要是在更改 mTextView02 的文字时(setText 方法)合并了 str_3 与str_2 ,这两个不同对象,由于 setText 方法同时支持 CharSequence 与 String 类型的参数,故在此示范不同数据类型的字符串进行同步输出。

package irdc.ex03_04; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class EX03_04 extends Activity { private TextView mTextView02;

/** Called when the activity is first created. */ @Override

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

mTextView02 = (TextView) findViewById(R.id.myTextView02); CharSequence str_2 = getString(R.string.str_2);

String str_3 = "我是程序里调用Resource 的"; mTextView02.setText(str_3 + str_2); } }

res/layout/main.xml

为了作为对比,在 main.xml 里创建了两个 TextView,并采 LinearLayout 的方式配置,一上一下,在运行结果中 id 为 myTextView01 的 TextView 并没有任何文字的更改,维持一开始的 str_1 参考字符串常数里的文字)但在程序运行后,为 myTextView02 的TextView (, id 则作了文字的实时更改。

扩展学习

虽然在 values/strings.xml 里定义了默认的字符串常数,需留意若遭遇如“?”、“'”、“\”等符号时,必须使用转义字符(\),如下:

\?

\' \\

范例说明

在开发手机应用程序时,除了底层对 API 的掌握度之外,最重要的仍是对屏幕分辨率的概念,因各家手机厂商所采用的屏幕尺寸不同,user UI 接口呈现及布局自然也各异。尽管 Android 可设置为随着窗口大小调整缩放比例,但即便如此,手机程序设计人员还是必须知道手机屏幕的边界,以避免缩放造成的布局(Layout)变形问题。这个范例非常的简短,只需几行程序即可取得手机的分辨率,当中的关键则是 DisplayMetrics 类的应用。

运行结果

▲图 3-5 取得 Android 手机的实际屏幕分辨率

范例程序

src/irdc.ex03_05/EX03_05.java

在 android.util 底下的 DisplayMetrics 对象,记录了一些常用的信息,包含了显示信息、大小、维度、字体等等;在使用时,请记得引用 android.util.DisplayMetrics。值得一提的是 DisplayMetrics 对象里的 widthPixels 及 heightPixels 字段为整数类型,在以下的程序当中,并没有对其作字符串类型的转换,因为字符串连接运算符的缘故,所以输出 strOpt 为字符串。

package irdc.ex03_05; import android.app.Activity;

import android.os.Bundle; import android.util.DisplayMetrics; import android.widget.TextView; public class EX03_05 extends Activity { private TextView mTextView01;

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

/* 必须引用android.util.DisplayMetrics */ DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm);

String strOpt = "手机屏幕分辨率为:" + dm.widthPixels + " × " + dm.heightPixels; mTextView01 = (TextView) findViewById(R.id.myTextView01); mTextView01.setText(strOpt); }

}

扩展学习

程序一开始所创建的 DisplayMetrics 对象(程序中的 dm),不需要传递任何参数(构造时),但在调用 getWindowManager()之后,会取得现有的 Activity 的 Handler,此时,调用 getDefaultDisplay 方法将取得的宽高维度存放于 DisplayMetrics 对象 dm 中,而取得的宽高维度是以像素为单位(Pixel),“像素”所指的是“绝对像素”而非“相对像素”。

范例说明

老是要一个个指定文字的大小、颜色也不是办法,有没有类似 CSS 样式的方法可用来指定颜色、大小呢?事实上是有的,在 Android 程序开发过程中,也可以通过样式(Style)的方式,初始化 TextView 的文本颜色、大小;当然这个范例只是抛砖引玉,在 Layout 当中的任何对象(以 XML 定义)都可以用样式化的方式来更改其外观。在以下的范例中,将创建两个 TextView 作为对比,使其呈现两种不同的样式差异作为练习,而 Style 的写法与先前介绍到的颜色常数(color.xml)相同,同样是定义在 res/values 下面,但其 XML 定义的方式不同来看看以下这个范例练习。

运行结果

▲图 3-6 利用 Style 来初始化 TextView

范例程序

src/irdc.ex03_06/EX03_06.java

主程序看起来非常干净,只有加载 https://www.doczj.com/doc/937605361.html,yout.main 定义布局内容而已,但由于定义在 main.xml 里的语句不同,自然也有不同的样貌呈现。

package irdc.ex03_06; import android.app.Activity; import android.os.Bundle; public class EX03_06 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/937605361.html,yout.main); } }

res/layout/main.xml

诚如先前所述,初始化 TextView 时,指定 Style 属性,使其应用 style.xml 里事先定义好的样式。

android:layout_height="fill_parent" >

android:gravity="center_vertical|center_horizontal"

android:text="@string/str_text_view1" />

android:gravity="center_vertical|center_horizontal"

android:text="@string/str_text_view2" />

res/values/style.xml

在此的 style.xml 就是这个范例的关键之处了,当中定义了两个样式名称,分别为DavidStyleText1 与 DavidStyleText2;留意于

扩展学习

style 与 color 的 XML 语法相类似,皆需要先声明 xml 的版本以及 encoding 为UTF-8,但其内的 resources 则需要以 stylename 作为样式名称,在最内层才是以 item 定义样式的范围,其语法如下:

范例说明

按钮在许多 Windows 窗口应用程序中,是最常见到的控件( Controls),此控件也常在网页设计里出现,诸如网页注册窗体、应用程序里的“确定”等等。而按钮所触发的事件处理,我们称为 Event Handler,只不过在 Android 当中,按钮事件是由系统的Button.OnClickListener 所控制,熟悉 Java 程序设计的读者对 OnXxxListener 应该不陌生。以下的范例将示范如何在 Activity 里布局一个按钮(Button),并设计这个按钮的事件处理函数,当点击按钮的同时,更改 TextView 里的文字。

运行结果

▲图 3-7 Android 手机的实际画面运行结果

范例程序

src/irdc.ex03_07/Ex03_07.java

一开始,必须先在 Layout 当中布局一个 Button 及一个 TextView 对象,找不到这两个组件的话,系统会无法运行下去,在开发阶段会造成编译错误。其次在主程序中,请留意 onCreate 里创建的 Button.OnClickListener 事件,这也是触发按钮时会运行的程序段落;但由于 Eclipse 无法自动加载默认的传递参数( new Button.OnClickListener()),所以,在编写程序描述时,必须自行键入新创建的按钮所需的 OnClickListener() 事件,如下所示:

package irdc.ex03_07; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class EX03_07 extends Activity

{ private Button mButton1; private TextView mTextView1;

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

mButton1 =(Button) findViewById(R.id.myButton1); mTextView1 = (TextView) findViewById(R.id.myTextView1);

mButton1.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub mTextView1.setText("Hi, Everyone!!"); } }); }

}

扩展学习

本范例中只有一个按钮,但在 Activity 里,其实可以布局数个按钮,只需要在 Layout 里多配置一个按钮对象,以下的程序将创建两个按钮事件作为示范:

package irdc.ex03_07; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class EX03_07 extends Activity { private Button mButton1; private Button mButton2; private TextView mTextView1;

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

mButton1 =(Button) findViewById(R.id.myButton1); mButton2 =(Button) findViewById(R.id.myButton2); mTextView1 = (TextView) findViewById(R.id.myTextView1);

mButton1.setOnClickListener(new Button.OnClickListener() { @Override public

void onClick(View v) { // TODO Auto-generated method stub mTextView1.setText("Hi, Everyone!!"); } });

mButton2.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub mTextView1.setText("Hi, David!!"); } }); }

}

最后来谈谈按钮事件里被重写的 onClick(View v) 函数,此函数唯一的参数是 View 类型的变量 v,这个变量所指的是来自父层(parent)的 ContentView,亦即通过“v.*”可以更改其父层的 View 状态或属性。

范例说明

在网页的世界里,想要在两个网页间做转换,只要利用超链接(HyperLink)就可以实现,但在手机的世界里,要如何实现手机页面之间的转换呢?最简单的方式就是改变 Activity 的 Layout!在这个范例里头,将布局两个 Layout,分别为 Layout1(main.xml)与 Layout2 (mylayout.xml),默认载入的 Layout 为 main.xml,且在 Layout1 当中创建一个按钮,当点击按钮时,显示第二个 Layout(mylayout.xml);同样地,在 Layout2 里也设计一个按钮,当点击第二个 Layout 的按钮之后,则显示回原来的 Layout1,现在就来示范如何在两个页面之间互相切换。

运行结果

▲图 3-8 手机页面 Layout 间的切换

范例程序

src/irdc.ex03_08/EX03_08.java

主程序中,预加载的 Layout 是 main.xml,屏幕上显示的是黑色背景的“This is Layout 1!!”,在第一个Layout 上的按钮被点击的同时,改变Activity 的Layout 为mylayout.xml,屏

幕上显示变为白色背景的“This is Layout 2!!”,并利用 Button 点击时,调用方法的不同做两个 Layout 间的切换。

package irdc.ex03_08; /* import 相关 class */ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class EX03_08 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 载入main.xml Layout */ setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

/* 以 findViewById()取得 Button 对象,并添加 onClickListener */ Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) {

jumpToLayout2(); } }); }

/* method jumpToLayout2:将 layout 由 main.xml 切换成 mylayout.xml */ public void jumpToLayout2() { /* 将layout 改成mylayout.xml */ setContentView(https://www.doczj.com/doc/937605361.html,yout.mylayout);

/* 以 findViewById()取得 Button 对象,并添加 onClickListener */ Button b2 = (Button) findViewById(R.id.button2); b2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { jumpToLayout1(); } }); } /* method jumpToLayout1:将 layout 由 mylayout.xml 切换成 main.xml */ public void jumpToLayout1()

{ /* 将 layout 改成 main.xml */ setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

/* 以 findViewById()取得 Button 对象,并添加 onClickListener */ Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { jumpToLayout2(); } }); } }

res/layout/main.xml

为了凸显 Layout 间切换的效果,特别改变两个 Layout 的背景色及输出文字。main.xml 在中定义其背景色为黑色,输出文字为“This is Layout 1!!”。

res/layout/mylayout.xml

在 mylayout.xml 中定义其背景色为白色,输出文字为“This is Layout 2!!”。

扩展学习

运用改变 Activity Layout 这个技巧,就可做出手机页面转换的效果,当然亦可搭配之

前介绍过的 Style 与 Theme 的设置,进行更加灵活的布局配置运用,例如,让用户自行决

定要使用的系统样式、背景及文字颜色等,接着直接应用来改变布局。再者,利用setContentView 来置换页面,还有一个特别的优点,即所有程序里的变量皆存在相同的状态,无论是类成员变量、类函数等等,皆可以在一个 Activity 的状态中直接取得,并没有

参数传递的问题。打个比喻:Layout1 收集了用户输入的信用卡卡号等付款信息,在“下一步”显示 Layout2 使之显示订单信息,让用户进行确认,并在点击按钮后,调用 Layout3 进

行刷卡 Gateway 的授权操作,这当中皆没有需要传递的变量,其手法是将所需要的字段数据,以类成员变量作如下声明:

public class EX03_08 extends Activity { public String colVar1; public String colVar2; public String colVar3; /** Called when the activity is first created. */

@Override public void onCreate(Bundle savedInstanceState) {

/* 下面的程序略 */

范例说明

前一个范例介绍了如何运用切换 Layout 的方式,进行手机页面间的转换。如果要转换

的页面并不单只是背景、颜色或文字内容的不同,而是 Activity 的置换,那就不是单单改

变 Layout 就能完成的,尤其是需要传递的变量不像网页可以通过 Cookie 或 Session,在

程序里要移交主控权到另外一个 Activity,光靠先前的 Layout 技巧是办不到的。那要

如何解决 Activity 控制权的移交呢?在 Android 的程序设计中,可在主程序里使用startActivity() 这个方法来调用另一个 Activity(主程序本身即是一个 Activity),但

当中的关键并不在 startActivity 这个方法,而是 Intent 这个特有的对象,Intent 就如

同其英文字义,是“想要”或“意图”之意,在主 Activity 当中,告诉程序自己是什么,

并想要前往哪里,这就是 Intent 对象所处理的事了。本范例并没有特别的 Layout 布局,

而是直接在主 Activity (Activity1)当中部署一个按钮,当点击按钮的同时,告诉主Activity 前往 Activity2,并在 Activity2 里创建一个回到 Activity1 的按钮,本范例

将利用此简易的程序描述,示范如何在一个 Activity 中调用另一个 Activity 的手法。

运行结果

▲图 3-9 在两个 Activity 间做切换

范例程序

src/irdc.ex03_09/EX03_09.java

主程序中加载的 Layout 为 main.xml,屏幕上显示的是黑色背景的“This is Activity 1!!”,

在 Button 被点击时调用另一个 Activity(EX03_09_1,参考 AndroidManifest.xml 里的说明),并将主 Activity 关闭 finish(),接着将主控权交给下一个 Activity,即Activity2。

package irdc.ex03_09; /* import 相关 class */ import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.content.Intent; public class EX03_09 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 载入 main.xml Layout */ setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

/* 以 findViewById()取得 Button 对象,并添加 onClickListener */ Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v)

{ /* new 一个 Intent 对象,并指定要启动的 class */ Intent intent = new Intent(); intent.setClass(EX03_09.this, EX03_09_1.class);

/* 调用一个新的 Activity */ startActivity(intent); /* 关闭原本的 Activity */ EX03_09.this.finish(); } }); } }

src/irdc.ex03_09/EX03_09_1.java

EX03_09_1.java 程序是第二个Activity 的主程序,其加载的Layout 为mylayout.xml,屏幕上所显示的是白色背景的“This is Activity 2!!”,当主 Activity (Activity1)调用这个 Activity(Activity2)后,同样为 Button 添加 onClickListener(),使 Button 被点击时,重新调用 Activity1(EX03_09),并将 Activity2(EX03_09_1)关闭(finish())。

package irdc.ex03_09; /* import 相关 class */ import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.view.View; import android.widget.Button; public class EX03_09_1 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 载入mylayout.xml Layout */ setContentView(https://www.doczj.com/doc/937605361.html,yout.mylayout);

/* 以 findViewById()取得 Button 对象,并添加 onClickListener */ Button b2 = (Button) findViewById(R.id.button2); b2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { /* new 一个 Intent 对象,并指定要启动的class */ Intent intent = new Intent(); intent.setClass(EX03_09_1.this, EX03_09.class);

/* 调用一个新的 Activity */ startActivity(intent); /* 关闭原本的 Activity */ EX03_09_1.this.finish(); } });

} }

res/layout/main.xml

为了凸显 Activity 间切换的效果,特别将两个 Layout 的背景及输出文字有所区别。

在 main.xml 中定义其背景色为黑色,输出文字为“This is Activity 1!!”。

android:text="@string/act1" >

res/layout/mylayout.xml

在 mylayout.xml 中定义其背景色为白色,输出文字为“This is Activity 2!!”。

android:id="@+id/text2" android:textSize="24sp" android:layout_width="186px" android:layout_height="29px" android:layout_x="70px" android:layout_y="32px" android:textColor="@drawable/black" android:text="@string/act2" >

AndroidManifest.xml

由于本范例中添加了一个 Activity,所以必须在 AndroidManifest.xml 中定义一个新

的 activity,并给予名称 name,否则程序将无法编译运行。

package="irdc.ex03_09" android:versionCode="1" android:versionName="1.0.0"> 扩展学习

当系统中新添加Activity 时,必须在AndroidManifest.xml 里定义一个新的activity:

否则系统将会因为找不到 Activity 而发生编译错误。另外,当程序中出现两个以上的Activity 时,系统要如何决定主程序是哪一支(entry point)呢?以本范例来说,AndroidManifest.xml 中 Activity EX03_09 的定义如下:

其中有一行为 ,这

就代表程序启动时,会先运行 EX03_09 这个 Activity,而非 EX03_09_1。需注意的是,这

个参数必须要被定义,如果 xml 中没有一支 Activity 有设置这个参数,则程序将不会被

运行。此外,在两支 Java 程序中的最后一行都调用了 finish() 这个方法,它代表这个Activity 已运作完毕,当系统接收到这个命令时,即会关闭此 Activity,所以此时点击模

拟器的返回(Back)键,并不会回到上一个 Activity 的画面,如果要让模拟器的返回键

有回上一页的效果,可以将此行程序注释掉。同理,当两个 Activity 在切换时,并非

真的只有两个 Activity 在切换,而是在点击按钮时,再重新调用起一个新的 Activity。

范例说明

在上一个范例里,介绍了如何在 Activity 中调用另一个 Activity,但若需要在调用

另外一个 Activity 的同时传递数据,那么就需要利用 android.os.Bundle 对象封装数据

的能力,将欲传递的数据或参数,通过 Bundle 来传递不同 Intent 之间的数据。本范例

的设计为一个简易表单的范例,在 Activity1 中收集 User 输入的数据,在离开 Activity1

的同时, User 选择的结果传递至下一个 Activity2,将以一个简单 BMI“标准体重计算

器”示范如何传递数据到下一个 Activity 里。

运行结果

▲图 3-10

在两个 Activity 间做数据的传递

范例程序

src/irdc.ex03_10/EX03_10.java

在第一个 Activity1 主程序中,定义了“性别”选项的 RadioGroup 以及输入身高的“EditText”,并运用 Intent 及 Bundle 对象,在调用 Activity2(EX03_10_1)时,同时将数据传入。关于 EditText 对象的使用在此仅供参考,详细的应用以及属性方法,将会在未来讨论控件时,再详细解说。

package irdc.ex03_10; /* import 相关 class */ import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton;

public class EX03_10 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 载入main.xml Layout */ setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

/* 以 findViewById()取得 Button 对象,并添加 onClickListener */ Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { /*取得输入的身高*/ EditText et = (EditText) findViewById(R.id.height); double height=Double.parseDouble(et.getText().toString()); /*取得选择的性别*/ String sex=""; RadioButton rb1 = (RadioButton) findViewById(R.id.sex1); if(rb1.isChecked()) {

sex="M"; } else { sex="F"; } /*new 一个 Intent 对象,并指定 class*/ Intent intent = new Intent(); intent.setClass(EX03_10.this,EX03_10_1.class);

/*new 一个 Bundle 对象,并将要传递的数据传入*/ Bundle bundle = new Bundle(); bundle.putDouble("height",height); bundle.putString("sex",sex);

/*将 Bundle 对象 assign 给 Intent*/ intent.putExtras(bundle);

/*调用 Activity EX03_10_1*/ startActivity(intent); } }); } }

src/irdc.ex03_10/EX03_10_1.java

那么,在 Activity2(EX03_10_1)要如何接收来自 Activity1(EX03_10)传递来的数据呢?试想,在 Activity1 是以 Bundle 封装对象,自然在 Activity2 亦是以 Bundle 的方式解开封装的数据;程序中以 getIntent().getExtras() 方法取得随着 Bundle 对象传递过来的性别与身高,经过计算之后,显示在屏幕上。

package irdc.ex03_10; /* import 相关 class */ import java.text.DecimalFormat; import java.text.NumberFormat; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class EX03_10_1 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 加载main.xml Layout */ setContentView(https://www.doczj.com/doc/937605361.html,yout.myalyout);

/* 取得Intent 中的Bundle 对象*/ Bundle bunde = this.getIntent().getExtras();

/* 取得 Bundle 对象中的数据 */ String sex = bunde.getString("sex"); double height = bunde.getDouble("height");

/* 判断性别 */ String sexText=""; if(sex.equals("M")) { sexText="男性"; } else { sexText="女性"; }

/* 取得标准体重 */ String weight=this.getWeight(sex, height);

/* 设置输出文字*/ TextView tv1=(TextView) findViewById(R.id.text1);

tv1.setText("你是一位"+sexText+"\n 你的身高是" +height+"厘米\n 你的标准体重是

"+weight+"公斤"); }

/* 四舍五入的method */ private String format(double num) { NumberFormat formatter = new DecimalFormat("0.00"); String s=formatter.format(num); return s; }

/* 以 findViewById()取得 Button 对象,并添加 onClickListener */ private String getWeight(String sex,double height) { String weight=""; if(sex.equals("M")) { weight=format((height-80)*0.7); } else { weight=format((height-70)*0.6); } return weight; } }

res/layout/mylayout.xml

mylayout.xml 为(EX03_10_1)的 Layout,定义了显示计算结果的 TextView。

AndroidManifest.xml

由于本范例中有两个 Activity,所以文件中必须有两个 activity 的声明,否则系统将

无法运行,请看以下的描述。

xmlns:android="https://www.doczj.com/doc/937605361.html,/apk/res/android"

package="irdc.ex03_10" android:versionCode="1" android:versionName="1.0.0"> 扩展学习

Bundle 对象针对了不同的数据类型提供了许多的方法,例如,此范例中传递 String

类型的数据,使用的方法为 Bundle.putString(stringName,stringValue):

bundle.putDouble("sex",sex);

而要传递 Double 类型的数 Bundle.putDouble(doubleName,doubleValue),如

下:据,使用的方法为

bundle.putString("height",height);

反之,若要由Bundle 对象中取出数据,则使用Bundle.getString(stringName) 、 Bundle.getDouble(doubleName) 等相对应的方法即可。

除了上述简单的传递类型之外,尚有 String[] 与 ArrayList 等封装的方式可供使用参

考。

范例说明

上一个范例中,好不容易将数据从 Activity1 传递至 Activity2,如果要再回到Activity1,数据该不会要再封装一次吧?而且前一个 Activity1 早就被程序 destroy 了,

倘若在 Activity1 最后以 finish() 结束程序,再通过 Activity2 将数据采用 Bundle 的

方式通过新打开 Activity1 传递参数,这样的做法虽然也可以恢复 User 输入的数据,但

是并不符合我们的期待,尤其是 User 曾经输入过的数据,如果不小心点击回到上一页,数

据就消失不见,这就不妙了。有鉴于科技始终来自于人性,如果要在次页面加上一个“回

上页”的按钮,而非通过模拟器的回复键,且回上页后又能保留之前输入的相关信息,那么

就必须使用 startActivityForResult()来唤起一个 Activity。利用这个方法,前一个Activity1 便会有一个等待次 Activity2 的返回,而返回的数据就可以达到我们想要的结

果。

运行结果

图 3-11 将数据返回到前一个 Activity

范例程序

src/irdc.ex03_11/EX03_11.java

在Activity1 主程序中调用Activity 的方法更改成startActivityForResult(intent,0),其中 0 为下一个 Activity 要返回值的依据,可指定为自行定义的参考标识符( Identifier)。程序覆盖了 onActivityResult() 这个方法,令程序在收到 result 后,再重新加载写回原本输入的值。

package irdc.ex03_11; /* import 相关 class */ import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; public class EX03_11 extends Activity { private EditText et; private RadioButton rb1; private RadioButton rb2;

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState)

{ super.onCreate(savedInstanceState); /* 载入main.xml Layout */ setContentView(https://www.doczj.com/doc/937605361.html,yout.main);

/* 以 findViewById()取得 Button 对象,并添加 onClickListener */ Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { /*取得输入的身高*/ et = (EditText) findViewById(R.id.height); double height=Double.parseDouble(et.getText().toString()); /*取得选择的性别*/ String sex=""; rb1 = (RadioButton) findViewById(R.id.sex1); rb2 = (RadioButton) findViewById(R.id.sex2); if(rb1.isChecked()) { sex="M"; } else {

sex="F"; }

/*new 一个Intent 对象,并指定class*/ Intent intent = new Intent(); intent.setClass(EX03_11.this,EX03_11_1.class);

/*new 一个 Bundle 对象,并将要传递的数据传入*/ Bundle bundle = new Bundle(); bundle.putDouble("height",height); bundle.putString("sex",sex);

/*将 Bundle 对象 assign 给 Intent*/ intent.putExtras(bundle);

/*调用 Activity EX03_11_1*/ startActivityForResult(intent,0); } }); }

/* 覆盖onActivityResult()*/ @Override protected void onActivityResult(int requestCode, int resultCode,

Intent data) { switch (resultCode) { case RESULT_OK: /* 取得来自 Activity2 的数据,并显示于画面上*/ Bundle bunde = data.getExtras(); String sex = bunde.getString("sex"); double height = bunde.getDouble("height");

et.setText(""+height); if(sex.equals("M")) { rb1.setChecked(true); } else { rb2.setChecked(true); } break; default: break; } }

}

src/irdc.ex03_11/EX03_11_1.java

在 Activity2 的主程序中,设计当 Button 被点击时,将 Bundle 对象与结果返回给前一个 Activity1。

package irdc.ex03_11; /* import 相关 class */ import java.text.DecimalFormat; import java.text.NumberFormat; import android.app.Activity; import

android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class EX03_11_1 extends Activity { Bundle bunde; Intent intent; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

/* 载入 mylayout.xml Layout */ setContentView(https://www.doczj.com/doc/937605361.html,yout.myalyout);

/* 取得Intent 中的Bundle 对象*/ intent=this.getIntent(); bunde = intent.getExtras();

/* 取得 Bundle 对象中的数据 */ String sex = bunde.getString("sex"); double height = bunde.getDouble("height");

/* 判断性别 */ String sexText=""; if(sex.equals("M")) { sexText="男性"; } else { sexText="女性"; }

/* 取得标准体重 */ String weight=this.getWeight(sex, height);

/* 设置输出文字*/ TextView tv1=(TextView) findViewById(R.id.text1);

tv1.setText("你是一位"+sexText+"\n 你的身高是"+height+ "厘米\n 你的标准体重是

"+weight+"公斤");

/* 以 findViewById()取得 Button 对象,并添加 onClickListener */ Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { /* 返回 result 回上一个activity */ EX03_11_1.this.setResult(RESULT_OK, intent);

/* 结束这个 activity */ EX03_11_1.this.finish(); } }); }

/* 四舍五入的 method */ private String format(double num) {

NumberFormat formatter = new DecimalFormat("0.00"); String

s=formatter.format(num); return s; } /* 以 findViewById()取得 Button 对象,并添加onClickListener */ private String getWeight(String sex,double height) { String weight=""; if(sex.equals("M")) { weight=format((height-80)*0.7); } else { weight=format((height-70)*0.6); } return weight; } }

res/layout/mylayout.xml

mylayout.xml 为 Activity2 (EX03_11_1) Layout,的其中定义了显示计算结果的TextView 与回上一页的 Button 按钮。

AndroidManifest.xml

范例中有两个 Activity,所以 AndroidManifest.xml 里必须有这两个 activity 的声

明,否则系统将无法运行。

package="irdc.ex03_11" android:versionCode="1" android:versionName="1.0.0"> 扩展学习

范例中为了在回到上一页时,能够显示之前所输入的数据,故将原本传递次 Activity

的 Intent (里面包含了有数据的 Bundle 对象)再重新返回给主 Activity1。如果要在

软件项目详细设计文档示例模版

XXX软件/项目/系统 详细设计说明书 拟制日期 评审人日期 批准日期 编写单位或个人

修订历史

目录 XXX软件详细设计说明书 (1) Revision Record 修订记录 (2) 1引言 (1) 1.1编写目的 (1) 1.2背景 (1) 1.3参考资料 (1) 1.4术语定义及说明 (1) 2设计概述 (1) 2.1任务和目标 (1) 2.1.1需求概述 (1) 2.1.2运行环境概述 (1) 2.1.3条件与限制 (1) 2.1.4详细设计方法和工具 (1) 3系统详细需求分析 (1) 3.1详细需求分析 (2) 3.2详细系统运行环境及限制条件分析接口需求分析 (2) 4总体方案确认 (2) 4.1系统总体结构确认 (2) 4.2系统详细界面划分 (2) 4.2.1应用系统与支撑系统的详细界面划分 (2) 4.2.2系统内部详细界面划分 (2) 5系统详细设计 (2) 5.1系统结构设计及子系统划分 (3) 5.2系统功能模块详细设计 (3) 5.3系统界面详细设计 (3) 5.3.1外部界面设计 (3) 5.3.2内部界面设计 (3) 5.3.3用户界面设计 (3) 6、数据库系统设计 (4) 6.1设计要求 (4) 6.2 信息模型设计 (4) 6.3数据库设计 (4) 6.3.1设计依据 (4) 6.3.2数据库种类及特点 (4) 6.3.3数据库逻辑结构 (4) 6.3.4物理结构设计 (4) 6.3.5数据库安全 (4) 6.3.6数据字典 (4) 7非功能性设计 (4) 8 (5) 9环境配置 (5)

1引言 1.1编写目的 说明编制的目的是,大体上介绍一下软件系统中各层次中模块或子程序、以及数据库系统的设计考虑,表明此文档是主要是为编码人员提供服务,并且其他类型的项目参与人员也可以通过此文档对软件/项目有更深入了解。 1.2背景 说明此软件或系统的项目背景、需求背景、开发目的等,还可以列出参与人员等相关信息。 1.3参考资料 列出本文档中引用的文献、资料、标准等相关信息(一般是具有出版或版权性质的文件)。 1.4术语定义及说明 列出文档中用到的和开发有关,或与行业、业务、需求有关的专业术语,并进行解释。 2设计概述 2.1任务和目标 说明详细设计的任务及详细设计所要达到的目标。 2.1.1需求概述 对所开发软件的概要描述, 包括主要的业务需求、输入、输出、主要功能、性能等,尤其需要描述系统性能需求。 2.1.2运行环境概述 对本系统所依赖于运行的硬件,包括操作系统、数据库系统、运行库、中间件、接口软件、可能的性能监控与分析等软件环境的描述,及配置要求。 2.1.3条件与限制 详细描述系统所受的内部和外部条件的约束和限制说明。包括业务和技术方面的条件与限制以及进度、管理等方面的限制。 2.1.4详细设计方法和工具 简要说明详细设计所采用的方法和使用的工具,如数据库设计工具、界面设计工具、原型设计工具等。 3系统详细需求分析 主要对系统级的需求进行分析。首先应对需求分析提出的企业需求进一步确认,并对由于情况变化而带来的需求变化进行较为详细的分析。

用Delphi开发监控和管理系统的软件

用Delphi开发监控和管理系统的软件Ξ 徐智文1,延 青2 (11包头钢铁职业技术学院,内蒙古 包头 014010; 21包钢稀奥科镍氢动力电池有限公司,内蒙古 包头 014010) 摘 要:目前市场上已经有许多类似的程序,如常用的优化大师就是一个监控和管理系统的软件。文中主要介绍了使用Delphi用于监控和管理系统程序的开发思路和方法。 关键词:Delphi;监控和管理系统;CPU 中图分类号:TP315 文献标识码:B 文章编号:1009-5438(2008)01-0054-02 The Development of Controlling and Management System Softw are by Using Delphi XU Zhi-wen1,Y AN Qing2 (1.Baotou Vocational Technical College o f Iron and Steel,Baotou014010,Nei Monggol,China; 2.Rare Earth Ovonic High-Power MH/NI Battery Co1Ltd.o f Baotou Steel(Group) Corp.,Baotou014010,Nei Monggol,China) Abstract:At present,there are many similar procedures on the market,such as the G reat Master which is a s oftware for con2 trolling and management1The paper mainly introduces the widen thinking and the method of controlling and management system by using delphi. K ey w ords:Delphi,controlling and management,CPU 计算机的硬件系统是用来读入、处理和存储信息,对系统的监控和管理可以提高其工作效率。自从有了操作系统后,人们便想方设法在工作过程中查看内存使用情况、CPU的工作速度及其效率,以便对目前的工作进行调整,如内存耗量过大就可关闭一些没用的程序(包括前台和后台运行程序)。随着人们对软件的要求越来越高,软件的功能在原有的基础上越来越大.但对运行环境的要求也越来越高。因此需要通过程序对系统进行监控与管理来提高CPU的运行速度和降低内存的耗用量。 1 开发思路 对系统监控和管理程序的开发重点是对用于管理系统的命令和函数的灵活应用,在开发时可参考下面的思路:①明确要监控或管理的系统部分;②查找要使用的命令或函数;③设计使用管理和应用的界面;④编辑功能实现的代码;⑤运行测试其监控或管理的效果。如果要开发远程系统监控和管理的程序,则必须选用适当的网络组件,以便获取对方的IP地址,并通过该地址对其系统进行监控和管理。 2 系统程序开发的一般流程 系统监控和管理程序开发主要是对各种函数的灵活应用。系统程序开发的一般流程见图1。实现对系统物理内存、CPU速度、显示频率等进行测试。 第34卷第1期2008年2月 包 钢 科 技 Science&T echnology of Baotou S teel(G roup)C orporation V ol.34,N o.1 February,2008 Ξ收稿日期:2007-11-08 作者简介:徐智文(1963-),男,内蒙古包头市人,高级讲师,现从事计算机应用专业教学工作。

2017公文写作范文大全3

2017公文写作范文大全3 现代公文,主要指党政机关在实施领导和行政管理过程中形成的具有法定效力和规范体式的文书,是进行领导管理和公务活动的重要工具。也泛指各级各类机关、社会团体、企事业单位制订、使用的公务文书。公文写作包括会议纪要,书信类,会议简报,讲话稿等,本文是2017公文写作范文的大全,仅供参考。 2017公文写作范文大全一:会议纪要可考系数:★★ 适用范围:会议纪要是一种应用非常普遍的通用公文,无论党政军机关、企事业单位、社会团体等组织,只要运用会议这一工作形式民主决策、研究问题、听取意见等,就会使用会议纪要记载和传达会议情况和议定事项。 例文参考: 全国抗震办主任座谈会会议纪要 为了贯彻《房屋建筑工程抗震设防管理规定》(建设部令第14号)精神,加强全国抗震防灾管理工作,建设部工程质量安全监督与行业发展司于200年月2日至2日在江西省九江市召开了“全国抗震办主任座谈会”。建设部工程质量安全监督与行业发展司司长徐波、副司长曾少华和江西省建设厅、九江市政府、九江市建设局的有关领导同志出席了会议。各省、自治区、直辖市抗震办公室主任(处长),及有关

专家参加了会议。现将会议主要内容纪要如下: 会议由曾少华同志主持。徐波同志在讲话中进一步阐明了抗震防灾工作的重要意义,总结了自去年在云南召开全国抗震办主任座谈会以来所做的主要工作,提出了建设系统开展抗震工作的总体要求和工作措施,部署了今后一个时期的重点工作。会上,江西省、新疆自治区、北京市、江苏省抗震办的负责同志分别介绍了各自的抗震工作经验;全国超限高层抗震设防审查专家委员会、北京工业大学和中国建筑科学研究院的专家作了有关专题报告;代表们对《关于进一步加强村镇建设抗震防灾工作的通知(讨论稿)》和《市政基础设施工程抗震设防管理规定(草案)》提出了修改意见和建议。全体与会代表还赴瑞昌地震灾区考察了震后建筑破坏情况和恢复重建工作,进一步增强了工作的责任感和紧迫感。 会议指出,今后建设系统的抗震防灾工作要…… 会议提出了以下工作措施:…… 与会代表表示,会后要向相关负责同志汇报、传达会议精神,进 一步振奋精神,努力工作,结合各地实际情况,把会议精神落到实处。 【璧尘提醒】 会议纪要的一般结构可分为标题、开头、正文、结尾几个部分。

软件开发文档规范

附2: 软件文档编写向导 文档分类 项目包括如下几类文档: 项目管理文档。包括:《软件项目计划》、《项目进度报告》、《项目开发总结报告》 软件开发文档。包括:《需求规格说明》、《概要设计说明》、《详细设计说明》、《测试计划》、《软件测试分析报告》。 产品文档。包括:《用户操作手册》《演示文件》。 软件项目计划 (Software Project Plan) 一?引言 1?编写目的(阐明编写软件计划的目的,指出读者对象。) 2?项目背景(可包括:(1 )项目委托单位、开发单位和主管部门;(2)该软件系统与 其他系统的关系。) 3?定义(列出本文档中用到的专门术语的定义和缩略词的原文。) 4?参考资料(可包括:文档所引用的资料、规范等;列出资料的作者、标题、编号、发 表日期、出版单位或资料来源。) 二?项目概述 1.工作内容(简要说明项目的各项主要工作,介绍所开发软件的功能性能等?若不编写可行性研究报告,则应在本节给出较详细的介绍。) 2.条件与限制(阐明为完成项目应具备的条件开发单位已具备的条件以及尚需创造的 条件?必要时还应说明用户及分合同承包者承担的工作完成期限及其它条件与限制。) 3.产品 (1)程序(列出应交付的程序名称使用的语言及存储形式。) (2)文档(列出应交付的文档。) (3 )运行环境(应包括硬件环境软件环境。) 4?服务(阐明开发单位可向用户提供的服务?如人员培训安装保修维护和其他运行支持。 5.验收标准

三.实施计划 1.任务分解(任务的划分及各项任务的负责人。) 2?进度(按阶段完成的项目,用图表说明开始时间完成时间。) 3?预算 4?关键问题(说明可能影响项目的关键问题,如设备条件技术难点或其他风险因素,并说明对策。) 四.人员组织及分工 五.交付期限 六.专题计划要点(如测试计划等。) 项目开发进度报告 一.报告时间及所处的开发阶段 二.给出进度 1.本周的主要活动 2.实际进展与计划比较 三.所用工时(按不同层次人员分别计时。) 四.所有机时 五.工作遇到的问题及采取的对策 六.本周完成的成果 七.下周的工作计划 八.特殊问题 项目开发总结报告 一.引言 1.编写目的(阐明编写总结报告的目的,指明读者对象。) 2.项目背景(说明项目的来源、委托单位、开发单位及主管部门。) 3.定义(列出报告中用到的专门术语定义和缩写词的原意。) 4.参考资料(列出这些资料的作者、标题、编号、发表日期、出版单位或资料来源,可包括: (1 )项目开发计划;(2 )需求规格说明书;(3 )概要设计说明书;(4 )详细设计说明

基于Web的习题管理系统的设计与实现文献综述

本科毕业论文(设计) 文献综述 学生姓名徐骅学号090824308 班级计算机09-3班专业计算机科学与 技术 指导教师王春玲

基于Web的习题管理系统的设计与实现 摘要: 随着网络时代的到来,互联网技术已覆盖全国各个城市,习题管理系统研究是一个重要的部分,在考试体制的运行和管理上实现规范化,科学化,系统化已经成为网络教育发展的必然趋势。以B/S结构为模式的习题管理系统,能极大的方便老师教学和学生的自我检测,能极大的节省物力人力,对于新时期的教育改革具有重大的意义。 关键词:数据库,C#程序语言,题库,功能,板块 正文: 1.前言 网络题库管理作为教学中的重要一环。课程作业管理系统正是利用网络这个先进的平台。紧密地结合了实际教学中的各种需求来对传统的作业管理模式进行优化,它的目标是为教师和学生建立一个更加高效与快捷的自我检测和管理平台。基于B/S架构的习题管理系统是一个自由开放的分布式应用系统,可以使用浏览器并通过人机交互的方式来浏览,减少时间、空间对于作业管理的限制。 计算机在教学管理中的应用是实现教学管理科学化、现代化的关键。要提高教学质量,必须把握各个教学环节,考试是重要一环,是检测学生学习效果和对学生进行客观评价的一种手段,也是课程建设的重要组成部分。在学校教学工作中,传统的试题管理通常是以试题集或者试卷集的形式进行的,各位老师单独或集体命题,采用手工方式,题量大、工作复杂。随着科学技术的飞速发展,现代化教育手段广泛使用,教学测试方法不断改进,传统的试题管理模式和手工组卷模式将逐步被计算机代替,使教学检测更客观、更科学、更公正,从而不断提高学校的教学质量、教学水平。

公文写作格式与范例大全

常见公文写作格式与范文 公文格式(函、请示、报告、通知、规定的公文格式)之一 函的写作格式 一、函的概念 函是不相隶属机关之间相互洽工作、询问和答复问题,或者向有关主管部门请求批准事项时所使用的公文。 函作为公文中惟一的一种平行文种,其适用的范围相当广泛。在行文方向上,不仅可以在平行机关之间行文,而且可以在不相隶属的机关之间行文,其中包括上级机关或者下级机关行文。在适用的内容方面,它除了主要用于不相隶属机关相互洽工作、询问和答复问题外,也可以向有关主管部门请求批准事项,向上级机关询问具体事项,还可以用于上级机关答复下级机关的询问或请求批准事项,以及上级机关催办下级机关有关事宜,如要求下级机关函报报表、材料、统计数字等。此外,函有时还可用于上级机关对某件原发文件作较小的补充或更正。不过这种情况并不多见。 二、函的特点 (一)沟通性。函对于不相隶属机关之间相互洽工作、询问和答复问题,起着沟通作用,充分显示平行文种的功能,这是其他公文所不具备的特点。 (二)灵活性。表现在两个方面:一是行文关系灵活。函是平行公文,但是它除了平行行文外,还可以向上行文或向下行文,没有其他文种那样严格的特殊行文关系的限制。二是格式灵活,除了国家高级机关的主要函必须按照公文的格式、行文要求行文外,其他一般函,比较灵活自便,也可以按照公文的格式及行文要求办。可以有文头版,也可以没有文头版,不编发文字号,甚至可以不拟标题。(三)单一性。函的主体内容应该具备单一性的特点,一份函只宜写一件事项。 三、函的分类。 (一)按性质分,可以分为公函和便函两种。公函用于机关单位正式的公务活动往来;便函则用于日常事务性工作的处理。便函不属于正式公文,没有公文格式要求,甚至可以不要标题,不用发文字号,只需要在尾部署上机关单位名称、成文时间并加盖公章即可。 (二)按发文目的分。函可以分为发函和复函两种。发函即主动提出了公事事项所发出的函。复函则是为回复对方所发出的函。 (三)另外,从内容和用途上,还可以分为洽事宜函,通知事宜函,催办事宜函,邀请函、请示答复事宜函,转办函,催办函,报送材料函等等。 四、函的结构、内容和写法 由于函的类别较多,从制作格式到内容表述均有一定灵活机动性。主要介绍规范性公函的结构、内容和写法。 公函由首部、正文和尾部三部分组成。其各部分的格式、内容和写法要求如下:(一)首部。主要包括标题、主送机关两个项目内容。 1、标题。 2、主送机关。 (二)正文。其结构一般由开头、主体、结尾、结语等部分组成。 (三)结尾。一般用礼貌性语言向对方提出希望。或请对方协助解决某一问题,或请对方及时复函,或请对方提出意见或请主管部门批准等。 (四)结语。通常应根据函询、函告、函或函复的事项,选择运用不同的结束语。如“特此函询()”、“请即复函”、“特此函告”、“特此函复”等。有的函也可以

软件开发文档范例

文档编号:_________ _________ 文档名称:____________ 项目名称:____________ 项目负责人:____________ 编写:___________ ____年__月__日 校对:___________ ____年__月__日 审核:___________ ____年__月__日 批准:___________ ____年__月__日

开发单位:传讯网络信息 ________________________ 系统规格说明 一、系统功能和目标: 随着因特网的不断普及,国的用户数呈指数级增长。作为因特网最为常用的电子系统越来越受到人们的喜爱,为了满足不断增长的信息交换的需要,各行各业都希望有自己的系统。传讯网络信息自主设计开发了适合中国国情的免费电子系统,用以解决这一日益突出的问题。CHINATION 免费电子系统是专为免费电子服务商、企业集团设计的电子系统。 Chination免费电子系统的设计目标是立足于一个高度集成的、功能强大、技术先进的电子系统。高度集成意味着本系统将把硬盘软件集成在一起。系统是基于LINUX下的,硬盘和软件的集成使得系统具有绝对的安装优势。功能强大意味着系统的实用性,功能的全面性,系统的安全性和可靠性。技术先进意味着将最新版本的LDAP,IMAP,POSTFIX,MYSQL,APACHE和PHP的巧妙结合。 本系统要实现的主要功能有:

1.用户申请注册功能。用户通过申请可以得到一个自己命名的信箱,容量大小为10M。 2.用户忘记密码处理功能。用户忘记密码可以通过注册时设置的密码提示问题来重设密码。 3.用户收功能。它包括SMTP收、POP3取和WWW读三种方式。 4.用户发功能。它包括SMTP发、WWW直接发送、暗送、抄送、定时发送。 5.用户信件处理功能。系统初始设置4个文件夹来分类处理信件:收件箱、发件箱、草稿箱和垃圾箱。用户还可以自己建立新的文件夹。信件在各个信箱之间可以相互移动。 6.用户查找功能。用户可以使用查找功能通过查找信件主题或信件容来找到自己需要的信件。 7.用户信箱配置设置。它包括个人资料更改、密码更改、参数设置、POP3服务器设置、过滤器设置、自动转信、定时发信、签名设置。 8.管理员管理用户和信箱功能。包括输入(增删改)、查询、统计、报表。系统性能参数设置。 9.广播功能。它用于公司定期向一定的用户发送信息,由于一般的用户数有一定数量,所以必须用数据库管。 二、可行性分析 1.技术可行性 本软件拟决定最终在分布式系统上来运行。硬件方面,由于传讯网络信息是国外多家公司并行处理产品的代理商,而且自己本身拥有ALPHA机等先进设备,所以有足够能力开发出先进的电子系统。软件方面,我们拟采用以下几种软件: 1)操作系统用LINUX。Linux作为一个优秀的网络操作系统,它的发行版本中集成了大量的网络应用软件,如Web服务器(apache)、Ftp服务器(wu-ftp)、服务器(sendmail+imap4)、SQL数据库(postgresql)等,可以快速的构建Intranet环境,并且也有精致的收发程序(metamail)和强大的Web 服务器端开发工具(PHP4)。当你配置好sendmail并激活imapd后,你的Linux用户都可以使用Outlook等客户端软件进行收发,只要通过将它们集中进行应用,便可以实现一个简单的Webmail 服务器的功能。但是随着自由软件的不断开发,要构架一个好的电子系统,就面临着软件选择是否适当、性能是否比别人好的问题。下面列出我们所使用的软件。 2)本系统壳软件用imap。有几种方法可以构造电子系统的壳:共享文件系统的策略,基于局域网的专用协议,X.400P7协议和因特网消息存取协议。而基于INTERNET的协议主要有:POP (Post Office Protocol), DMSP (Distributed Mail System Protocol), 和IMAP (Internet Message Access Protocol).POP是最原始,最为人们所知的一种。DMSP仅局限于一个简单应用——PCMAIL,它的优点主要在于对脱机状态操作的支持。IMAP不但继承了POP和DMSP的优点,而且超越了他们的缺点,提供了三种状态下对远程信箱的访问:在线、不连接和脱机状态。在脱机状态,可以发送到一个共享的服务器,但是客户并不是马上全部把它们COPY过去之后在服务器上删掉它们,

C#如何读取IC卡,IC卡的操作代码

C#程序开发范例_IC卡读写 C#程序开发范例宝典13.3IC卡应用 https://www.doczj.com/doc/937605361.html,/ 2007-9-7 16:37:00 图书导读当前章节:13.3IC卡应用·1.14其他技术·13.1串口控制·13.2加密狗·13.4监控·13.5语音卡控制·13.6手机程序开发加拿大·达内专注高端it培训名企定向委培 为纳斯达克上市公司定向委培高级软件工程师国内最强大专家团队组合授课,确保高薪就业https://www.doczj.com/doc/937605361.html, 管理不可能管理的项目! 要减少失败的风险组织必须转向IT 开发的治理模型 https://www.doczj.com/doc/937605361.html, 如何开发智能客户端应用 离线应用模块的合理利用 https://www.doczj.com/doc/937605361.html,/cd/ids... 13.3 IC卡应用 IC(Integrated Circuit)卡,也被称作智能卡(Smart Card),具有写入数据和存储数据的功能,IC卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。由于其内部具有集成电路,不但可以存储大量信息,具有极强的保密性能,并且还具有抗干扰、无磨损、寿命长等特性。因此在各个领域中得到广泛应用。下面通过两个实例介绍IC卡的简单应用。 实例422向IC卡中写入数据 实例说明 IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。下面介绍如何向IC卡中写入数据。运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。如图13.6所示。 技术要点 本例使用的是深圳明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。 本例通过调用Mwic_32.dll链接库,进行IC卡的读写工作。下面介绍与IC卡写操作相关的几个函数。

软件开发文档模板

软件开发文档模板 1 可行性研究报告 可行性研究报告的编写目的是:说明该软件开发项目的实现在技术、经济和社会条件方面的可行性;评述为了合理地达到开发目标而可能先择的各种方案;说明论证所选定的方案。可行性研究报告的编写内容要求如下: 1.1 引言 1.1.1 编写目的 1.1.2 背景 1.1.3 定义 1.1.4 参考资料 1.2 可行性研究的前提 1.2.1 要求 1.2.2 目标 1.2.3 条件、假定和限制 1.2.4 进行可行性研究的方法 1.2.5 评价尺度 1.3 对现有系统的分析 1.3.1 数据流程和处理流程 1.3.2 工作负荷 1.3.3 费用开支 1.3.4 人员 1.3.5 设备 1.3.6 局限性 1.4 所建议的系统 1.4.1 对所建议系统的说明 1.4.2 数据流程各处理流程 1.4.3 改进之处 1.4.4 影响 1.4.4.1 对象设备的影响 1.4.4.2 对软件的影响 1.4.4.3 对用户单位机构的影响 1.4.4.4 对系统动行的影响 1.4.4.5 对开发的影响 1.4.4.6 对地点和设施的影响 1.4.4.7 对经费开支的影响 1.4.5 局限性 1.4.6 技术条件方面的可行性 1.5 可选择其他系统方案 1.5.1 可选择的系统方案 1 1.5.2 可选择的系统方案 2 …… 1.6 投资及收益分析 1.6.1 支出 1.6.1.1 基本建设投资

1.6.1.2 其他一次性支出 1.6.1.3 非一次性支出 1.6.2 收益 1.6. 2.1 一次性收益 1.6. 2.2 非一次性收益 1.6. 2.3 不可定量的收益 1.6.3 收益/投资比 1.6.4 投资回收周期 1.6.5 敏感性分析 1.7 社会条件方面的可行性 1.7.1 法律方面的可行性 1.7.2 使用方面的可行性 1.8 结论 2 项目开发计划 编制项目开发计划的目的是用文件的形式,把对于在开发过程中各项工作的负责人员、开发进度所需经费预算、所需软、硬件条件等问题作出安排记载下来,以便根据本计划开展和检查本项目的开发工作。编制内容要求如下: 2.1 引言 2.1.1 编写目的 2.1.2 背景 2.1.3 定义 2.1.4 参考资料 2.2 项目概述 2.2.1 工作内容 2.2.2 主要参加人员 2.2.3 产品及成果 2.2. 3.1 程序 2.2. 3.2 文件 2.2. 3.3 服务 2.2. 3.4 非移交产品 2.2.4 验收标准 2.2.5 完成项目的最迟期限 2.2.6 本计划的审查者与批准者 2.3 实施总计划 2.3.1 工作任务的分解 2.3.2 接口人员 2.3.3 进度 2.3.4 预算 2.3.5 关键问题 2.4 支持条件 2.4.1 计算机系统支持 2.4.2 需要用户承担的工作 2.4.3 需由外单位提供的条件 2.5 专题计划要点

软件开发文档标准

可行性研究报告 来源:国家计算机标准和文件模板作者: 可行性研究报告的编写目的是:说明该软件开发项目的实现在技术、经济和社会条件方面的可行性;评述为了合理地达到开发目标而可能选择的各种方案;说明并论证所选定的方案。 可行性研究报告的编写内容要求如下: 1 引言 1.1编写目的 说明编写本可行性研究报告的目的,指出预期的读者。 1.2背景 说明: a.所建议开发的软件系统的名称; b.本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络; C.该软件系统同其他系统或其他机构的基本的相互来往关系。 1.3定义 列出本文件中用到的专门术语的定义和外文首字母组词的原词组。 1.4参考资料 列出用得着的参考资料,如: a.本项目的经核准的计划任务书或合同、上级机关的批文; b.属于本项目的其他已发表的文件; C.本文件中各处引用的文件、资料,包括所需用到的软件开发标准。| 列出这些文件资料的标题、文件编号、发表日期和出版单位,说明能够得到这些文件资料的来源。 2 可行性研究的前提 说明对所建议的开发项目进行可行性研究的前提,如要求、目标、假定、限制等。 2.1要求 说明对所建议开发的软件的基本要求,如: a.功能; b.性能; C.输出如报告、文件或数据,对每项输出要说明其特征,如用途、产生频度、接口以及分发对象; d.输入说明系统的输入,包括数据的来源、类型、数量、数据的组织以及提供的频度; e.处理流程和数据流程用图表的方式表示出最基本的数据流程和处理流程,并辅之以叙述; f.在安全与保密方面的要求; g.同本系统相连接的其他系统;

h.完成期限。 2.2目标 说明所建议系统的主要开发目标,如: a.人力与设备费用的减少; b.处理速度的提高; C.控制精度或生产能力的提高; d.管理信息服务的改进; e.自动决策系统的改进; f.人员利用率的改进。 2.3条件、假定和限制 说明对这项开发中给出的条件、假定和所受到的限制,如: a.所建议系统的运行寿命的最小值; b.进行系统方案选择比较的时间; c.经费、投资方面的来源和限制; d.法律和政策方面的限制; e.硬件、软件、运行环境和开发环境方面的条件和限制; f.可利用的信息和资源; g.系统投入使用的最晚时间。 2.4进行可行性研究的方法 说明这项可行性研究将是如何进行的,所建议的系统将是如何评价的。摘要说明所使用的基本方法和策略,如调查、加权、确定模型、建立基准点或仿真等。 2.5评价尺度 说明对系统进行评价时所使用的主要尺度,如费用的多少、各项功能的优先次序、开发时间的长短及使用中的难易程度。 3 对现有系统的分析 这里的现有系统是指当前实际使用的系统,这个系统可能是计算机系统,也可能是一个机械系统甚至是一个人工系统。 分析现有系统的目的是为了进一步阐明建议中的开发新系统或修改现有系统的必要性。 3.1处理流程和数据流程 说明现有系统的基本的处理流程和数据流程。此流程可用图表即流程图的形式表示,并加以叙述。 3.2工作负荷 列出现有系统所承担的工作及工作量。 3.3费用开支 列出由于运行现有系统所引起的费用开支,如人力、设备、空间、支持性服务、材料等项开

C如何读取IC卡,IC卡的操作代码

C#程序开发范例宝典13.3IC卡应用 2007-9-7 16:37:00 图书导读当前章节:13.3IC卡应用·1.14其他技术·13.1串口控制·13.2加密狗·13.4监控·13.5语音卡控制·13.6手机程序开发加拿大·达内专注高端it培训名企定向委培 为纳斯达克上市公司定向委培高级软件工程师国内最强大专家团队组合授课,确保高薪就业 管理不可能管理的项目! 要减少失败的风险组织必须转向IT 开发的治理模型 如何开发智能客户端应用 离线应用模块的合理利用 13.3 IC卡应用 IC(Integrated Circuit)卡,也被称作智能卡(Smart Card),具有写入数据和存储数据的功能,IC卡内存储器的内容可以根据需要有条件地供外部读取,完成信息处理和判定。由于其内部具有集成电路,不但可以存储大量信息,具有极强的保密性能,并且还具有抗干扰、无磨损、寿命长等特性。因此在各个领域中得到广泛应用。下面通过两个实例介绍IC卡的简单应用。 实例422向IC卡中写入数据 实例说明 IC卡是携带应用信息和数据的媒体,空白IC卡是不能立即使用的,必须对IC卡应用系统进行初始化,写入系统IC卡和个人密码,个人专用信息和应用数据。下面介绍如何向IC卡中写入数据。运行本例,在“数据”文本框中输入要存入IC卡中的数据,单击“写数据”按钮,即可将输入的数据写入IC卡中。如图13.6所示。 技术要点 本例使用的是深圳明华生产的明华IC卡读写器,用户在使用时将驱动程序安装完毕后,即可正常使用本系统。 本例通过调用Mwic_32.dll链接库,进行IC卡的读写工作。下面介绍与IC卡写操作相关的几个函数。

公文写作范文大全

公文写作范文大全

公文写作范文大全 一、命令(令) 可考系数:★ 适用范围:适用于依照有关法律公布行政法规和规章;宣布施行重大强制性行政措施;奖惩有关单位及人员;撤销下级机关不适当的决定等。 参考例文: 中华人民共和国国务院令 第546 号 1951 年8 月8 日政务院公布的《城市房地产税暂行条例》自2009 年1 月1 日起废止。自2009 年1 月1 日起,外商投资企业、外国企业和组织以及外籍个人,依照《中华人民共和国房产税暂行条例》缴纳房产税。1987 年2 月6 日国务院批准,1987 年2 月24 日交通部、财政部发布的《长江干线航道养护费征收办法》自2009 年1 月1 日起废止。1992 年5 月15 日国务院批准,1992 年8 月4 日交通部、财政部、国家物价局发布的《内河航道养护费征收和使用办法》自2009 年1 月1 日起废止。 总理温家宝 二○○八年十二月三十一日二、决定 可考系数:★★★ 适用范围:适用于对重要事项或者重大行动做出安排,奖惩有关单位及人员,变更或者撤销下级机关不适当的决定事项。一般可以分为知照性决定、指挥性决定、奖惩性决定。 参考例文: 关于表彰全省优秀农民工和农民工工作先进集体的决定 各市、县人民政府,省农民工工作领导小组各成员单位:农民工是改革开放和工业化、城镇化进程中涌现的一支新型劳动大军,是产业工人的重要组成部分,是推动经济社会发展的重要力量。近年来,各地各有关部门和单位认真贯彻落实国家和省的决策部署,致力于解决农民工问题,取得了显著成绩,产生了一批农民工工作先进集体;广大农民工主动融入城市社会,积极投身江苏“两个率先”伟大实践,为促进经济社会又好又快发展作出了重要贡献,在各行各

软件工程文档模板范例.doc

目录 三、需求规格说明书 (2) 四、概要设计说明书 (12) 五、详细设计说明书 (15)

3软件需求说明书 软件需求说明书的编制是为了使用户的软件开发者双方对该软件的起初规定有一个共同的理解,使之成为整个开发工作的基础。编制软件需求说明书的内容要求如下: 3.1引言 3.1.1编写的目的 3.1.2背景 3.1.3定义 3.1.1参考资料 3.2任务概述 3.2.1目标 3.2.2用户的点 3.2.3假定与约束 3.3需求规定 3.3.1对功能的规定 3.3.2对性能的规定

3.3.2.1精度 3.3.2.2时间特性要求 3.3.2.3灵活性 3.3.3输入输出要求 3.3.4数据管理能力的要求 3.3.5故障处理要求 3.3.6其它的专门的要求 3.4运行环境规定 3.4.1设备 3.4.2支持软件 3.4.3接口 3.4.4控制 4数据需求说明书 数据要求说明书的编制目的是为了向整个开发时期提供关于处理数据的描述和数据采集要求的技术信息。编制数据要求说明书的内容要求如下: 4.1引言

4.1.1编写目的 4.1.2背景 4.1.3定义 4.1.4参考资料 4.2数据的逻辑描述 4.2.1静态数据 4.2.2动态输入数据 4.2.3动态输出数据 4.2.4内部生成数据 4.2.5数据约定 4.3数据的采集 4.3.1要求和范围 4.3.2输入的承担者 4.3.3处理 4.3.4影响 5概要设计说明书 概要设计说明书可称作系统设计说明书,这里说的系统是指程序系统,编制的目

的是说明对程序的系统的设计考虑,包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计、运行设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。编制概要设计说明书的内容要求如下: 5.1引言 5.1.1编写目的 5.1.2背景 5.1.3定义 5.1.4参考资料 5.2总体设计 5.2.1需求规定 5.2.2运行环境 5.2.3基本设计概念和处理流程 5.2.4结构 5.2.5功能需求与程序的关系 5.2.6人工处理过程

C# 课程设计

吉林工程技术师范学院 信息工程学院 《 C#程序设计》 课程设计报告 题目:学生成绩管理系统 专业:软件工程 班级: R1241 姓名:李继聪 学号: 120111423 指导教师:刘明陈泰宇 时间: 2015年5月8日

摘要 学生成绩管理系统是典型的信息管理系统,其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前者要求建立起数据一致性和完整性强、数据安全性好的库。而对于后者则要求应用程序功能完备、易使用、界面美观等特点。本次开发使用了 Microsoft 公司的 visualstudio2008 开发工具,利用其提供的各种面向对象的开发工具,尤其是数据窗口这一能方便而简洁操纵数据库的智能化对象,首先在短时间内建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成用户满意的可行系统。 关键词:sql2005,C#.NET,成绩管理系统,信息管理系统。

目录 一、课程设计的目的 (2) 二、设计方案的论证(背景、意义、技术路线) (3) 三、设计实现过程 (4) 四、调试运行及结果分析 (9) 五、测试及问题探讨 (14) 六、课设总结与体会 (15) 七、致谢 (16) 八、参考文献 (17) 九、附录 (18)

一、课程设计的目的 本课程设计的目的是使学生能熟练掌握简单的简单Windows窗体应用程序的设计和https://www.doczj.com/doc/937605361.html,的应用,希望通过本次课程设计锻炼学生使用C#语言解决实际问题的能力。 开发出新一代的学生成绩信息管理系统,使该系统具有快捷,灵活,安全可靠,高效敏捷的特点: (1)通过计算机使学生成绩实现管理系统信息化; (2)提高运行效率,从而实现灵活,方便的操作; (3)功能比较完善的数据管理软件,要具有数据操作方便高效,迅速等优点; 可通过访问权限控制等确保数据的安全性。

2020公文写作范文大全3

2020公文写作范文大全3 20xx公文写作范文大全一:会议纪要 可考系数:★★ 适用范围:会议纪要是一种应用非常普遍的通用公文,无论党政军机关、企事业单位、社会团体等组织,只要运用会议这一工作形式民主决策、研究问题、听取意见等,就会使用会议纪要记载和传达会议情况和议定事项。 例文参考: 全国抗震办主任座谈会会议纪要 为了贯彻《房屋建筑工程抗震设防管理规定》(建设部令第148 号)精神,加强全国抗震防灾管理工作,建设部工程质量安全监督与行业发展司于20xx 年5 月25 日至26 日在江西省九江市召开了“全国抗震办主任座谈会”。建设部工程质量安全监督与行业发展司司长徐波、副司长曾少华和江西省建设厅、九江市政府、九江市建设局的有关领导同志出席了会议。各省、自治区、直辖市抗震办公室主任(处长),及有关专家参加了会议。现将会议主要内容纪要如下:会议由曾少华同志主持。徐波同志在讲话中进一步阐明了抗震防灾工作的重要意义,总结了自去年在云南召开全国抗震办主任座谈会

以来所做的主要工作,提出了建设系统开展抗震工作的总体要求和工作措施,部署了今后一个时期的重点工作。会上,江西省、新疆自治区、北京市、江苏省抗震办的负责同志分别介绍了各自的抗震工作经验;全国超限高层抗震设防审查专家委员会、北京工业大学和中国建筑科学研究院的专家作了有关专题报告;代表们对《关于进一步加强村镇建设抗震防灾工作的通知(讨论稿)》和《市政基础设施工程抗震设防管理规定(草案)》提出了修改意见和建议。全体与会代表还赴瑞昌地震灾区考察了震后建筑破坏情况和恢复重建工作,进一步增强了工作的责任感和紧迫感。 会议指出,今后建设系统的抗震防灾工作要…… 会议提出了以下工作措施:…… 与会代表表示,会后要向相关负责同志汇报、传达会议精神,进一步振奋精神,努力工作,结合各地实际情况,把会议精神落到实处。 【璧尘提醒】 会议纪要的一般结构可分为标题、开头、正文、结尾几个部分。 1、标题 会议纪要的标题要完整和明确,要在“纪要”前冠以会议的名称,使人一目了然。会议的名称要写全称,“纪要”的具体名称也要写明

软件开发文档模板

1引言 编写目的 背景 定义 参考资料 2总体设计 需求规定 运行环境 基本设计概念和处理流程 结构 功能器求与程序的关系 人工处理过程 尚未问决的问题 3接口设计 用户接口 外部接口 内部接口 4运行设计 运行模块组合 运行控制 运行时间 5系统数据结构设计 逻辑结构设计要点 物理结构设计要点 数据结构与程序的关系 6系统出错处理设计

出错信息 补救措施 系统维护设计 **************************************** 2、 ISO9001标准文档模版 第1章引言 编写目的 术语 参考文献 第2章系统概述 系统说明 系统任务 2.2.1 系统目标 2.2.2 运行环境 2.2.3 与其它系统关系 需求规定 2.3.1 功能需求 2.3.2 性能需求 2.3.3 数据要求 2.3.4 其它 第3章总体设计 系统物理结构 3.1.1 系统流程图 3.1.2 设备清单 软件结构图

3.2.1 模块结构图 3.2.2 模块清单 第4章模块功能描述 模块1(标识符)功能 模块2 (标识符)功能 第5章接口设计 用户界面 硬件接口 软件接口 通信接口 第6章数据结构设计 数据结构1 (标识符) 6.1.1 结构属性 6.1.2 逻辑结构 6.1.3 物理结构 6.1.4 数据元素 数据结构2 (标识符) 第7章运行设计 运行1 7.1.1 运行模块组合运行名称 7.1.2 运行控制操作 7.1.3 运行时间 运行2 第8章系统安全 系统安全 数据安全 后备与恢复

出错处理 计算机病毒的防治措施 第9章功能需求、数据结构和模块 功能需求与模块关系 数据结构与模块关系 **************************************** 概要设计说明书 1 引言 写目的:阐明编写概要设计说明书的目的,指明读者对象。 项目背景:应包括 ●项目的委托单位、开发单位和主管部门 ●该软件系统与其他系统的关系。 定义:列出本文档中所用到的专门术语的定义和缩写词的愿意。 参考资料: ●列出这些资料的作者、标题、编号、发表日期、出版单位或资料来源 ●项目经核准的计划任务书、合同或上级机关的批文;项目开发计划;需求规格说明书;测试计划(初稿);用户操作手册 ●文档所引用的资料、采用的标准或规范。 2 任务概述 目标 需求概述 条件与限制 3 总体设计 总体结构和模块外部设计

软件项目开发文档样例

现代物流企业管理系统开发方案 目录 前言 (2) 1.系统开发背景 (2) 2.系统主要目标和内容 (2) 3.系统开发的原则 (3) 4.系统框架逻辑结构及企业配送中心的组织结构图 (4) 5.系统主要功能描述 (5) 5.1系统的功能构成 (5) 5.2系统功能模块描述 (7) 5.2.1网上交易平台 (7) 5.2.2订单管理 (8) 5.2.3进货管理其结构 (9) 5.2.4仓储管理其结构图 (10) 5.2.5 配货管理其结构 (11) 5.2.6发货管理其结构 (11) 5.2.7 配送运输管理其结构 (12) 5.2.9 查询中心 (15) 5.2.10 财务管理: (15) 5.2.11 客户管理: (15) 5.2.12 客服管理: (16) 5.2.13 OA管理: (16)

5.2.14 报关管理: (17) 5.2.15 认证系统 (17) 5.2.16 网上银行系统 (18) 5.2.17 系统后台维护与安全 (18) 6.VCPL系统流程 (18) 7.条码应用 (23) 7.1生产线上的产品跟踪 (23) 7.2产品标签管理 (23) 7.3产品入库管理 (24) 7.4产品出库管理 (24) 7.5仓库内部管理 (24) 7.6货物配送 (25) 7.7保修维护 (25) 7.8二维条码优点 (25)

前言 为了满足企业集团、大型企业、物流企业物流配送的需要,"长春九州商贸公司"依托自身长期从事电子商务应用物流配送服务所积累的技术和经验,以几年来开发成功的电子商务项目为基础,开发出"长春九州商贸公司" 现代物流企业管理系统。现代物流也是电子商务的重要支撑系统,在电子商务环境下,企业系统已成为企业现代化、商务电子化时代的重要任务,为适应企业集团现代物流的需要,长春九州商贸公司电子商务应用研究所组织本所优秀技术人员在仓库协调系统的基础上研发出这一套系统。 1.系统开发背景 现在大多数物流配送企业(第三方物流配送或集团企业物流配送)由于其电子商务化程度低、物流理念滞后,物流配送活动仍停留在传统方式上,信息化、自动化、集成化程度低、速度慢、差错多。因此,物流配送工作必须实现电子商务化、现代化,充分利用互联网、射频技术等现代化的IT技术加强网络、网站等电子商务方面的输入和放送。完善以电子商务为基础的物流配送系统,为物流取得更大的客户群和高效、快速、准确的配送创造条件。同时,也为企业进行快速、准确的物流分析和物流决策提供可靠的依据,以提高竞争力。

相关主题
文本预览
相关文档 最新文档