《Android应用开发 “我的日记”的设计与实现ppt课件.pptx》由会员分享,可在线阅读,更多相关《Android应用开发 “我的日记”的设计与实现ppt课件.pptx(88页珍藏版)》请在三一办公上搜索。
1、任务四“我的日记”的设计与实现,支撑知识:ProgressBar控件、线程、Activity间的跳转与生命周期、简单数据存储、文件存储,重难点,知识目标,掌握Android的ProgressBar控件的属性设定、使用方法;掌握Activity的生命周期、各状态的转化关系与对应的回调函数;掌握Intent的作用、重要属性、常见方法;理解简单数据存储SharedPreferences的使用场合、使用方法;掌握文件存储的常见使用方法。,能力目标,能够利用Handler与ProgressBar控件相结合演示进度;能够利用Intent的属性与方法实现Activity的跳转;能够利用SharedPrefe
2、rences实现简单的数据存储;能够实现Android中的文件存储。,项目流程,进行程序演示,请同学们观察该应用实现了哪些功能?该应用需要哪些控件与Android知识点支撑?,TextView,EditText,CheckBox与SharedPreferences,Button,ProgressBar与线程,Button与文件存储,EditText与文件存储,本次任务涵盖以下支撑知识点:ProgressBar控件的使用;Activity生命周期与回调函数;Activity之间的跳转;文件存储;简单数据存储。,支撑知识1.ProgressBar控件,ProgressBar为进度条控件,通常是在用
3、户等待程序运行结果等耗时较长的情况下,作为一个反馈机制,来告知用户目前的进展程度,避免用户误以为程序没有响应,从而提高程序的用户体验。,1. 1简介,环形进度条,1. 2属性,1. 2属性,1. 2属性,1. 3方法,1. 3方法,演示如何创建ProgressBar控件;演示如何利用ProgressBar控件的属性与方法,1. 4示例演示,支撑知识2. 线程,所有界面控件相关的操作,实际上都是由主UI线程(主用户界面线程)在负责运行。但有时候程序会执行一些耗时的操作,一般的解决方案是将耗时的操作交给另外一个子线程来执行,从而保证主UI线程的顺畅。,2. 1简介,2. 1简介,子线程Thread
4、:负责耗时的操作,主UI线程:负责与用户操作交互,Handler发送消息,Handler接收消息,更新UI,Message,休眠1秒,Handler发送消息,Message,Handler接收消息,更新UI,休眠1秒,Handler发送消息,Message,Handler接收消息,更新UI,2. 2方法,2. 2方法,演示如何创建子线程;演示如何将线程与ProgressBar控件相结合,实现5秒的进度条显示,2. 3示例演示,支撑知识3. Activity间的跳转,Intent是两个Activity之间进行跳转的媒介。Android中,当一个Activity需要跳转到另外一个Activity时
5、,就需要用到Intent了。Intent中文为“意图”,意味着Android程序在进行页面跳转时,只需告知系统它的“意图”:需要启动哪一个Activity。,3. 1 Intent简介,3. 2属性-Action属性,3. 2属性-Data属性,Data属性是用来向Action属性提供可操作的数据的采用Uri对象的格式,即scheme:/host:port/path。,content:/contacts/people/1,ACTION_VIEW content:/contacts/people/1:显示id为1的联系人信息;ACTION_DIAL content:/contacts/peopl
6、e/1:将id为1的联系人电话号码显示在拨号界面中;ACITON_VIEW tel:123:显示电话为123的联系人信息;ACTION_VIEW http:/:在浏览器中浏览谷歌网站。,3. 2属性-Category属性,3. 2属性-Category属性,3. 2属性-Component属性,指定了Component属性以后,Intent的其他所有属性都是可选的。这种方式的优点在于无需查找,直接调用目标组件,速度快捷。,3. 2属性-Extras属性,Bundle对象Bundle类与Map类很相似,它可以放入多对key-value键值,这样在通过Intent对象进行Activity跳转时,就
7、能够进行数据的传递了。,3. 3方法,3. 3方法,列举一些常见的Activity跳转案例演示Intent的使用方法,3. 4示例演示,1.创建一个布局文件2.创建一个类继承自Activity,并绑定布局文件3.AndroidManifest注册Activity4.使用Intent跳转到Activity,3. 5跳转至另外一个Activity的步骤,支撑知识4. Activity的生命周期,活动状态:处于Activity栈的栈顶,用户启动应用程序或Activity之后,该Activity位于屏幕前台,用户可见,能获得焦点(即用户可以操作它)。同一时刻只会有一个Activity处于活动状态;暂停
8、状态:该Activity位于前台,但是被另外一个处于“活动”状态的Activity(比如对话框风格的Activity)遮挡住一部分,没有焦点,用户不能直接对其进行输入操作,但界面依旧可见,该Activity的状态处于“暂停”状态。停止状态:该Activity被其他Activity完全挡住,不再可见,也失去了焦点;销毁状态:该Activity被终止。,4. 1 生命周期,4. 2 回调函数,启动Activity,Activity停止状态,Activity销毁状态,Activity暂停状态,Activity运行状态,onCreate(),onStart(),onPause(),onResume()
9、,onStop(),onDestroy(),onRestart(),另一个Activity来到前台,该Activity重返前台,该Activity不可见,该Activity重返前台,演示回调函数的执行,4. 3示例演示,支撑知识5. Activity的文件存储,Android手机中的文件(如文本、图片、音频视频)可以存储在手机内存中或是外部存储器SD卡中,Android中提供了标准的Java文件输入输出流(FileOutputStream、FileInputStream)的方式来对文件数据进行读写。随着文件存储位置(内存、外部存储器)的不同,我们获取Java文件输入输出流的方式并不一样。,5.
10、 1 简介,/data/data/【包名】/files,/mnt/sdcard/,5. 1 相关的类,File,FileOutputStream,FileInputStream,write方法,read方法,5. 2 重要方法,5. 2 重要方法,5. 2 重要方法,5. 2 重要方法,演示File文件存储的使用默认目录存储和读取指定目录存储SD卡目录存储,5. 3示例演示,支撑知识6. SharedPreferences,为什么需要SharedPreferences?,6. 1 简介,1.输入用户名密码2.勾选“记住密码”登录3.再次登录时,点击【登录】时,需要保存用户名和密码,6. 1 简
11、介,写文件,读文件,将文件内容读出后,还需要进行字符串的解析,提取出用户名和密码的内容。,SharedPreferences为我们提供方便的、轻量级的数据存储;通常是用作应用程序中的参数配置或是一些属性的存储设置。例如我们可以通过它来保存用户上一次保存的信息或所做的修改,下一次应用程序启动后,就会为用户加载上一次保存的信息,可以减少用户重复设置、输入等麻烦,方便应用。SharedPreferences所存储的数据是以“键-值”的格式保存在xml文件中。该xml文件将存在于工程中的/data/data/包名/shared_prefs目录下。,6. 1 简介,6. 2 重要方法,6. 2 重要方法
12、-写SharedPreferences,获取SharedPreferences对象,获取Editor对象,向Editor对象中写入“键-值”,提交,6. 2 重要方法,6. 2 重要方法,6. 2 重要方法,6. 2 重要方法-读SharedPreferences,获取SharedPreferences对象,根据“键”读取其“值”,6. 2 重要方法,6. 2 其他方法(写SharedPreferences),演示如何利用SharedPreferences 保存登录界面中的密码,6. 3 实例演示,6. 3 实例演示,点击【登录】按钮,判断是否勾选了【记住密码】:勾选:设定REMBERPWD的
13、值为True,并设定USERNAME和PWD的值未勾选:设定REMBERPWD的值为False,并清除USERNAME和PWDonCreate方法,读取REMBERPWD的值,判断该值:True:读取USERNAME和PWD,并显示到EditText中,勾选了【记住密码】False:啥都不干,6. 3 实例演示,我们通过以下的流程来实现:总体分析界面布局创建项目创建字符串资源创建控件样式界面布局功能实现程序运行,任务实现1. 总体分析,1. 1登录界面,TextView控件,EditText控件,CheckBox、SharedPreferences,Button控件,一个隐藏的Progress
14、Bar、线程,1. 2“写入日记”界面,EditText、文件存储,Button、文件存储,1. 3流程处理,程序启动,载入“登录”界面,输入用户名/密码单击“登录”按钮,从手机内存中读取“MyDiary.txt”文件,将内容显示,跳至“写入日记”界面,从SharedPreferences读取密码,密码保存至SharedPreferences,修改内容,单击“保存”按钮,程序退出,N,Y,Y,Y,Y,N,N,N,任务实现2. 界面布局,演示创建项目:创建一个Android应用程序项目,取名为MyDiary;将默认的Activity名称MainActivity.java重命名为LoginActi
15、vity.java,其对应的XML布局文件为reslayoutactivity_login.xml;新建一个Activity名称为DiaryActivity.java,其对应的XML布局文件为reslayoutactivity_diary.xml 。,2. 1创建项目,演示创建字符串资源:在res/values/strings.xml 中添加字符串资源:,2. 2创建字符串资源,用户名 密码 记住密码 登录 保存 我的日记 请在这儿写下你的心情日记,演示如何创建资源,2. 3创建控件样式, ,2. 4登录界面布局的实现,RelativeLayout,activity_login.xml总体布局
16、采用RelativeLayout相对布局放置各种控件,“我的日记”Textview,用户名/密码EditText,记住密码CheckBox,登录Button,进度条ProgressBar,activity_diary.xml总体布局采用LinearLayout垂直线性布局放置各种控件利用资源设置“写日记”的EditText控件的边框与背景色,2. 5“写入日记”界面布局实现,LinearLayout,“写日记”的EditText,“保存”按钮,任务实现3. 功能实现,3. 1登录界面功能实现-申明变量,在LoginActivity.java类中申明成员变量,包括控件相关的对象、SharedPr
17、eferences对象、处理消息的Handler对象、记录当前进度的progress变量。public class LoginActivity extends Activity EditText usernameEdit; / 用户名输入框EditText pwdEdit; / 密码输入框CheckBox rememberPwdCheck;/ 记住密码的复选框Button loginBtn;/ 登录按钮ProgressBar progressBar;/ 进度条SharedPreferences pref; / 简单数据存储Handler handler; / 线程的手柄static final
18、 int STOP = 0 x111;/ 进度完成的标志static final int CONTINUE = 0 x112;/ 继续显示进度条的标志static final int MAX = 100; / 最大的进度为100%int progress; / 进度条的当前进度,3. 1登录界面功能实现-完成程序总体框架,在LoginActivity.java中重写onCreate()方法protected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.l
19、ayout.activity_login);init(); / 初始化工作setListeners();/ 事件监听,void init() /* 初始化控件变量 */initViews();/* 初始化线程的手柄 */initHandler();,3. 1登录界面功能实现-实现initViews()方法,void initViews() usernameEdit = (EditText) findViewById(R.id.edit_username);pref = getSharedPreferences(userinfo, Context.MODE_PRIVATE);usernameEd
20、it.setText(pref.getString(USERNAME, );if (pref.getBoolean(REMBERPWD, false) pwdEdit.setText(pref.getString(PWD, ); else pwdEdit.setText();rememberPwdCheck.setChecked(pref.getBoolean(REMBERPWD, false);progress = 0;progressBar.setProgress(progress);progressBar.setMax(MAX);,3. 1登录界面功能实现-实现initHandler()
21、,handler = new Handler() public void handleMessage(Message msg) switch (msg.what) case CONTINUE: /进度未完成if (!Thread.currentThread().isInterrupted() / 当前线程正在运行progressBar.setProgress(progress);break;case STOP: /进度已完成Intent intent = new Intent();intent.setClass(LoginActivity.this, DiaryActivity.class);
22、startActivity(intent);finish(); / 结束该Activitybreak; ;,3. 1登录界面功能实现-实现setListeners(),String username = usernameEdit.getText().toString();String pwd = pwdEdit.getText().toString();if (!username.equals(admin) | (!pwd.equals(admin) Toast.makeText(LoginActivity.this, 用户名或密码不正确,Toast.LENGTH_LONG).show();
23、else /*用户名与密码都正确的情况处理*/Editor editor = pref.edit();if (rememberPwdCheck.isChecked() editor.putString(USERNAME, username);editor.putString(PWD, pwd);editor.putBoolean(REMBERPWD, true);mit(); else editor.putBoolean(REMBERPWD, false);usernameEdit.setEnabled(false);pwdEdit.setEnabled(false);loginBtn.set
24、Enabled(false);,处理“记住密码”的SharePreference,3. 1登录界面功能实现-实现setListeners(),progressBar.setVisibility(View.VISIBLE);new Thread(new Runnable() public void run() for (int i = 0; i 5; i+) progress = (i + 1) * 20;Thread.sleep(1000);if (i = 4) Message msg = new Message();msg.what = STOP;handler.sendMessage(ms
25、g);break; else Message msg = new Message();msg.what = CONTINUE;handler.sendMessage(msg);).start();,显示5s的进度条,/*循环5次,每次睡眠1s*/,3. 2“写入日记”界面与功能实现-变量申明,在DiaryActivity类中申明成员变量,包括控件相关的对象、用于文件操作的输入输出流对象、实现两次按“返回键”退出应用程序相关的变量:EditText mydiaryEditText; / 写入日记的文本输入框Button saveButton; / 保存按钮static final String
26、FILENAME = MyDiary.txt; / 日记的文件名FileOutputStream fOutputStream; / 文件输出流FileInputStream finputStream;/ 文件输入流boolean isExit;/ 是否退出应用程序标志private long exitTime = 0;/ 按返回键的时间,3. 2“写入日记”界面功能实现-完成程序总体框架,在DiaryActivity.java中重写onCreate()方法protected void onCreate(Bundle savedInstanceState) super.onCreate(save
27、dInstanceState);setContentView(R.layout.activity_login);init(); / 初始化工作setListeners();/ 事件监听,3. 2“写入日记”界面功能实现-实现init ()方法,mydiaryEditText = (EditText) findViewById(R.id.edit_mydiary); saveButton = (Button) findViewById(R.id.btn_save); isExit = false;/ 将上次保存的日记文件打开finputStream = openFileInput(FILENAM
28、E);ByteArrayOutputStream bou = new ByteArrayOutputStream();byte buffer = new byte1024;int length = 0;while (length = finputStream.read(buffer) != -1) bou.write(buffer, 0, length);mydiaryEditText.setText(new String(bou.toByteArray();,3. 2“写入日记”界面功能实现-实现setListeners(),void setListeners() saveButton.se
29、tOnClickListener(new OnClickListener() Overridepublic void onClick(View v) fOutputStream = openFileOutput(FILENAME,Context.MODE_PRIVATE);fOutputStream.write(mydiaryEditText.getText().toString().getBytes();Toast.makeText(DiaryActivity.this, 保存成功, Toast.LENGTH_LONG).show();,将EditText控件中的文本内容重新写回File文件
30、中,任务实现4. 运行应用,4. 1运行结果,5秒之后,回顾进度条ProgressBar控件与线程的结合使用回顾Activity的生命周期,以及如何利用Intent进行跳转回顾Android中最常见的两种数据存储-SharedPreferencse和文件存储,请大家实现一个简单的“备忘录”软件,功能与界面要求如下:用户打开软件后,首先显示的是欢迎界面,在欢迎界面中要求有进度条(进度条的style可以自行选择);当5s之后,也就是进度条的进度结束后,系统转至“备忘录”主界面。在该界面中以列表的方式展示各项备忘录的标题与内容简介;当用户单击“增加”按钮,可以增加一条备忘录信息。当用户单击列表中的某一项,可以显示该条备忘录的具体内容信息;所有的备忘录信息都以文件的形式存储在手机内存或是SD卡中。,