第一篇:江西理工大学安卓Android期末考试2018
1.在 android 中使用 RadioButton 时,要想实现互斥的选择需要用的组件是 ? A、ButtonGroup C、CheckBox
B、RadioButtons D、RadioGroup 2.关于 Handler 的说法正确的是()A、它实现不同线程间通信的一种机制 B、它避免了新线程操作 UI 组件 C、它采用栈的方式来组织任务的 D、它可以属于一个新的线程
3.下列哪个可做EditText编辑框的提示信息? A、android:inputType C、android:digits
B、android:text D、android:hint 4.退出Activity对一些资源及状态的操作保存,可在生命周期的哪个函数中进行。()A、onPause()B、onCreate()C、onResume()D、onStart()5.Android项目工程下面的assets目录的作用是什么?()
A、放置应用到的图片资源Res/drawable。
B、主要放置一些文件资源,这些文件会被原封不动打包到apk里面
C、放置字符串,颜色,数组等常量数据 res/values
D、放置一些与 UI 相应的布局文件,都是 xml 文件 res/layout
6.Intent的作用是()
A、intent是连接四大组件的纽带,可以实现界面间切换,可以包含动作和动作数据。
B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因 为切换页面而消失。
C、实现应用程序间的数据共享。D、处理一个应用程序整体性的工作。
7.下列哪个是AbsoluteLayout中特有的属性?()A、android:layout_height B、android:layout_x
C、android:layout_above D、android:layout_toRightOf 8.在手机开发中常用的数据库是()
A、sqlLite
B、Oracle
C、Sql Server
D、Db23
9.关于BroadcastReceiver的说法不正确的是()A、是用来接收广播Intent的。
B、一个广播Intent只能被一个订阅了此广播的BroadcastReceiver所接收。C、对有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者。D、接收者声明的优先级别在
B 明显错误,广播可以被订阅了该广播的所有接受者接收。10.使用MediaPlayer播放保存在sdcard上的mp3文件时()A、需要使用MediaPlayer.create方法创建MediaPlayer。B、直接newMediaPlayer即可。
C、需要调用setDataSource方法设置文件源。D、直接调用start方法,无需设置文件源。
11.在android中使用RadioButton时,要想实现互斥的选择需要用的组件是()A、ButtonGroup B、RadioButtons C、CheckBox D、RadioGroup 12.在多个应用中读取共享存储数据时,需要用到的query方法,是哪个对象的方法?()A、ContentResolver
C、Cursor
个方法。
2、使用ContentResolver是用来操作数据的。贴一张李刚的《疯狂Android讲义》第9章9.2开头对这部分ContentResolver的原话.B、ContentProvider D、SQLiteHelper
1、无论是ContentProvider还是ContentResolver都有各自的insert(),delte(),uapdte(),query(),四
注意红色框起来的部分,调用的是ContentResolver的的的
3、再不行上一小段代码证明吧:我们在avtivity的onCreate()里边写一句代码就可以。把鼠标放在query()函数上,可以看到解释的是ContentResolver的query(),不是ContentProvider的
13.内存监测工具DDMS中Log信息分为几个级别?()
A、3
B、4
C、5
D、6 14.关于自定义Adapter的优化方法,我们通常采用三种方式,则以下能采用的是()A、复用布局视图对象 B、图片异步加载 C、组件重用 D、创建一个内部类 应该是不能采用的是什么:B、图片异步加载 15.在多个应用中读取共享存储数据时,需要用到的query方法,是哪个对象的方法?()
A、ContentResolver C、Cursor
B、ContentProvider D、SQLiteHelper 16.在android中使用RadioButton时,要想实现互斥的选择需要用的组件是()
A、ButtonGroup
C、CheckBox
B、RadioButtons
D、RadioGroup 17.能够自动完成输入内容的组件是()
A、TextView
B、EditText
D、AutoCompleteTextView C、ImageView
18.表示下拉列表的组件是()
A、Gallery
B、Spinner
C、GridView
D、ListView 19.在Activity中需要找到一个id是bookName的的TextView组件,下面哪种语句写法是 正确的?()
A、TextView tv = this.findViewById(R.id.bookName);B、TextView tv =(TextView)this.findViewById(R.id.code);C、TextView tv =(TextView)this.findViewById(R.id.bookName);D、TextView tv =(TextView)this.findViewById(R.string.bookName);20.Android SDK中提供了一个什么处理图片的工具解决不同屏幕分辨率适配的问题。()
A、Draw7-patch B、Draw8-patch C、Draw9-patch D、Draw10-patch
21.下列说法错误的是()A、Button是普通按钮组件,除此外还有其他的按钮组件。B、TextView是显示文本的组件,TextView是EditText的父类。C、EditText是编辑文本的组件,可以使用EditText输入特定的字符。D、ImageView是显示图片的组件,可以通过设置显示局部图片。一般来说android不能设置显示图片中的局部
22.Android API将什么以Content Provider的方式提供给开发者,使其可以对通讯录进 行一系列操作?()
A、文件浏览器 B、数据库文件 C、系统通讯录 D、数据表 23.关于BroadcastReceiver的说法不正确的是()
A、是用来接收广播Intent的。
B、一个广播Intent只能被一个订阅了此广播的BroadcastReceiver所接收。C、对有序广播,系统会根据接收者声明的优先级别按顺序逐个执行接收者。D、接收者声明的优先级别在
24.Android API 提供了一系列的类来实现或操作Content Provider相关功能,以下未涉及到的一类是()
A、Content Provider B、Content Resolver C、ContentValues D、Content Changer 25.ArrayAdapter通常用什么构造方法进行构建?()
A.ArrayAdapter
26.表示下拉列表的组件是()
A、Gallery
B、Spinner
C、GridView
D、ListView 27.下列说法错误的是()A、Button是普通按钮组件,除此外还有其他的按钮组件。B、TextView是显示文本的组件,TextView是EditText的父类。C、EditText是编辑文本的组件,可以使用EditText输入特定的字符。D、ImageView是显示图片的组件,可以通过设置显示局部图片。28.能够自动完成输入内容的组件是()
A、TextView B、EditText C、ImageView D、AutoCompleteTextView
29、处理菜单项单击事件的方法不包含()
A、使用onOptionsItemSelected(MenuItem item)响应。
B、使用onMenuItemSelected(int featureId,MenuItem item)响应。C、使用onMenuItemClick(MenuItem item)响应。D、使用onCreateOptionsMenu(Menu menu)响应。1.列举Android系统中的五个进程优先级,并作出详细介绍。答:前台进程>可见进程>服务进程>后台进程>空进程。(1)前台进程,表明用户正在与该进程进行交互操作。
(2)可见进程,指部分程序界面能够被用户看见,却不在前台与用户进行交互,不响应界面事件的进程。
(3)服务进程,指包含已启动服务的进程,特点是没有用户界面,在后台长期运行。(4)后台进程,指不包含任何已经启动的服务,而且没有用户可见的Activity进程。(5)空进程,不持有任何活动组件的进程。
2.介绍Android系统有四个重要的组件。
答:Android系统的四种基本组件Activity、Service、Broadcase Receiver和Content Provider。(1)Activity是Android程序的呈现层,显示可视化的用户界面,并接收与用户交互所产生的界面事件,用于提示用户程序已经正常启动。
(2)Service一般用于没有用户界面,但需要长时间在后台运行的应用。(3)Broadcase Receiver是用来接受并响应广播消息的组件。
(4)Content Provider是Android系统提供的一种共享数据的机制,应用程序可以通过ContentProvider访问其他应用程序的私有数据。
3. 在Android生命周期过程中,Activity一般表现为哪4种状态? 答:(1)活动状态,完全能被用户看到,与用户进行交互的状态。
(2)暂停状态,Activity不处于用户界面的最上层,已经失去了焦点,不能与用户进行交互。
(3)停止状态,Activity在界面上完全不能被用户看到,保存了当前数据和UI状态。(4)死亡状态,Activity被系统销毁。
4.Android系统中Intent的定义和用途?Intent启动Activity方式有哪两种? 定义:为其他组件提供交互能力,将一个组件的数据和动作传递给另一个组件。用途:1)启动Activity和Service 2)发布广播消息
启动方式:显式调用,指明调用Activity的Class类;隐式调用,无需指明具体启动哪一个Activity,选择权由Android系统和最终用户类似决定。
5.使用Service的方式有哪两种?描述Service的生命周期。Context.startService()方式启动 Context.bindService()方式启动
6.SQLite数据库体系结构中最核心的部分是什么?
答:虚拟机/虚拟数据库引擎。完成与数据操作相关的全部操作并且是客户与储存之间信息进行交换的中间单元。
7.ContentProvider是应用程序之间一种什么样的接口机制?通过继承ContentProvider类可以创建一个新的数据提供者,请简述该过程。
答:ContentProvider为不同的软件之间数据共享,提供统一的接口。
1)定义URI,即统一资源标识符,作用是唯一标识 Content Provider 及其中的数据。2)设置MIME数据类型,作用是指定某个扩展名的文件用某种应用程序来打开。3)实现初始化、查询、插入、更新、删除、返回这几个方法。onCreate():初始化 provider insert():插入数据到 provider
query():查询数据
update():更新 provider 的数据
delete():删除 provider 中的数据 getType():返回 provider 中的数据的 MIME 类型 8.系统和用户之间进行信息交换的媒介是什么?实现什么信息的转换? 答:用户界面。实现信息的内部形式与人类可以接受形式之间的转换。
9.Android中使用什么接口定义远程服务的窗口?服务接口文件的扩展名是什么? 答: AIDL
10.简述Android系统三种菜单的特点及使用方式。
(1)选项菜单:可分为图标菜单和扩展菜单,图标菜单的子项最多是六个,支持显示图标,不支持单选框和复选框;而当子项多于六个时,采用扩展菜单,扩展菜单的子项是垂直排列,支持单选框和复选框,不支持显示图标。第一次启动选项菜单时,只需要调用一次onCreateMenu函数。
(2)子菜单:能够展示更加详细的信息,通过addSubMenu函数增加子菜单,但不支持嵌套。
(3)快捷菜单;点击界面元素超过2秒后,则启动该界面元素的快捷菜单。每次启动时都要调用一次onCreateMenu函数。
11.编写一个Android程序,使用AsyncTask实现获取网页html代码,并且使用TextView 显示。
public class MainActivity extends Activity {
// 定义组件
private EditText edtURL;private TextView edtHTTP;private Button btnRequest;
private String strURL;// 用于存储网站地址
private MyTask myTask;@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
// 初始化组件
edtURL =(EditText)findViewById(R.id.edturl);edtHTTP =(EditText)findViewById(R.id.edthttp);.aidl btnRequest =(Button)findViewById(R.id.requesthtml);
// 监听获取html代码的按钮
btnRequest.setOnClickListener(new View.OnClickListener(){
@Override public void onClick(View v){ if(!(strURL = edtURL.getText().toString()).equals(“")){ //实例myTask对象
myTask = new MyTask(edtHTTP);myTask.execute(strURL);}
} });} }
public class MyTask extends AsyncTask
private TextView edtHTTP;// 用于显示HTML代码 private StringBuffer sbHTML;// 用于储存HTML代码
public MyTask(TextView edtHTTP){
this.edtHTTP = edtHTTP;sbHTML = new StringBuffer();}
/** * doInBackground方法内部执行后台任务,不可在此方法内修改UI */ @Override protected StringBuffer doInBackground(String...params){ // 初始化HTTP的客户端
HttpClient hc = new DefaultHttpClient();// 实例化HttpGet对象
HttpGet hg = new HttpGet(params[0]);
try { // 让HTTP客户端已Get的方式请求数据,并把所得的数据赋值给HttpResponse的对象
HttpResponse hr = hc.execute(hg);// 使用缓存的方式读取所返回的数据
BufferedReader br = new BufferedReader(new InputStreamReader(hr.getEntity().getContent()));
// 读取网页所返回的HTML代码 String line = ”“;sbHTML = new StringBuffer();while((line = br.readLine())!= null){ sbHTML.append(line);}
return sbHTML;} catch(IOException e){
edtHTTP.setText(”获取网页HTML代码出错!!“);} return null;}
/** * onPostExecute方法用于在执行完后台任务后更新UI,显示结果 */ @Override protected void onPostExecute(StringBuffer result){ // 判断是否为null,若不为null,则在页面显示HTML代码 if(result!= null){ edtHTTP.setText(result);} super.onPostExecute(result);} } 12.编写一个程序,输入两个整数值,点击求和按钮后显示两个数的和。MainActivity.java public class MainActivity extends AppCompatActivity {
EditText one,two;Button add;TextView show;
@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);one = findViewById(R.id.one);two = findViewById(R.id.two);add = findViewById(R.id.add);show = findViewById(R.id.show);
add.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ String first = one.getText().toString();String second = two.getText().toString();try { int add = Integer.parseInt(first)Integer.parseInt(second);show.setText(”两数之和:“+ add);} catch(Exception e){ show.setText(”请输入数字!“);} } });} }
+
13.编程实现具有“登录按钮”的主界面,点击“登录”按钮后打开第二个Activity,第二个Activity上面显示主界面输入的用户名和密码,并定义返回键将用户名和密码 传递回主页面的Acivity中。MainActivity.java public class MainActivity extends AppCompatActivity {
EditText name,password;Button register;TextView show;
@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);
name = findViewById(R.id.name);password = findViewById(R.id.password);register = findViewById(R.id.register);show = findViewById(R.id.show);
register.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ String message = name.getText().toString()+ ”n“ + password.getText().toString();
Intent intent = new Intent(MainActivity.this, Second_Activity.class);intent.putExtra(”message“, message);startActivityForResult(intent,1);} });}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ if(requestCode==1 && resultCode==2){ String result=data.getStringExtra(”data“);show.setText(result);} super.onActivityResult(requestCode, resultCode, data);} }
Second_Activity.java public class Second_Activity extends Activity{ Button back;TextView message;String send;
@Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.second_view);
back = findViewById(R.id.back);message = findViewById(R.id.message);
Intent intent = getIntent();String result = intent.getStringExtra(”message“);send = result;message.setText(result);
back.setOnClickListener(new View.OnClickListener(){
@Override public void onClick(View view){ Intent data = new Intent();data.putExtra(”data“, send);setResult(2,data);
finish();} });
} }
第二篇:安卓android课程设计报告
湘潭大学课程设计报告
课
程 课
题指
导
名
称______手机安卓开发_______ 名
称______天气预报APP_______老
师______周唯___________
姓
名____黄柳________
学
号___2012600719_________ 班
级____12计2班________
小
组______棒棒糖_______ 时
间____2015年1月26 日_____
一、需求分析(一)引言
1.编写目的
1.1 为用户提供一个显示天气预报的软件,可以根据百度地图显示用户需求的城市位置,以及用图标表示各城市对应的气象信息,可以简洁的表示出“晴、雨、雪”和“气温”气象信息。
2.项目风险
2.1(项目风险识别是指找出影响项目目标顺利实现的主要风险因素,并识别出这些风险究竟有哪些基本特征、可能会影响到项目的那些方面。)2.2 联网收费视用户电话运营商的收费标准决定
2.3 手机或者无线信号不好时,可能无法连接或更新天气情况 3.预期读者和阅读建议
3.1 预期读者:会使用已经安装安卓系统的手机或者平板电脑及其他移动设备的用户
3.2 阅读建议:读者应通过该文档可以了解相关项目的需求分析、使用注意事项以及可能存在的风险
4.产品范围
2.2 手机,平板电脑,MP4,导航仪,上网本,电纸书等使用安卓系统的数码领域(二)综合描述
1.产品的状况
1.1 Android是一种以Linux为基础的开放源代码操作系统,主要使用于便携设备。目前未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。Android操作系统最初由Andy Rubin开发,最初主要支持手机。2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他数码领域上。我们开发的相关项目正是一个在安卓平台上开发的软件,可以用这个软件来实现用户在一些简单的手持设备如手机或者平板电脑等上面及时的了解到用户所在城市的天气预报。
2.产品的功能
2.1 天气信息获取 2.2 天气信息显示 3.系统配置功能
3.1 用户类和特性
安卓平台用户:安卓新用户可以使用软件来了解用户所在城市的天气预报。熟悉安卓平台用户还可以选择对相关软件的系统按自己的喜好进行配置并保留自己的个性化系统配置。
安卓软件开发者:安卓软件开发者(喜好者)可以通过相关的开源代码来了解软件运行的原理。
3.2 运行环境
软件需要在支持安卓系统的可移动设备中正确安装才能正常运行。安卓版本需在2.2及以上,同时建议用户如果是在手机移动设备使用的话,需确保手机支持联网服务。
3.3 设计和实现上的限制
Eclipse是开发相关应用软件的首选集成开发环境,安卓开发环境首先需要安装支持java应用软件运行的java开发软件包(即JDK),然后安装集成开发环境Eclipse,最后安装Android SDK的Eclipse的ADT插件。
Android SDK和Eclipse的ADT插件是必须使用的。
软件支持高效、快速的数据存储方式,包括快速数据存储方式SharedPreferences、文件存储和轻量级关系数据块SQLite,可软件可以使用适合的方法对数据进行进程保存和访问。
3.4 假设和约束(依赖)
软件必须在安卓系统下才可以正常运行,若需要获取天气更新或者是短信服务,需确保用户的数码设备支持联网及短信服务。(三)外部接口需求 1 2 用户的手机设备可以支持联网。用户界面 软件接口
软件提供轻量级的进程间通信机制Intent,实现跨进程组件通信。4 访问硬件的API库函数通讯接口
4.1 HTTP 协议:有多种接口可以调用你可以用Java类库封装的HttpConnection 或者用Apach的开源项目的 HttpGet 或者HttpPost,服务器端 需要 编写 Serlvet来响应客户端的请求。
4.2 Sokcet : 就是 服务器端 不断监听 双方约定好的端口号,客户端通过服务器IP去请求连接,连接成功后,得到Socket 的输入输出流,直接操作即可。(四)系统功能需求
天气信息显示和获取
功能描述:需有一个显示天气情况的用户界面,要求百度地图显示各城市位置(如:北京、长沙、广州等3-5个城市),以及用图标表示各城市对应的气象信息,表示出“晴、雨、雪”和“气温”简洁气象信息。输入输出信息:
输入:当触摸某一城市对应的气象图标时,显示该城市当天的温度、湿度、风向和雨雪详细天气信息,并预报该城市后面几天的气象信息。
输出:气象信息的获取,从百度上获取天气预报信息,这些天气数据是通过后台服务获取的,这个后台服务可以按照一定时间间隔,并将各城市的天气信息保存到SQLite数据库中。
二、概要设计
三、Ui界面
我们的ui界面秉承着清新的风格开发出来的。
整个软件界面使用一个线性布局,让所有的元素从屏幕上方向下填充,并给整个线性布局进行权重划分。
线性布局的最上方是一个TextView,显示当前城市的名字,接着往下是一个相对布局,相对布局的左侧是天气的图片,右侧是三个天气相关的参数。
接着是一个线性布局,布局的左上方是三个TextView,分别显示“预报”,“趋势”,“指数”功能,通过点击相应的TextView,下方的一个线性布局展现不同的功能。功能面板文字的下方是一个大的线性布局,用来显示未来三天的天气情况。在这个大的线性布局中,又含有三个小的线性布局,这三个小线性布局中包含了日期,天气图片和风力状况等(这些控件从上到下垂直居中显示)。
通过给整个XML文件中LinearLayout布局的的子级布局添加权重,让各个部分从上到下有序的显示,让当前城市名称在屏幕的上方显示,功能面板位于屏幕下方显示,以匹配不同尺寸屏幕,让软件的显示效果更好。软件的整体布局风格是清新,优美,大方。
四、功能设计
功能上实现实时的获取天气信息,获取百度api返回数据,解析百度api返回的json数据,根据解析到的数据绘制气温趋势图,并将数据反馈到app上的相应的区域。通过使用ViewPager类,来实现天气预报软件中多个城市间的无缝页面切换。由于组员都缺少JAVA开发经验,对安卓开发也不熟悉,所以我们决定采用调用API的方法来实时获取不同城市的天气预报数据,在这次项目中我们将采用百度的车载API。通过HttpClient类和AsyncTask异步类来获取网络数据。最后通过Gson类来解析获取的网络数据,并给页面中的所有的布局空间设置id,在AsyncTask得到网络数据之后将这些数据同步到软件界面上,呈现给用户。
三、功能模块
我主要负责监听程序的设计,监听用户按键,并进行相应的动作。
只要用户滑动面板,就切换到下一个城市,并获得下一个城市的天气数据,显示在面板上。每隔15分钟自动更新天气数据。主要代码如下:
下面的代码处理网络连接部分,用GSON解析网络上获得的Json网页:
下面代码访问网络:
四、心得体会
通过这个软件的实现,我对Android编程有了更加浓厚的兴趣,对Android中的常用类和接口有了进一步的认识。对编程有了一种新的看法,编程在我的学习中不再是那样的枯燥无味,而是时时刻刻充满惊喜。虽然这是一个挺小的项目但它对我在编程方面起到了一种激励的作用。我会在此基础上更加努力做出更好的程序。
第三篇:安卓(Android)游戏以及手机游戏开发的详细流程
安卓(Android)游戏以及手机游戏开发的详细流程【精华版】
>>首先说游戏设计部门
通常这是如下职位:游戏设计主负责(也有称主策划)执行游戏设计师(称执行策划):分剧情策划,数据策划,也有不分的,大家一起提高。辅助员(称辅助策划):做一些比较简单的表据维护,资料收集。
工作职责:
游戏设计主负责人:主要负责游戏设计的整体把握、给大家安排工作,审核工作,提高部门人员士气。,剧情策划一般负责背景,任务等等故事性比较强的,要求文笔要好
数据策划再细分,为规则和数据平衡,包括规则的描述,公式确定,数据表设定等等。辅助员,主要是收集资料,维护表格等等,比较不涉及核心的工作。*注:有一些公司或者团队,在策划岗位,还有新的岗位,如:
表现策划:主要负责特效、动作、音效收集并提需求,部分如音效部分亦有策划来完成。资源策划:主要负责UI设计,模型相关配置,资源管理等等。
>>下面是程序部门
主程序与主设计师,是对游戏引擎最了解的人,以主程序为最强。主程的主要工作,安排程序部门工作,定游戏的数据结构,定一些主要方案的完成方法。
一般程序员,分服务器端与客户端、服务器端程序,对于数据库结构,数据传输、通讯方式等等。客户端程序,对图像及优化有研究的会易受重用。
>>美术部门
主美负责整体美术风格的把握 原画绘制原画交于3D
2D负责贴图,游戏界面等的制作
3D负责3D建模,动作等方面工作
>>脚本与编辑器
在具体游戏实现时,越来越多的公司不会说把游戏中的数据写在C++里,而是用“脚本与数据库”的方式。
C++的作用是用来解释脚本和调用数据库的 在脚本中,写上,if
{
player hp >=30%hpmax
add hp=hpmax
}
这里的东西是写在脚本里的,C++就会解释,player、hp、hpmax是什么,hp、hpmax对应数据库是什么列主要的游戏内核是写在C里的,脚本用来实现游戏具体的一些东西。如每个场景、每个NPC、每个道具都有可能有个脚本文件制定命令及数据一般由主程与主设计师一起来做,具体写脚本,一般为游戏设计部门按规范做这个工作。
编辑器:是高于脚本的一个给游戏设计部门或是美术部门用的工作工具优点是使用简单,界面化的东西,可以自动生成脚本。
缺点是,把一些比较活的东西,写死到工具中了,将来要加功能改结构很麻烦 这些都是程序部门的工作
另外,在程序部门中主要交流就是服务器端与客户端的。这实际就是说,一个游戏主体置放与传输的问题。
一般来说,一些音声文件、图像文件、大一些的文本都会放在客户端,而数据库,游戏的核心解释在服务器端。
【游戏开发流程】
>>软件:有两部分。
1.编写游戏引擎、建模:需要熟练掌握C/C++、Microsoft Develop Studio开发环境、使用SDK或者MFC、DirectX/OpenGL、SQL编程、SQLServer或Oracle数据库配置。2.策划、美工、音效:MAYA、3DMAX、PS(音效制作方面不熟,这方面无法提供)。流程:策划——引擎——建模——美工——测试。
团队:首先要组成一个由各功能小组核心构成的策划组,负责构思整个游戏的内容架构。包括故事大纲,游戏风格,人物造型,操作模式,任务模式,装备模式等等,以及程序编写、美工贴图能否实现等等,资金预算能否维持等等。
然后筹建各功能小组:主编程组,负责游戏引擎。建模组,负责编写一个完整的世界,各种人物、怪等。美工组,负责包装游戏。测试组,设置若干组服务器,对游戏进行测试。>>游戏设计部门:为最前期
立项
主要目的是描述项目的风格、主亮点、一些方方面面的规则,具体可能会涉的游戏资源(如多少主角,多少场景,多少NPC等等统计)
这个阶段主要目的,是与投资人交流,描述清楚这个项目可不可以做,做了有什么好处,与其它同类游戏对比,竞争优劣势的分析,种种设定因何这样说服投资人,这个项目就可开做了。接下来与主美主程开会,就具体如何划分数据结构,如果命名文件等等交流相关的开始进行。(注:这有个前提,游戏设计必须要前于另两个部门。不能让很多程序或是美术,都等着,这与成本有关)游戏设计这个部门,这时定了数据后,就开始分头建表,游戏有多少会变动的数据就应该有多少表。如道具,NPC,场景、宠物,技能,ICON,特效,音乐,音效这些都要有表的。(注:这里说的变动只是人为的变动,是不是被动,级别这个就是被动的变动,不需要玩家等级表。)这时主策划已经给大家一份总案了,这个总案中,比较清楚的告诉大家这个游戏有什么玩点,也就是模块。(1)剧情设计师开始编世界背景世界观。
(2)规则设计师开始与数据设计师一起一个一个分配着开始写规则文档。(3)辅助员也可以开始先确定一些道具,NPC的名字什么的(注:这些在主设计的审核下进行着)当场景美术描述表,NPC美术描述表,道具美术描述等东西出来了,确定后,就可以交给美术部门开始试着做。--(注:这时,美术部门应该也按投资人的要求确定了美术风格)
[注:策划的工作一直先于其它几个部门,完善表,写全规则文档,写数据表(为将来写脚本做好准备)等等] 美术部门的工作当做完一部分就可以交付程序部门了,这时部门的数据库,数据结构也早搞定了,收到游戏资源,游戏规则,可以做一个简单的版本出来了。首先按游戏设计,把操作、视角等东西,都搞顺。这时,团队中的人就可以都进来看看了。版本不断更新内容,然后游戏开发这样就一步步在开动起来了。这个过程中,需要不断的反馈。
美术部门进到游戏里,发现做的东西不好看这时要返回去重做;
策划部门如果数据不合理,要随时调,同时,如果写了模块,交给程序部门,还要写脚本,实现在游戏中,要去测试。
(1)如果是程序部门理解不清或是别的BUG要及时反馈;(2)如果是规则有问题,或是数据不合理,要自行调节;
(3)另外为了给将来游戏的宣传推广留好接口,对于每个模块在游戏中,可以做什么活动等等都要有文档描述。
附:名词释义
游戏引擎:不是一个软件,更不是其它的什么东西,只是一段这个游戏能实现什么的中心代码。这个代码,也许可以做出很多东西,也许在这个基础上,做出很好的花样,但需要程序去挖掘,更需要游戏设计部门去了解。又常被称作游戏平台。
编辑器:位置要比脚本高一些的一个软件。
它的作用就是生成脚本,但是因为写死了,功能不能随心所欲。优点是用着方便。
以下是游戏制作流程的简单总结:
>>
一、计划阶段:首先,是项目计划阶段。
1、创意管理:第一步,是召开个会议,在会议中最常见的方法就是采取“头脑风暴法”。每个人都必须拿出自己的建议和想法,之后大家一起进行讨论。另外在会场内,会有专人进行会议记录。而在项目开发的前期则会有市场调查。
2、撰写草案:第二步,撰写策划草案,也叫意向书。撰写策划草案的目的在于,使得小组内每个成员对即将开发的项目有一个大体的认识,并且对目标进行明确。
3、市场分析:第三步,市场分析。决定了是否需要开发这个游戏。1)、目标客户:最重要的一点是确定目标客户。即该游戏是面向核心玩家,还是普通的大众玩家。如果是面向核心玩家所开发的游戏,则需要游戏的难度更大一些;反之,如果是面向大众玩家开发的游戏,则需要游戏的难度简单一些。最好的方法是允许玩家自定义游戏的难度。2)、成本估算:以网游为例,包括以下几个方面 •服务器:运行网络游戏所需花费的硬件方面的成本。成本中的大头。大约占到总成本的40%左右。
•客服:属于人力成本的范畴。网络游戏不同于单机游戏的部分在于,其不同于单机游戏的“售后不理”的销售模式。用户在玩这个游戏之后,运营商需要不断的提供更新和各种在线服务。
•社区关系专员:同上,属于人力成本的范畴。同其他方面的花销相比,这方面几乎可以忽略不计。•开发团队:人力成本,这方面花费的真正大头在核心成员和天才制作人的薪资上。•管理:管理方面花费的成本,这方面成本较少。
•用户帐号管理:发行成本的一部分,但也属于运营的范畴。至于成本几乎可以忽略不计。•办公室、电脑、家具:这方面是大头,不过这次花费之后,开发下部游戏时基本上花费就不需要或者很少花费了。
•带宽:发行成本的一部分,但也属于运营的范畴。成本也是极高的,当然各地可能都不一样。
•网管:发行成本的一部分,同样属于运营成本的范畴。•其他杂费:杂七杂八的一些费用,包括水电费、燃气费、可能还会包括买咖啡和茶叶的钱。•宣传、广告和推广的费用:属于运营成本。应该说最好的宣传方法就是广告,但各种广告在花费上都不尽相同,这个就不细说了。
•客户端:制作游戏客户端、点卡、充值卡、印制游戏说明书、游戏包装、游戏赠品一类的成本。
4、需求分析:第四步,撰写需求分析书。这包括以下三个方面: 1)、美工需求:撰写美工需求分析书,内容包括需求图、工作量等。其中工作量需要以天来计。内容具体如下:
•场景:包括游戏地图、小场景等方面。
•人物:包括玩家角色、重要NPC(玩家队友、提供任务的NPC、主线剧情NPC等)、次要NPC(路人、村民等)、怪物、BOSS等。
•动画:动画方面估计每个公司的需求都不尽相同。如果公司能力有限,动画的制作可以考虑外包的方式。
•道具:主要需要考虑是否采取纸娃娃系统。•全身像:人物的全身像方面。
•静画&CG:游戏中可能出现的静画和CG的需求。没有则不需要写。
•人物头像:人物的头像制作需求,其中包括人物的表情方面,包括喜、怒、哀、乐、悲等多种表情。
•界面:界面的需求,包括主界面、各项子界面、屏幕界面、开头界面、END界面、保存和载入界面等方面。
•动态物件:包括游戏中可能出现的火把、光影等方面。•卷轴:又称为滚动条。根据游戏的情况来定具体的需求。•招式图:根据游戏开发的具体情况决定是否有此需求。
•编辑器图素:各种编辑器的图素需求,例如关卡编辑器、地图编辑器等方面。•粒子特效:3D粒子特效的需求。
•宣传画;包括游戏的宣传画、海报等方面的制作需求。•游戏包装:游戏客户端的封面包装的制作。•说明书插图:游戏说明书内附插图的制作需求。•盘片图鉴:游戏客户端盘片上的图鉴的制作需求。•官方网站:游戏官方网站的制作需求。2)、程序需求:撰写程序需求分析书,内容具体如下:
•地图编辑器:包括编辑器的功能需求、各种数据的需求等。•粒子编辑器:关于粒子编辑器的需求。
•内镶小游戏:包括游戏内部各种小游戏的需求。
•功能函数:包括游戏中可能会出现的各种程序功能、技术参数、数据、碰撞检测、AI等方面的需求。•系统需求:包括升级系统、道具系统、招式系统等系统导入器的需求。3)、策划需求
•策划的分工:包括剧本、数值、界面、执行等方面。
•进度控制:要时刻注意时间和开发进度的控制,需要写一个专门的项目进度表。
•例会:项目会以里程碑的形式呈现。当完成一个里程碑后,或者到达固定日期时,需要召开例行会议,除了成员彼此交流外,还需讨论开发中遇到的困难,进度是否有拖延等问题。
>>
二、组织阶段:其次,是项目组织阶段。
1、确定日程:确定游戏开发的日程和进度安排。包括以下几个方面: 1)Demo版本阶段
•前期策划:前期策划和项目的规划。•关卡设计:关卡设计阶段。•前期美工:前期的美工制作。•后期美工:后期的美工制作。
•程序实现:程序的实现,包括编码等。2)Alpha版本阶段
•内部测试:主要是测试和完善各项功能,看一看是否有重大BUG。3)Beta版本阶段
•外部测试:进一步测试和完善各项功能,并预备游戏的发行。4)Release版本阶段
•游戏发行:项目完成阶段,开始正式的发行游戏。5)Gold Release版本阶段
•开发补丁:开发游戏的补丁包、升级版本,以及各种官方插件等。
2、确定人员:确定各个项目所需的人员。包括策划、程序、美工、测试、音乐、运营等方面。
3、分配任务:分配各个人员的具体的开发任务。
4、撰写策划书:正式撰写游戏策划书。
>>
三、开发阶段:其三,是项目开发阶段。
作为策划来说,此阶段主要需做到同各方面保持顺畅的沟通,并处理各种游戏制作中的突发事件。其中需要做到与同事的沟通、同主管的沟通、同领导和老板的沟通等。
>>
四、控制阶段:最后,是项目控制阶段。
1、时间 1)、成本控制:需要注意到开发成本的控制,包括服务器、客服、场租、人工(社区关系专员、开发团队、管理)、设备(办公室、电脑、家具等)、带宽、网管、宣传、广告和推广的费用等方面。2)、市场变化:需要注意市场的因素。•发行档期:需要注意发行档期,要赶在暑假和寒假之前发行。•盗版因素:必须时刻注意盗版、私服等因素对游戏发行的影响。3)、竞争对手的因素:需要时刻注意竞争对手的情况。毕竟,知己知彼,才能百战不殆。
2、品质
由于开发人员的水平大都参差不齐,所以必须根据制作人员的总体水平,决定作品的品质。既不能要求太高,亦不能要求太低,需要折中考虑。
3、突发事件
例如,老板的突击检查、项目投资人的突然撤资等,这些都必须全盘考虑。
4、控制成本
包括时间、品质等方面的成本控制。
【游戏开发队伍组成】
开发团队 •制作人 •执行制作人 •策划团队 •程式团队 •美术团队 销售团队 测试团队 游戏评论队伍 游戏制作人
•开发组长(always)•资源管理(Resource Management)•行政管理(Administration)•向上負責(Upward Management)•专案管理(Project Management)游戏执行制作人
•专案管理执行(Project Management)•Daily 運作 •House Keeping
•Not full-time job position
游戏策划
•故事设计(Story Telling)•脚本设计(Scripting)•玩法设计(Game Play Design)•关卡设计(Level Design)•游戏調適(Game Tuning)•数值设定(Numerical Setup)•AI 设计(Game AI)•音效设定(Sound FX Setup)•场景设定(Scene Setup)游戏美术
•场景(Terrain)•人物(Character)•建模(Models)•材質(Textures)•动作(Motion / Animation)•特效(FX)•用户界面User Interface 游戏程序
•游戏程序(Game Program)•游戏开发工具(Game Tools)•Level Editor •Scene Editor •FX Editor •Script Editor
•游戏Data Exporters from 3D Software •3dsMax / Maya / Softimage
•游戏引擎开发Game Engine Development •网络游戏服务端开发Online Game Server Development •创意(Idea)•提案(Proposal)•制作(Production)•整合(Integration)•测试(Testing)•除錯(Debug)•调试(Tuning)游戏设计(Concept Design)•游戏类型(Game Types)•游戏世界观(Game World)•故事(Story)•游戏特色(Features)•游戏玩法(Game Play)•游戏定位(Game Product Positioning)•Target player
•Marketing segmentation / positioning •风险评估(Risk)•SWOT(优势Strength/缺点Weakness/机会Opportunity/威胁Threat)游戏提案(Proposal)•系統分析(System Analysis)•游戏设计文件撰写(Game Design Document)•传播媒介文件撰写(Media Design Document)•技术设计文案撰写(Technical Design Document)•游戏专案建立(Game Project)•时间表Schedule •进程/控制Milestones / Check points •管理Risk management •测试计划书
•团队建立(Team Building)游戏开发(Production)•美术量产制作 •(建模)Modeling •(结构)Textures •(动画)Animation •(动作)Motion •(特效)FX •程序开发(Coding)•策划数值设定
游戏整和(Integration)•关卡串联(Level Integration)•数值调整(Number Tuning)•音效置入(Audio)•完成所有美术 •程旬与美术結合
•(攻略)Focus Group(说明书User Study)•发布一些攻略截图Release some playable levels for focus group 游戏测试(Testing)•Alpha(α)测试 •除錯(Debug)•Beta(β)测试 •数值微调
•Game play 微调
•对网络游戏而言(MMOG)•封閉测试(Closed Beta)•開放测试(Open Beta)•压力(极限)测试(Critical Testing)•网络游戏才有 关于Bug •Bug 分級(Bug Classification)•A Bug •B Bug •C Bug • S Bug •Principles
•Bug 分級从严
•Tester(测试对象?—)vs Debugger(调试程序)游戏系统(Game Software System)系统层System Layer – APIs •3D Graphics API •DirectX 9.0 SDK – Direct3D •OpenGL 2.0 •2D API
•DirectX 9.0 SDK-DirectMedia •Win32 GDI •Input Device
•DirectX 9.0 SDK – DirectInput •Audio
•DirectX 9.0 SDK – DirectSound / Direct3DSound / DirectMedia •OpenAL •OS API •Win32 SDK •MFC •Network
•DirectX 9.0 SDK – DirectPlay •Socket library
引擎层Engine Layer •3D Scene Management System •Scene Graph •Shaders
•2D Sprite System •Audio System •Gamepad •Hotkey •Mouse •Timers •Network
•DDK Interface •Terrain
•Advanced Scene Management – Space Partition •BSP Tree •Octree
•Character System
•Motion Blending Techniques •Dynamics
•Collision Detection •SoundFX
•User Interface
游戏层Game Play Modula •NPC(Non-playable Characters)•Game AI •Path Finding •Finite State Machine •„ •Avatar
•Combat System •FX System •Script System •Trading System •Number System •„
Game Dev Tools •Visual C/C++ •.net 2003
•Visual C/C++ 6.0+ SP5 •DirectX
•Current 9.0c
•NuMega BoundsChecker •Intel vTune •3D Tools
•3dsMax/Maya/Softimage •In-house Tools 【游戏分类】
•RPG(Role playing games角色扮演)•AVG(Adventure games冒险类)•RTS(Real-time strategy games既时战略)•FPS(First-person shooting games主视觉射击)•MMORPG(多人在线角色扮演)•SLG(战棋)•Simulation(模拟)•Sports(运动)
•Puzzle games(解迷)•Table games(棋牌)
第四篇:安卓学习心得
Android学习心得
-----093380117
计算机应用(1)
张峰
1.关于Activity
1.在一个Activity中使用多个View
如果把Activity看作MVC中的Control?它负责管理UI和接受事件(包括用户的输入),虽然说一个Activity通常对应一个屏幕,但事实上,我们是可以只用一个Activity管理多个不同的View来实现简单的逻辑。首先,我们增加一个新的资源描述layout/second.xml。
除了一个“Hello中国”以外,增加一个按钮可以返回前一个界面。然后,在代码中我们要为helloTwo增加两个方法,setViewOneCommand和setViewTwoCommand,分别处理一下在不同界面时,从资源里加载组件并为组件绑定一个事件处理器最后,我们需要在onCreate的时候,也就是启动后的main界面上设置一下按钮事件处理器。2.还是回到正道上,多个Activity之间的跳转
Android中提供一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,似乎他们也建议采用这种方法,Intent的用法比较复杂,现在我先看看它最简单的用法。
这里的跳转功能用Intent来操作,它的最简单用法就是用函数setClass()设置跳转前后两个Activity类的实例,然后调用Activity自己的startActivity(intent)即可。最后一句finish()表示将当前Activity关掉(如果不关掉会如何?你可以自己试一下看效果,事实上有时我们是不需要关掉当前Activity的)。
然后,我们同样弄一个Activity类HelloThreeB,代码与前面的差不多,只是将setClass的两个参数反一下,这样就可以简单地实现在两个Activity界面中来回切换的功能了。
2.关于 Intent的使用
Intent分为两大类,显性的(Explicit)和隐性的(Implicit)。一般来说,intent要定位事件的目的地,无外乎需要以下几个信息: 1.种类(category),比如我们常见的 LAUNCHER_CATEGORY 就是表示这是一类应用程序。
2.类型(type),在前面的例子中没用过,表示数据的类型,这是隐性Intent定位目标的重要依据。
3.组件(component),前面的例子中用的是setClass,不过也可以用setComponent来设置intent跳转的前后两个类实例。4.附加数据(extras),在ContentURI之外还可以附加一些信息,它是Bundle类型的对象。
其实,如果是在一个应用内部,这种隐性的intent实在有点别扭,个人觉得,这种松藕合的实现方法,只适用于那些较大的系统或者多个不同的应用之间的调用,可手机上又有什么“较大”的系统呢?无非是可以与不同来源的多个应用之间方便地互操作而已,那么会是什么样的场景呢?比如,给QQ好友发送gmail邮件,用GoogleMap查找QQ好友所在的位置?看上去挺不错的。
关于这个ContentProvider,其实还有话说,它主要是的那些看似数据库操作的方法我们都没真正去实现呢。不过今天就到这里了,等下回再去研究吧。
3.关于ListActivity
准备一个List对象并借助Adapter就可以构造出一个列表。重载onListItemClick方法可以响应选择事件,利用第一个参数可以访问到这个ListView实例以得到选中的条目信息。这里有一点要说明的,就是如果更简单的话,其实连那个setContentView都可以不要了,Android也会自动帮我们构造出一个全屏的列表。但是本例中我们需要一个TextView来显示选中的条目,所以我们需要一个layout.mainb描述一下这个列表窗口。
这里需要注意的是那个ListView的ID,是系统自定义的android:list,不是我们随便取的,否则系统会说找不到它想要的listview了。然后,在这个listview之外,我们又增加了一个TextView,用来显示选中的条目。
再来说说这里用到的ArrayAdapter,它的构造函数中第二个参数是一个资源ID,ArrayAdapter的API文档中说是要求用一个包含TextView的layout文件,平台用它来显示每个选择条目的样式,这里的取值是R.layout.list_row,所以,我们还有一个list_row.xml文件来描述这个布局,相当简单。
从ArrayAdapter上溯到BaseAdapter,发现还有几个同源的Adapter也应该可以使用,象SimpleAdapter和CursorAdapter,还是做个例子来实验一下吧。
然后,在HelloTwoB中的onCreate函数中,修改代码,有几个不同:items的元素是HashMap实例,这是一点变化,然后构造函数除了要求items以外,还要求提供一个string[]来说明用hash表中的哪个字段显示在列表中,而后是一个资源ID的数组。
因为单纯的CursorAdapter是抽象类,所以我用的是它的子类SimpleCursorAdapter,很好理解,先用ContentResolver查询通讯簿得到一个游标,然后告诉SimpleCursorAdapter要用其中的People.NAME作为显示项来构造出一个adapter即可。4.关于Dialog
注意到android.app包下除了Dialog(可用于制作复杂的对话框)以外,还包括了几个系统定义好的对话框类,如DatePickerDialog、TimePickerDialog及AlertDialog。
其中AlertDialog我上回用过一次,基本上就那样子了,今天看看另外两个对话框的使用吧。
很简单的,无非是需要一个OnDateSetListener接口的实现而已,在它里面的dateSet方法中就可以得到选择的日期了。而TimePickerDialog与DatePickerDialog使用如出一辙。
看看另一个ProgressDialog的用法吧,这个类与AlertDialog一样包含了多个static的方法,所以使用起来是非常方便的。比如说,如果我们需要用它来表示一个长时间的操作。
5.关于Service和Notification
大略地看了一下android.app下的Service类,觉得它与Activity非常相似,只是要注意几个地方:
1.生命周期,Service的从onCreate()->onStart(int,Bundle)->onDestroy()显得更为简单。但是它的onStart是带参数的,第一个ID可用来标识这个service,第二个参数显示是用来传递数据的了。比较Activity,传递数据的Bundle是在onCreate就带进入的。
2.Service的启动由Context.startService开始,其实Activity或者Service都是Context的派生类。结束于Context.stopService()或者它自己的stopSelf()。
3.Service还有一个与Activity不一样的是它可以由另一个Context去绑定一个已存在的Service。就是这个方法Context.bindService(),被绑定的Service要求是已经onCreate了但可以没有onStart。在Service类中有个抽象方法getBinder()可以得到这个IBinder对象。关于这方面的细节,以后再看,这里只做个记录罢。
4.与Service有关的还有一个安全的问题,可以在AndroidManifest.xml中用
6.GridView与ImageView
简单一点吧,就瞧瞧那个Grid的效果,Android提供了一个GridView,不过从APIDemo中看来,它似乎与PC上的GRID差别还是挺大的,更像那个IconView的感觉。不知道Android中如何实现表格界面?虽然在移动终端上,表格一般不会有谁使用,大家似乎更倾向于使用ListView,而Android对于ListView则有更简单的实现ListActivity。
很简单,只要重载几个方法就可以了,关键是那个getView方法,它负责构建出每个单元格中的对象实例。这里我们构造的是一个ImageView实例。
然后就是同样的将这个Adapter赋给GridView即可,大家可以看看效果,注意在做这个例子前,先放几个小图片到res/drawable目录下,buildproject一下就可以得到那个R.drawable.a了(这里的a是图像文件名,如a.png)。
在getView方法中我们使用了ImageView类,这又是一个widget。除了上面用到的几个方法以外,还有以下几个方法值得注意: 与图像来源有关的方法,我们只用了资源文件的方式。
还是习惯性跑题了,其实,我是想通过我对这个类的无数次Debugger跟进,说说它的多线程异步处理的解决策略的。他的基本策略如下: 1.当你实例化一个AsyncQueryHandler类时(包括其子类...),它会单件构造一个线程(后面会详述...),这个线程里面会构建一个消息循环。
2.获得该消息循环的指针,用它做参数实例化另一个Handler类,该类为内部类。至此,就有了两个线程,各自有一个Handler来处理消息。3.当调用onXXX的时候,在XXX函数内部会将请求封装成一个内部的参数类,将其作为消息的参数,将此消息发送至另一个线程。4.在该线程的Handler中,接受该消息,并分析传入的参数,用初始化时传入的ContentResolver进行XXX操作,并返回Cursor或其他返回值。
5.构造一个消息,将上述返回值以及其他相关内容绑定在该消息上,发送回主线程。
6.主线程默认的AsyncQueryHandler类的handleMessage方法(可自定义,但由于都是内部类,基本没有意义...)会分析该消息,并转发给对应的onXXXComplete方法。
7.用户重写的onXXXComplete方法开始工作。
这就是它偷偷摸摸做过的事情,基本还是很好理解的。我唯一好奇的是它的线程管理方式,我猜测他是用的单件模式。第一个AsyncQueryHandler的实例化会导致创建一个线程,从此该线程成为不死老处男,所有的ContentResolver相关的工作,都由该线程统一完成。个人觉得这种解决方式很赞。本来这个线程的生命周期就很难估量,并且,当你有一个ContentProvider的请求的时候,判断你会做更多的类似操作并不过分。就算错了,花费的也只是一个不死的线程(与进程同生死共存亡...),换来的却是简单的生命周期管理和无数次线程生死开销的节约。同时另外一个很重要的问题,他并会涉及到单件中数据同步的问题,每个类都有各自的Handler类,彼此互不干扰,分发可以分别进行。当多个数据请求的时候,在同一个ContentResolver上进行的可能微乎其微,这就避免了堵塞。总而言之,这套解决办法和Android的整体设计算是天作之合了。
所以建议,如果你有什么非ContentProvider操作,却需要异步多线程执行的话,模拟一套,是个不错的策略,当然,具体情况具体分析,生搬硬套是学不好马列主义的。
7.显示控件使用
Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多,感觉算是SDK讲述的最多的内容。
从控件的使用上,和网页的设计类似,尽量用parent_width之类的抽象长度,用Theme来做风格,抽取所有的字串等信息做本地化设计。相关内容参看Implementing a UI就好。
一类比较重要的是数据绑定控件。如果做过ASP.Net会从中看到很多类似的地方。一个支持数据绑定的控件,比如ListView。可以通过一个 ListAdapter绑定到一个数据源上。ListAdapter是一个抽象类,主要的实现类包括SimpleAdapter和 SimpleCursorAdapter。前者是绑定一个静态的Array,后者是绑定一个动态的Cursor。Cursor前面说过,是一个指向数据源的随机迭代器,将View绑定到Cursor通常要设置这样几个参数。一个是每一行的样式,称作Row Layout,其实就是一个普通的Layout的XML文件。还有就是一个列和现实控件的对应关系。那个控件显示哪个列的值,这是需要配置的。为了定制一个良好的数据显示控件,最简单你可以定制很PP的Row Layout,复杂一点就是可以重载绑定控件View,或者是适配器ListAdapter。如果是一个数据显示密集的应用,且你对UI有些追求,这个工作估计是必不可少的。
一个主要用于显示数据内容的Activity,可以选择派生自ListActivity。它提供了一个具有ListView 的Layout,还有simple_list_item_1, simple_list_item_2, two_line_list_item等默认的Row Layout,还有一些比较不错的API,和可供响应选择Item的事件。可以满足你比较基础的需求。如果你觉得只有一个ListView的界面太突兀,你可以为这个ListActivity指定一个Layout,需要注意的是,你需要提供一个id为@android:id/list的ListView控件,避免Activity在内部偷偷寻找该控件的时候失败。
除了这些要求,做好UI还有注意易用性和效率。快捷键是一个比较不错的选择,在 Activity中调用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以开启快捷键模式,然后你可以将菜单绑定到指定快捷键上就OK了。个人觉得Tip也是一个比较重要的东西,但目前观察看来,这个东西只能够自己提供了。界面的动态性有时候是不可避免的,比如说菜单就是一个需要经常根据光标位置提供不同的选项。这个东西Android很人道的考虑到了,你可以参看NodeList这个Sample。它采取的应该是一个静态模拟动态的方式,这样有助于提高速度。你也可以利用ViewInflate,动态从一个XML创建一个控件。成本据Doc说很大,不到万不得已不要使用。
8.Intent消息传递
在前面写Android的ContentProvider时候,可以看到那是基于观察者模式的一个消息传递方法。每一个Cursor、ContentResolver做为一个小的注册中心,相关观察者可以在这个中心注册,更新消息由注册中心分发给各个观察者。而在MFC或Winform中,都会形成一个消息网,让消息在网中流动,被各节点使用、吃掉或者在出口死掉。
相比之下,我个人觉得基于Intent的Android核心消息传递机制是有所不同的。它应该会有一个全局性的注册中心,这个注册中心是隐性的,整个Android系统中就那么一个。所有的消息接收者,都被隐形的注册到这个中心。包括Activity,Service和IntentReceiver。其实说隐形注册是不确切的,所有注册都还是我们手动告诉注册中心的,只是与传统的方式不一样,我们通常不是通过代码,而是通过配置文件来做。在应用的Manifest中,我们会为一些Activity或Service添加上Intent-filter,或在配置文件中添加
当程序有一个消息希望发出去的时候,它需要将消息封装成一个Intent,并发送。这时候,应该是有一个统一的中心(恩,有可能Android底层实现的时候不是,但简单这样看是没问题的...)接受到这个消息,并对它进行解析、判定消息类型(这个步骤降低了耦合...),然后检查注册了相匹配的filter或receiver,并创建或唤醒接收者,将消息分发给它。这样做有很多好处。虽然这种传递有的时候不如点对点的传递快(这有些需要速度的地方,我们看到Android会通过直接通信来做),但有时候又因为它只经过一跳(姑且这么叫吧...),比复杂的流动又要更快。更重要的是,它耦合性低,在手机平台这种程序组件多变的条件下使用十分适合。并且它可以很容易实现消息的精确或模糊匹配,弹性很大。(我个人曾想在开发一个C++二次平台的时候引入这样的机制,但在C++中,建立一套完整的数据marshal机制不容易,相比之下,用java来做会简单很多...)
恩,废话说了很多,具体讲讲Android中Intent的使用。当你有一个消息需要传递,如果你明确知道你需要哪个Activity或者其他Class来响应的话,你可以指定这个类来接受该消息,这被称为显性发送。你需要将Intent的class属性设置成目标。这种情况很常见,比如startActivity的时候,会清楚当前Activity完了应该是哪个Activity,那就明确的发送这个消息。
但是,有的时候你并不确定你的消息是需要具体哪个类来执行,而只是知道接收者该符合哪些条件。比如你只需要有一个接收者能显示用户所选的数据,而不想制定某个具体的方法,这时候你就需要用到隐形发送(传统上,我们可能会考虑用多态,但显然这种方式更为灵活...)。在Android中,你可以为Intent指定一个action,表示你这个指令需要处理的事情。系统为我们定义了很多Action类型,这些类型使系统与我们通信的语言(比如在Activity里面加一个Main的filter,该activity就会做成该应用的入口点),当然你也可以用于你自己的应用之间的通信(同样当然,也可以自定义...)。强烈建议,在自己程序接收或发出一个系统action的时候,要名副其实。比如你响应一个view动作,做的确实edit的勾当,你发送一个pick消息,其实你想让别人做edit的事,这样都会造成混乱。当然只有Action有时候是不够的,在Android中我们还可以指定catalog信息和type/data信息,比如所有的显示数据的Activity,可能都会响应View action。但很多与我们需要显示的数据类型不一样,可以加一个type信息,明确的指出我们需要显示的数据类型,甚至还可以加上一个catalog信息,指明只有你只有按的是“中键”并发出这样的消息才响应。从上面可以看出,Android的Intent可以添加上class, action, data/type, catalog等消息,注册中心会根据这些信息帮你找到符合的接收者。其中class是点对点的指示,一旦指明,其他信息都被忽略。Intent中还可以添加key/value的数据,发送方和接收方需要保持统一的key信息和value类型信息,这种数据的marshal在java里做,是不费什么力气的。
Android的Intent发送,可以分成单播和广播两种。广播的接收者是所有注册了的符合条件的IntentReceiver。在单播的情况下,即使有很多符合条件的接收者,也只要有一个出来处理这个消息就好(恩,个人看法,没找到确切条款或抉择的算法,本来想实验一下,没来得及...),这样的情况很容易理解,当你需要修改某个数据的时候,你肯定不会希望有十个编辑器轮流让你来处理。当广播不是这样,一个receiver没有办法阻止其他receiver进行对广播事件的处理。这种情况也很容易理解,比如时钟改变了,闹钟、备忘录等很多程序都需要分别进行处理。在自己的程序的使用中,应该分清楚区别,合理的使用。
9.ContentProvider数据模型
数据库操作
从我目前掌握的知识来看,SQLite比较轻量(没有存储过程之类的繁杂手段),用起来也比较简单。实例化一个SQLiteDatabase类对象,通过它的APIs可以搞定大部分的操作。从sample中看,Android中对db的使用有一种比较简单的模式,即派生一个 ContentProviderDatabaseHelper类来进行SQLiteDatabase对象实例的获取工作。基本上,ContentProviderDatabaseHelper类扮演了一个singleton的角色,提供单一的实例化入口点,并屏蔽了数据库创建、打开升级等细节。在ContentProvider中只需要调用ContentProviderDatabaseHelper的openDatabase方法获取SQLiteDatabase的实例就好,而不需要进行数据库状态的判断。URI 像进行数据库操作需要用SQL一样,对ContentProivder进行增删改查等操作都是通过一种特定模式的URI来进行的(ig:content: //provider/item/id),URI的能力与URL类似,具体细节可以查看SDK。建立自己的ContentProvider,只需要派生 ContentProivder类并实现insert, delete, update等抽象函数即可。在这些接口中比较特殊的是getType(uri)。根据传入的uri,该方法按照MIME格式返回一个字符串(==!没听过的诡异格式...)唯一标识该uri的类型。所谓uri的类型,就是描述这个uri所进行的操作的种类,比如content://xx/a与 content://xx/a/1不是一个类型(前者是多值操作,后者是单值),但content://xx/a/1和content://xx/a/2 就会是一个类型(只是id号不同而已)。
在ContentProvider通常都会实例化一个ContentURIPraser来辅助解析和操作传入的URI。你需要事先(在static域内)为该ContentURIPraser建立一个uri的语法树,之后就可以简单调用 ContentURIPraser类的相关方法进行uri类型判断(match方法),获取加载在uri中的参数等操作。但我看来,这只是在使用上简化了相关操作(不然就需要自己做人肉解析了...),但并没有改变类型判定的模式。你依然需要用switch...case...对uri的类型进行判断,并进行相关后续的操作。从模式来看,这样无疑是具有强烈的坏味道,类似的switch...case...代码要出现N此,每次一个 ContentProvider做uri类型的增减都会需要遍历修改每一个switch...case...,当然,如果你使用模式(策略模式...)进行改造对手机程序来说无疑是崩溃似的(类型膨胀,效率降低...),所以,只能是忍一忍了(恩,还好不会扩散到别的类中,维护性上不会有杀人性的麻烦...)。增删改查
ContentProvider 和所有数据源一样,向外提供增删改查操作接口,这些都是基于uri的指令。进行insert操作的时候,你需要传入一个uri和 ContentValues。uri的作用基本就限于指明增减条目的类型(从数据库层面来看就是table名),ContentValues是一个 key/value表的封装,提供方便的API进行插入数据类型和数据值的设置和获取。在数据库层面上来看,这应该是column name与value的对应。但为了屏蔽ContentProvider用户涉及到具体数据库的细节,在Android的示例中,用了一个小小的模式。它为每一个表建一个基于BaseColumn类的派生类(其实完全可以不派生自BaseColumn,特别当你的表不基于默认的自动id做主键的时候),这个类通常包括一个描述该表的ContentURI对象和形如 public static final TITLE = “title”这样的column到类数据的对应。从改变上角度来看,你可以修改column的名字而不需要更改用户上层代码,增加了灵活性。insert方法如果成功会返回一个uri,该uri会在原有的uri基础上增加有一个row id。对于为什么使用row id而不是key id我想破了脑袋。到最后,我发现我傻了,因为ContentProvider不一定需要使用数据库,使用数据库对应的表也可以没有主键,只有row id,才能在任何底层介质下做索引标识。
但,基于row id在删除和修改操作是会造成一定的混乱。删除和修改操作类似。删除操作需要传入一个uri,一个where字串,一组where的参数(做条件判定...),而修改操作会多一个ContentValues做更新值。着两个操作的uri都支持在末尾添加一个row id。于是混乱就出现了。当在where参数中指明了key id,而在uri中提供了row id,并且row id和key id所指函数不一致的时候,你听谁的?示例代码中的做法是完全无视row id(无语...),如此野蛮的方式我估计也只能在示例中出现,在实际中该如何用,恩,我也不知道。幸运的是,我看了下上层对 ContentProvider的删除操作,其实都不会直接进行,而是通过调用Cursor的delete方法进行,在这前提下,我想Cursor会处理好这些东西吧。
最后一个操作是查询操作,可以想见,查询的参数是最多的,包括uri和一组条件参数。条件参数类型和标准的sql类似,包括 sort, projection 之类的。从这些参数到sql语句的生成,可以寻求QueryBuilder类的帮助,它提供了一组操作接口,简化了参数到sql的生成工作,哪怕你不懂 sql都完全没有问题(这话说的我自己都觉得有点悬...)。查询返回一个Cursor。Cursor是一个支持随机读写的指针,不仅如此,它还提供了方便的删除和修改的API,是上层对ContentProvider进行操作一个重要对象,需要仔细掌握(Cursor还可以绑定到view上,直接送显,并与用户进行交互,真是程序越往上,封装越好,工作越机械没有复杂性了...)。数据模型
在与界面打交道的Cursor、ContentResolver等数据操作层中,大量采用观察者模式建立数据层与显示层的联系。一个显示层的视图,可以做成某一种观察者注册到Cursor或ContentResolver等数据中间层中,在实现底层ContentProvider中,我们需要特别注意在对数据进行修改操作(包括增删改...)后,调用相应类型的notify函数,帮助表层对象进行刷新(还有一种刷新方式是从一个view发起的)。可以看到 Android的整体数据显示框架有点像MVC的方式。Cursor、ContentResolver相当于控制层,数据层和显示层的交互通过控制层来掌管,而且控制层很稳定不需要特别定制,通常工作只在定制数据层和显示层空间,还是比较方便和清晰的。
10.学习感想
通过这学期对安卓的学习,大概了解了以上一些知识,对安卓有了初步的了解,这几个月给我的东西我想用有形的和无形的两部分概叙,形的当然就是技术水平的长进,虽然其中肯定有很多的不足,相信慢慢会体会到。
第五篇:Android开发前景怎样 大学生该如何学好安卓了
Android开发行业火热,大学生如何学好Android? 一:Android开发前景
当前,Android系统因其开放性和免费广受欢迎,所占市场份额最大,截至2011年第四季度,国内市场Android手机的市场份额已经占据了整体智能机市场的68.4%。国内三大运营商如火如荼的3G营销战持续升温,再加上3G的推出对整个行业的巨大推动作用,无疑将引爆3G-Android开发工程师这个黄金职位,符合条件的Android工程师屈指可数,企业招聘难度可想而知。我们相信,在未来几年内,Android开发工程师将成为3G行业炙手可热的岗位之一。据数据统计显示:目前热招的Android技术相关岗位约有3882个,而一个月内的有效岗位量在2298个。主要热招职位包括Android开发工程师、Android软件工程师、Android应用开发工程师、系统驱动工程师,Android手机游戏开发、Android系统软件开发、Android程序员、Android游戏应用版本管理、人机交互分析工程师、Android中间层开发工程师等。
二:大学生如何学好Android?
虽然了解到Android行业未来的发展前景,Android人才的紧缺。但是作为刚毕业的应届大学毕业生如何才能加入这个热门行业?怎样才能学好Android开发?今天,长沙欧柏泰克的Android培训老师告诉大家作为一个大学生如何学好安卓?
首先:学习一门语言
众所周知,Android行业是一个高门槛行业,所以想要进入这个
行业,首先要学习一门编程语言:从人才需求类型来看,目前对Android人才需求一类是偏向硬件驱动的Android人才需求,一类是偏向软件应用的Android人才需求。偏向Android硬件驱动Android人才,首先要学习的是C语言。由于现在大学里面和计算机相关的专业甚至理工类专业一般都会开设C语言课程,只是很多同学在大学期间并没有好好学习,如果对它掌握的不太好或者很久没用了,建议先从将其好好复习一下,将其基本的语法再好好回顾一下,最好能搭建一个环境来运行、调试它。如果没有学过,不妨也提前学习一下。大部分的高校所开设的C语言使用的教材都是用它作为教材,因此无论是购买还是借阅,都容易找到。
应用的Android开发需要学习Java语言。因为Android应用的开发语言用的是Java语言,并且在Android中也用到了Java核心类库的大量的类,因此,在学习Android开发之前,可以先把Java基本语法和Java SE的基础类库好好学习一下。Android应用程序开发是以Java语言为基础的,所以没有扎实的Java基础知识,只是机械的照抄别人的代码,是没有任何意义的。建议在安卓课程前期的java学习阶段中,需要用心的学好。
其次:熟悉数据结构和算法基础知识
如果后续有志于游戏方面的开发,最好具备一定的数据结构和算法基础知识。虽然现代的高级编程语言中,其类库中已经帮我们实现了大部分的数据结构,一般情况下,我们直接使用即可。但如果能对其原理有所了解,当需要在这些数据结构和算法中间的时候,可以更
加的清楚到底应该选择哪个数据结构或者算法。另外,在图形图像处理上面,线性代数的作用也非常重要,如果能掌握一点这方面的基础知识,无疑也会在后续的学习中如虎添翼。
总结:现在Android在移动领域已经得到了广泛的应用。随着需求的增多,行业人才的紧缺导致薪酬水涨船高,Adroid 3G技术人员入行起薪即可达到5000元。由此可见,未来的安卓人才的需求量还是很大的,大学生学习Adroid更是抓住了最佳时机。
大学毕业生通过就业培训进军嵌入式行业
大学生就业难一直是被关注的热点话题,2013年大学毕业生就业形势又将如何?近日,教育部发布关于做好2013年全国普通高等学校毕业生就业工作的通知。通知指出2013年高校毕业生比2012年增加19万,教育部称高校毕业生就业形势更加严峻。
据专家表示:虽然目前大学毕业生就业形势严峻,就业难,但是很多行业仍然面临着人才紧缺得情况。例如:调查显示,在求职因素的各维度分析中,学生求职者在就业行业方面很多倾向于IT/互联网行业。但是从实际就业情况看,还是很少学生求职者能迈进这个行业,虽然目前的IT/互联网行业发展前景很好,同时这方面的人才存在巨大缺口,但是由于IT/互联网行业本身的行业门槛相当高,所以对于大学毕业生来说十分困难。但是很多相关方面的专家指出:由于现在很多的行业人才的需求与大学生求职者目前的能力存在一定的差距,所以需要一种方式或者是渠道去缩短这种差距。例如:目前国内嵌入式人才极度匮乏,权威部门统计,我国目前嵌入式软件人才缺口每年
为40万人左右。INTEL、TI、SONY、三星、TCL、联想、康佳等大型企业对嵌入式人才都有大量的需求。供不应求使得嵌入式人才身价上涨,而且,越有专业经验,就业竞争力就越大。虽然嵌入式行业门槛很高,但是大学毕业生同样能加入这个行业。
目前市场上有很多的有实力的嵌入式培训机构,他们能很好的帮助企业解决嵌入式人才短缺问题,培养一批批合格的嵌入式人才。通过最近几年的实践证明,很多的嵌入式培训机构已经成功培养了大批的嵌入式人才,这也让为什么越来越多的人开始通过培训渠道迈入这个高门槛行业,尤其是大学毕业生参加培训的越来越多,虽然对他们来说几乎没有任何的嵌入式相关的技术基础,最多拥有的也就是c语言基础。但是他们拥有很好的学习能力,能快速学习和掌握一门知识或者技能。在短短几个月的培训中,他们跟上了老师的步伐,学到了大学中几年都没有学会的东西!这足以证明了他们对成功的渴望,对渴望成为一个嵌入式工程师付出的决心。
最后,长沙欧柏泰克真切的希望那些有志于嵌入式行业的大学毕业生能选择相关的培训快速加入这个行业,因为目前嵌入式软件人才十分紧缺,如果你想成功,你想在这个行业走的更远,发挥你现有的超强学习能力抓住这次机会。因为我相信,成功的人之所以能取得成功是因为他们总能抓住别人没抓住的机会,付出别人不愿付出的代价。