密码日记

来源:互联网 发布:centos和ubuntu区别 编辑:程序博客网 时间:2024/06/10 21:37

一、功能需求分析

在开始编码之前,需要先对程序进行需求分析,想一想带密码功能的日记本中应该具备哪些功能。将这些功能全部整理出来之后,才好动手去一一实现。这里我认为在带密码功能的日记本中至少应该具备以下功能。

1. 可以创建一篇新的日记。

2. 可以查看你已经写好的日记。

3. 可以自由地搜索你已经写好了的日记。

4. 可以对你写的日记进行加密,保护你的个人隐私。

5. 如果你觉得以前哪一篇写的不好,可以进行删除修改。

虽然看上去只有五个主要的功能点,但如果想要全部实现这些功能却需要用到UI、网络、定位、数据存储、服务等技术,因此还是非常考验综合应用能力的。不过好在这些主要技术在以前的学习过程中都学习过了,所以做的过程中遇到的阻力小了很多。

二、具体实现的功能和不足之处

  在这个应用中具体的实现了:

      1.你可以手动的去创建你自己今天的心情日记,并且可以选择今天的日期和天气,帮你留助每一天最深刻的回忆。

      2.你可以点击查看按钮,对你已经创建了的日经进行查看。

      3.如果你哪一天想看看以前的日记了,可以点击搜索按钮对你以前的日记进行搜索查看。

      4.如果你有自己的小秘密写在了日记里,你可以使用加密功能对日记进行加密,保护你的个人隐私。

   在这个应用中,没能实现删除日记的操作,虽然写入删除的一些方法,但是并不能具体实现。

三、用到的技术分析

sharedpreferences的用法

  SharedPreferences的使用非常简单,能够轻松的存放数据和读取数据。SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。

   getPreferences和getSharedPreferences的区别:

1.getPreferences只能由Activity调用,只在调用它的Activity范围内有效。

2.getSharedPreferences是由Context调用,在包范围内有效。可以这样理解,AndroidManifest.xml文件中定义了包的位置,比如我的测试程序中定义的包为cn.kael.sample,那么android会建立data/data/cn.kael.sample/shared_prefs/的目录,并在其下产生SharePreferences文件。因此如果已经在一个地方使用了SharedPrefernces,并创建了相应的SharedPrefernces文件,然后你想在另一个地方使用该SharedPrefernces文件,你只需要根据文件的路径规则判断在新的地方使用SharedPrefernces生成的路径是不是和之前SharedPrefernces文件的路径一致,就可以知道两者之间是否能够共用SharedPrefernces,即使它们不属于同一个应用程序(因为android是根据包名来决定SharedPrefernces文件的创建位置的,和应用程序名无关)。

关于mode参数:

要想在程序B想访问程序A的SharedPrefernces文件:

首先需要程序A在创建SharedPrefernces时使用MODE_WORLD_WRITEABLE或者MODE_WORLD_READABLE作为mode参数:
[mw_shl_code=java,true]SharedPreferences settings = this.getSharedPreferences("shared_file", Context.MODE_WORLD_WRITEABLE);[/mw_shl_code]

然后在程序B中需要先创建程序A的context对象,然后再通过这个context对象来调用getSharedPreferences方法:
[mw_shl_code=java,true]Context contextA = createPackageContext("cn.kael.sample",                    Context.CONTEXT_IGNORE_SECURITY);SharedPreferences settings = contextA.getSharedPreferences(                    "shared_file", Context.MODE_WORLD_WRITEABLE);[/mw_shl_code]

 

 Handler的定义:
    Handler主要接收子线程发送的数据, 并用此数据配合主线程更新UI,用来跟UI主线程交互用。比如可以用handler发送一个message,然后在handler的线程中来接收、处理该消息,以避免直接在UI主线程中处理事务导致影响UI主线程的其他处理工作,Android提供了Handler作为主线程和子线程的纽带;也可以将handler对象传给其他进程,以便在其他进程中通过handler给你发送事件;还可以通过handler的延时发送message,可以延时处理一些事务的处理。
通常情况下,当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发。如果此时需要一个耗时的操作,例如:联网读取数据,或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,如果你放在主线程中的话,界面会出现假死现象,如果5秒钟还没有完成的话,会收到Android系统的一个错误提示"强制关闭".
这个时候我们需要把这些耗时的操作,放在一个子线程中,因为子线程涉及到UI更新,但是当子线程中有涉及到操作UI的操作时,就会对主线程产生危险,也就是说,更新UI只能在主线程中更新,在子线程中操作是危险的. 这个时候,Handler就出现了来解决这个复杂的问题,由于Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据,这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传递)Message对象,(里面包含数据), 把这些消息放入主线程队列中,配合主线程进行更新UI。
 
 Handler一些特点:
        handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程), 也就是说Handler对象初始化后,就默认与对它初始化的进程的消息队列绑定,因此可以利用Handler所包含的消息队列,制定一些操作的顺序。

 

 用handle更新ui的一些用法:

     一般Activity 一开始会加载主线程,如果页面上的数据是静态的,也不用怎么改变和交互,这种情况下完全用不上Handler。

但是一般的app都离不开网络数据的动态加载(加载数据后需要更新UI),或者有一些数据交互或点击事件的触发(点击后更新UI),这种情况就需要考虑使用Handler,

Handler 可以把加载的数据或点击后改变的数据 通过  sendMessage 方法发送到一个消息队列,然后在消息队列里面获取数据后更新UI

 

 

 

0 0
原创粉丝点击