成绩:
通信工程专业实训报告
项目名称:Android记事本开发
学 号:
姓 名:
班 级:
指导教师:
时 间:20##年 月 日-20##年 月 日
目 录
摘 要.......................................................................................................................................... I
第一章 引 言............................................................................................................................... 1
1.1 实训背景........................................................................................................................ 1
1.2 开发环境配置................................................................................................................. 2
第二章 软件功能规划................................................................................................................... 3
2.1软件功能......................................................................................................................... 3
2.2 界面设计........................................................................................................................ 3
第三章 功能开发流程................................................................................................................... 3
3.1程序执行流程.................................................................................................................. 3
3.2 功能实现........................................................................................................................ 3
第四章 实训总结.......................................................................................................................... 3
4.1实训总结......................................................................................................................... 3
摘 要
开心或是难过,有趣或是无聊,幸福或是痛苦,这些都是我们所经历的,是记忆,是生命中最为宝贵的,我们舍不得遗忘,记事本能够帮助我们守住回忆,记录下我们生命的足迹。
第一章 引 言
1 实训背景:
Android是基于Linux开放性内核的操作系统,是Google公司在20##年11月5日公布的手机操作系统。 早期由原名为"Android"的公司开发,谷歌在20##年收购"Android.Inc"后,继续进行对Android系统开发运营,它采用了软件堆层(software stack,又名软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能,其他的应用软件则由各公司自行开发,部分程序以Java编写。20##年初数据显示,仅正式上市两年的操作系统Android已经超越称霸十年的塞班系统,使之跃居全球最受欢迎的智能手机平台。开放性:在优势方面,Android平台首先就是其开放性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。挣脱运营商的束缚:在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。自从iPhone上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈。丰富的硬件选择:这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容。好比你从诺基亚Symbian风格手机一下改用苹果iPhone,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移。不受任何限制的开发商:Android平台提供给第三方开发商一个十分宽泛、自由的环境。因此不会受到各种条条框框的阻挠,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如何控制正是留给Android难题之一。无缝结合的Google应用:如今叱咤互联网的Google已经走过10年度历史。从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。
2开发环境配置
(1) java JDK下载:进入 http://java.sun.com/javase/downloads/index.jsp (或者直接点击下载 图: 选择 Download JDK 只下载JDK,无需下载jre. (2)eclipse下载进入该网页: http://www.eclipse.org/downloads/ (或者直接点击下载:BT下载 HTTP下载 )我们选择第一个(即eclipse IDE for java EE Developers)(3)下载Android SDK说明: Android SDK两种下载版本,一种是包含具体版本的SDK的,一种是只有升级工具,而不包含具体的SDK版本,后一种大概20多M,前一种70多M。完全版下载 (android sdk 2.1 r01) 二 软件安装 (1)安装jdk 6u19 安装完成即可,无需配置环境变 (2)解压eclipse eclipse无需安装,解压后,直接打开就行3)解压android sdk 这个也无需安装,解压后供后面使 (4)最终有三个文件夹,Eclipse配置:1 安装android 开发插件 (1)打开Eclipse, 在菜单栏上选择 help->Install New SoftWare点击 Add按钮,出现如下界面 输入网址: https://dl-ssl.google.com/android/eclipse/ (如果出错,请将https改成http) 名称: Android (这里可以自定义)点击OK, 点击 Next按钮 点击Next按钮,出现如下界面:选择 I accept the terms of the license agreements 点击Next,进入安装插件界面安装完成后, 点击Yes按钮,重启Eclips2 配置android sdk(1)点击菜单window->preferences 选择你的android SDK解压后的目录,选错了就会报错,这个是升级工具,目前还没有一个版本的SDK(2)升级SDK版本,选择菜单 window->Android sdk and avd manager 选择update all按钮,出现如下界面选择左边的某一项,点击accept表示安装,点击reject表示不安装,我这里只选了SDK 2.1 和samples for api 7 , 自己可以任意自定义,确定后,选择install按钮,进入安装界面:安装完成下:(3)新建AVD(android vitural device) 和上面一样,进入android sdk and avd manager,选中Vitural Devices 在点击New按钮点击New按钮后, 名称可以随便取,target选择你需要的SDK版本,SD卡大小自定义,点击 Create AVD,显示创建AVD完毕3 新建Android项目(1)选择菜单file->new->other 进入如下界面:选择新建Android Project项目,点击Next按钮,进入如下界面名称自定义,应用程序名自定义,报名必须包含一个点以上,min SDK version里面必须输入整数(3)配置运行 右键项目->Run as -> Run Configuration该界面,点击Browse 按钮,选择你要运行的项目选择Target切换到以下界面该界面选择运行的AVD,将AVD前面的方框设置为选择状态。(4)测试项目运行右键项目名称->run as ->Android Application 即可启动运行该Android程序,
第二章 软件功能规划
1.软件功能
能够提示用户是否有已写记事本,能够进行记事本的标题填写和内容填写,确定后保存。
2.界面设计
进入程序提示“您还没有开始写日记呢!点击下边的Menu按钮开始写日记吧:)",点击menu菜单后进入标题和内容的填写界面。
第三章 功能开发流程及功能展示
第一步:MainActivity
package cn.dccssq;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ListActivity {
private static final int INSERT_ID = Menu.FIRST;
private static final int DELETE_ID = Menu.FIRST + 1;
private static final int ACTIVITY_CREATE = 0;
private static final int ACTIVITY_EDIT = 1;
private DiaryDbAdapter diaryDb;
private Cursor cursor;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
diaryDb =new DiaryDbAdapter(this);
diaryDb.open();
}
private void showListView(){
cursor = diaryDb.getAllNotes();
String[] from = new String[]{DiaryDbAdapter.KEY_TITLE,DiaryDbAdapter.KEY_BODY};
int[] to = new int[]{R.id.text1,R.id.created};
ListAdapter cursorAdapter = new SimpleCursorAdapter(this,R.layout.diary_row,cursor,from,to);
setListAdapter(cursorAdapter);
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// TODO Auto-generated method stub
super.onListItemClick(l, v, position, id);
Cursor c = cursor;
c.move(position);
Intent intent = new Intent(this,ActivityDiary.class);
intent.putExtra(DiaryDbAdapter.KEY_ROWID, id);
intent.putExtra(DiaryDbAdapter.KEY_TITLE, c.getString(c
.getColumnIndexOrThrow(DiaryDbAdapter.KEY_TITLE)));
intent.putExtra(DiaryDbAdapter.KEY_BODY, c.getString(c
.getColumnIndexOrThrow(DiaryDbAdapter.KEY_BODY)));
startActivityForResult(intent, ACTIVITY_EDIT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
showListView();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
super.onCreateOptionsMenu(menu);
menu.add(0,INSERT_ID,0,R.string.menu_insert);
menu.add(0,DELETE_ID,0,R.string.menu_delete);
return true;
}
@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case INSERT_ID:
Log.i("INSERT:", String.valueOf(INSERT_ID));
createDiary();
return true;
case DELETE_ID:
Log.i("DELETE_ID:", String.valueOf(getListView().getSelectedItemId()));
diaryDb.deleteDiary(getListView().getSelectedItemId());
showListView();
return true;
}
return super.onMenuItemSelected(featureId, item);
}
private void createDiary(){
Intent intent = new Intent();
intent.setClass(this, ActivityDiary.class);
startActivityForResult(intent, ACTIVITY_CREATE);
}
}
第二步:ActivityDiary
package cn.dccssq;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class ActivityDiary extends Activity {
// title EditText
EditText titleTxt;
// body EditText
EditText bodyTxt;
// save Button
Button btn;
// Row Id
Long rowId;
private DiaryDbAdapter diaryDb;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.notepad);
// Initialize the DiaryDbAdapter.
diaryDb = new DiaryDbAdapter(this);
// Get the screen control
titleTxt = (EditText)findViewById(R.id.title);
bodyTxt = (EditText)findViewById(R.id.body_text);
btn = (Button)findViewById(R.id.button);
rowId = null ;
// Get data from the front page
Bundle bundle = getIntent().getExtras();
if(bundle!=null){
Log.i("bund:",bundle.toString());
// Set data to page
String title = bundle.getString(DiaryDbAdapter.KEY_TITLE);
String body = bundle.getString(DiaryDbAdapter.KEY_BODY);
rowId = bundle.getLong(DiaryDbAdapter.KEY_ROWID);
if(title!=null)
{
titleTxt.setText(title);
}
if(body!=null)
{
bodyTxt.setText(body);
}
}
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
String title = titleTxt.getText().toString();
String body = bodyTxt.getText().toString();
if(checkInput(title, body)){
diaryDb.open();
if(rowId!=null){
diaryDb.updateDiary(rowId, title, body);
}else{
diaryDb.createDiary(title, body);
}
diaryDb.close();
Intent mIntent = new Intent();
setResult(RESULT_OK, mIntent);
finish();
}
}
});
}
/**
* Validate the input.
* @param title
* @param body
* @return
*/
public boolean checkInput(String title ,String body){
if(null==title || title.trim().length()==0){
titleTxt.setError("Please input the title!");
return false;
}
if(null==body || body.trim().length()==0){
bodyTxt.setError("Please input the content!");
return false;
}
return true;
}
}
第三步:DiaryDbAdapter DB操作类,提供了两种增删查改的功能代码
package cn.dccssq;
import java.util.Calendar;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
public class DiaryDbAdapter {
public static final String KEY_TITLE = "title";
public static final String KEY_BODY = "body";
public static final String KEY_ROWID = "_id";
public static final String KEY_CREATED = "created";
private DatabaseHelper databaseHelper;
private Context context;
private SQLiteDatabase sqliteDatabase;
public DiaryDbAdapter(Context context) {
this.context = context;
}
/**
* Open the Database
*/
public void open(){
databaseHelper = new DatabaseHelper(context);
try
{
sqliteDatabase = databaseHelper.getWritableDatabase();
}catch(SQLiteException e){
sqliteDatabase = databaseHelper.getReadableDatabase();
}
}
/**
* Close the Database
*/
public void close()
{
sqliteDatabase.close();
}
/**
* Insert the Data
* @param title
* @param body
* @return
*/
public long createDiary(String title,String body){
ContentValues content = new ContentValues();
content.put(KEY_TITLE, title);
content.put(KEY_BODY, body);
Calendar calendar = Calendar.getInstance();
String created = calendar.get(Calendar.YEAR) + "/"
+ calendar.get(Calendar.MONTH) + "/"
+ calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE);
content.put(KEY_CREATED, created);
return sqliteDatabase.insert(databaseHelper.DATABSE_TABLE, null, content);
}
/**
* Delete the record
* @param rowId
* @return
*/
public boolean deleteDiary(long rowId){
String whereString = KEY_ROWID + "=" + rowId;
return sqliteDatabase.delete(databaseHelper.DATABSE_TABLE, whereString, null)>0;
}
/**
* Get all Records
* @return
*/
public Cursor getAllNotes()
{
String[] searchResult = {KEY_ROWID, KEY_TITLE,KEY_BODY, KEY_CREATED};
return sqliteDatabase.query(databaseHelper.DATABSE_TABLE, searchResult, null, null, null, null, null);
}
/**
* Get the record by condition
* @param rowId
* @return
* @throws SQLException
*/
public Cursor getDiary(long rowId) throws SQLException{
String[] searchResult = {KEY_ROWID, KEY_TITLE,KEY_BODY, KEY_CREATED};
String whereString = KEY_ROWID + "=" + rowId;
Cursor mCursor = sqliteDatabase.query(true, databaseHelper.DATABSE_TABLE, searchResult, whereString, null, null, null, null, null);
if(mCursor!=null){
mCursor.moveToFirst();
}
return mCursor;
}
public boolean updateDiary(long rowId ,String title,String body){
ContentValues values = new ContentValues();
values.put(KEY_ROWID, title);
values.put(KEY_BODY,body);
Calendar calendar = Calendar.getInstance();
String created = calendar.get(Calendar.YEAR) + "/"
+ calendar.get(Calendar.MONTH) + "/"
+ calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE);
values.put(KEY_CREATED, created);
String whereString = KEY_ROWID + "=" + rowId;
return sqliteDatabase.update(databaseHelper.DATABSE_TABLE, values, whereString, null)>0;
}
public void xinjianDiary(String title,String body){
Calendar calendar = Calendar.getInstance();
String created = calendar.get(Calendar.YEAR) + "/"
+ calendar.get(Calendar.MONTH) + "/"
+ calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE);
String insertSQL = "INSERT INTO " + databaseHelper.DATABSE_TABLE
+"(" + KEY_ROWID +"," + KEY_TITLE+"," + KEY_BODY +"," + KEY_CREATED + ")"
+ " values (?,?,?,?)" ;
Object[] args = {null,title,body,created};
sqliteDatabase.execSQL(insertSQL, args);
}
public void bianjiDiary(long rowId ,String title,String body){
Calendar calendar = Calendar.getInstance();
String created = calendar.get(Calendar.YEAR) + "/"
+ calendar.get(Calendar.MONTH) + "/"
+ calendar.get(Calendar.DAY_OF_MONTH) + " "
+ calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE);
String updateSQL = "update " + databaseHelper.DATABSE_TABLE
+" set " + KEY_TITLE+"=? ," + KEY_BODY +"=? ," + KEY_CREATED + "=? "
+ " where " + KEY_ROWID + "= ?" ;
Object[] args = {title,body,created,rowId};
sqliteDatabase.execSQL(updateSQL, args);
}
public void shanchuDiary(long rowId ){
String deleteSQL = "delete from "+ databaseHelper.DATABSE_TABLE +" where " + KEY_ROWID + "= ?" ;
Object[] args = {rowId};
sqliteDatabase.execSQL(deleteSQL, args);
}
public Cursor qudeAllNotes()
{
String searchSQL = "select _id , title , body ,created from "+ databaseHelper.DATABSE_TABLE;
return sqliteDatabase.rawQuery(searchSQL, null);
}
}
第四步:DatabaseHelper
package cn.dccssq;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private final static String DATABSE_NAME = "notepad";
private final static int DATABASE_VERSION = 1;
public final static String DATABSE_TABLE = "diary";
private final static String DATABASE_CREATE = "create table " + DATABSE_TABLE + " (_id integer primary key autoincrement,"
+ "title text not null, body text not null, created text not null);";
public DatabaseHelper(Context context) {
super(context, DATABSE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
db.execSQL("DROP TABLE IF EXISTS " + DATABSE_TABLE);
onCreate(db);
}
}
第五步:main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView
android:id="@+id/android:list"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/android:empty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="您还没有开始写日记呢!点击下边的Menu按钮开始写日记吧:)" />
</LinearLayout>
第六步:diary_row.xml
<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout
android:id="@+id/row"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="30px"
android:maxWidth="200dip"
android:textSize="22sp"
android:layout_marginTop="10dip"
android:text="第一组第一项" />
<TextView
android:id="@+id/created"
android:layout_width="wrap_content"
android:layout_height="35px"
android:layout_alignParentRight="true"
android:layout_marginLeft="10dip"
android:layout_marginTop="10dip"
android:text="1999年12月3号" />
</RelativeLayout>
第七步:notepadxml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:text="@string/notepad_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"></TextView>
<EditText
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"></EditText>
<TextView
android:text="@string/notepad_body"
android:layout_width="fill_parent"
android:layout_height="wrap_content"></TextView>
<EditText
android:id="@+id/body_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"></EditText>
<Button
android:id="@+id/button"
android:text="@string/notepad_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"></Button>
</LinearLayout>
第八步:strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, MainActivity!</string>
<string name="app_name">db2</string>
<string name="diary_edit">编辑</string>
<string name="notepad_title">标题:</string>
<string name="notepad_body">内容:</string>
<string name="notepad_button">确定:</string>
<string name="menu_insert">Add</string>
<string name="menu_delete">Delete</string>
<string name="edit_diary">Edit</string>
</resources>
第九步:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.dccssq"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ActivityDiary">
</activity>
</application>
<uses-sdk android:minSdkVersion="8" />
</manifest>
第四章 实训总结
这次的实训,是教我们运行现在很流行的android,android是由谷歌推出的运用在手机上的操作系统,现在,这种安装了android的手机相当风靡。而且欢迎度也很大
这次的实训是第一次接触android,老师先给我们讲经典的程序,helloworld。从中学会了如何去创建一个android的项目,了解了android项目里的每个文件夹和文件的作用。而且环境的配置中出现的问题的解决方案,
对android有点入门的时候,实训时间却已经要结束了,这次的实训学到了很多,但是对难一点的却还有些不知道,这让我有点小小的失望。通过这次的实训,不仅学到了新知识,更对已经就学过的JAVA又加深了一点印象。现在自己也能利用已有的知识,编一些简单的程序,通过这次的实训,让我对以后选择软件开发的行业更加坚定了。打算自己在实训好后还要在学。