安卓 课程学习心得

时间:2019-05-12 12:54:27下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《安卓 课程学习心得》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《安卓 课程学习心得》。

第一篇:安卓 课程学习心得

心得体会

学号: 姓名: 班级:

一开始接触 Android 是从自己的手机开始的,觉得它很酷,是我喜欢的风格,然后我就通过了一些网络渠道去了解Android。在选课的时候发现有这个课程,于是我就报名了。刚开始接触 Android开发时感觉到它很有意思,在界面开发上和 web 也可以形成了相通的架构,更加方便,视觉上也是非常的酷。Android作为新兴的手机操作系统,适应潮流的发展,在一定程度上迎合了现代人们最求效率和最求完美的心态,再加上的它的先进之处,所以 Android 的发展很快,Android 的应用资源也越来越广泛,现在的 Android 正在快速形成一个只能手机王国,给人们提供日常娱乐和办公的平台,无论在哪些方面,Android 的表现总是能够让人满意,它正在快速地占领手机终端,未来的智能手机领域将是 Android 的天下,越来越多的人选用 Android平台的手机。如果说追求苹果是因为苹果的高端与美感,那么追求 Android 则是因为它的先进性开源性,也正是因为 Android 这些吸引人们瞩目的特点,才会有越来越多的人对 Android 充满激情,Android 的发展也才能这样的迅猛,所以在这里要先谢谢 Goolge,以及那些充满激情的开发者们。首先在界面上,我们同样可以通过不同布局进行设计非常酷的界面,这些界面可以通过 include 进行引入,我们可以通过一些公用的方法写个 BaseActivity 这个基类,通过继承方式比较不错的实现了 Activity 的界面,因为这样你可以 Header(头部)和 Footer(尾部)进行处理一些触发事件或者特效等。布局模式以相对模式为主,线线布局模式可以在比较简单的 include 进行完成,最重要的一点就是:我们可以自己通过重写方法或者通过实现 View 或者 Layout 等类进行扩充项目需要的布局(或者控件),在学习界面中,Android 为我们提供了很好的类似反射机制,通过 Layout 文件夹下的配置文件,可以快速的形成界面,在配置文件可以设置属性或者样式都是很快捷方便。对比较特殊的界面也可以通过处理嵌入到指定的界面,同样可以通过java 代码直接创建View 进行添加,不过这种方式比较复杂。对一些点击、选中、按键等处理的事件,界面之间的 跳转 Intent 管理,通过 Bundle 对数据在界面之间进行传输。其次在手机交互式通信服务中,学习了 Android 手机之间进行短信发送、广播、对广播的监听、服务等。

这次的课程我们主要学习了航班系统的设计,首先我们要建立航班查询:旅客就可通过网络访问该系统客户端网址,可根据旅客提供的出发时间、出发地点和目的地、舱位要求等,查询满足旅客要求的航班。通过检索可得到航班的相关信息,从而可以方便旅客订票并掌握所需信息,同时可减少工作人员的工作量。

第二,我们要建立旅客订票:旅客将订票的相关信息通过工作人员输入系统客户端。客户端将旅客的订票信息通过网络传送给服务端,服务端根据接收到的信息由航班安排系统为旅客安排座位并返回相应的确认信息给该客户端。订票信息生成后,存入相应的存储区域,并对数据库进行数据提交。客户端打印取票单及帐单给旅客,旅客在登机前,经信息核审后,即可领取机票登机。

第三,航班信息管理:航空公司可将所有航班的信息存入数据库,方便用户对航班基本信息查询,相 关工作人员可根据公司要求,经系统身份认证后登录并对航班信息进行修改等操作,从而使 航班信息便于管理。

第四:航班安排:从客户端接收到旅客的订票信息,该系统可在短时间内处理旅客航班问题。将 订票信息送往数据库并更新,客户端的航班查询信息也同步更新。节省时间的同时,也能让 旅客得到最新的航班信息。

第五,售票管理:旅客不仅可在各客户端进行机票预定,也可直接在机场的售票处购票,购票信息由系统提交到数据库进行管理更新。

第六,退票管理:机票有效期内,旅客若需退票,可在退票处进行退票。退票信息,由工作人员输入系统,系统对订票信息或售票信息进行删除更新。

第七,票销售情况核算:因为航空公司机票销售量大,而航空公司为了公司的经营,有需要在一定的时 间阶段了解公司机票的销售情况。而庞大的数据量通过人工来完成,似乎不太现实,而该系 统可帮助航空公司进行售票情况的核算。

这个课程紧跟住了现代科技的发展,让我们在第一时间和先进的科学技术做了一个亲密的接触,这样的课程能够点燃我们对某一个新兴领域的激情,这算是一个启蒙,让我们对 Android 先有了一个大概的了解,这个课程不一定能让我们很好的掌握 Android 的理念或者开发,但是能够让我们对 Android 产生浓厚的兴趣,让我们燃起探索Android 的欲望,我想这样就已经足够了。

第二篇:安卓学习心得

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中用标签来声明一个Service的访问权限,关于Android的安全问题也留待以后再解决吧。

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-filter和receiver(这个事情完全可以通过代码来做,只是这样就失去了修改的灵活性)。

当程序有一个消息希望发出去的时候,它需要将消息封装成一个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.学习感想

通过这学期对安卓的学习,大概了解了以上一些知识,对安卓有了初步的了解,这几个月给我的东西我想用有形的和无形的两部分概叙,形的当然就是技术水平的长进,虽然其中肯定有很多的不足,相信慢慢会体会到。

第三篇:如何学习安卓

如何学习安卓

想学编程开发,那要先会一门编程语言,现在可以试着去学学C语言,虽然这个安卓沾不上边,但是,C语言的编程思想还是很重要的,学完了C语言之后,他的语法基本上和所有的编程语言都很相像,能影响你的思维,帮助你理解其他的编程语言的。之后呢,在好好看看《数据结构》,这很重要。然后再去学学Java语言,因为Android的应用的开发语言用的是Java,所以一定要好好学习。

最后了解下数据库,我们在学习数据库之前都先学了《数据库原理》《离散数学》《关系代数》,有了这些基础之后再去学数据库,数据库也有很多可以选择的,推荐mysql。

加油!

第四篇:安卓实验报告

安卓实验报告

班级:学号:姓名:

xxxxx

11111111

xxxx

实验一:Activity生命周期的测试

一:实验目的

掌握使用Eclipse开发Android应用开发程序的方法; 掌握Android虚拟设备的创建方法; 了解Android的程序结构;

了解使用命令行创建Android程序方法;

了解Activity生命周期,理解Activity事件回调,onRestoreInstanceState()和 onSaveInstanceState两个函数的使用。

二:实验设备

Eclipse 开发Android 应用 Android虚拟设备(AVD)

三:实验内容

(1)正常启动ActivityLife,然后单击用户界面的“结束程序”按钮关闭程序。

(2)正常启动ACtivityLife,然后通过“拨号键”启动内置的拨号程序,再通过“回 退建” 退出拨号程序,使ActivityLife重新显示在屏幕中。

四:实验核心代码

package com.example.activitylife;

import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.os.Build;

public class MainActivity extends Activity { private static String TAG=“LIFECYCLE”;@Override

protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.fragment_main);Log.i(TAG,“(1)onCreate()”);Button button =(Button)findViewById(R.id.btn_finish);button.setOnClickListener(new OnClickListener(){

public void onClick(View view){

// TODO Auto-generated method stub

finish();

} });}

@Override

protected void onStart(){ // TODO Auto-generated method stub

super.onStart();Log.i(TAG,“(2)onStart()”);} @Override

protected void onRestoreInstanceState(Bundle savedInstanceState){ // TODO Auto-generated method stub

super.onRestoreInstanceState(savedInstanceState);Log.i(TAG,“(3)onRestoreInstanceState()”);} @Override

protected void onResume(){ // TODO Auto-generated method stub

super.onResume();Log.i(TAG,“(4)onResume()”);} @Override

protected void onSaveInstanceState(Bundle outState){ // TODO Auto-generated method stub

super.onSaveInstanceState(outState);Log.i(TAG,“(5)onSaveInstanceState()”);} @Override

protected void onRestart(){ // TODO Auto-generated method stub

super.onRestart();Log.i(TAG,“(6)onRestart()”);} @Override

protected void onPause(){ // TODO Auto-generated method stub

super.onPause();Log.i(TAG,“(7)onPause()”);} @Override

protected void onStop(){ // TODO Auto-generated method stub

super.onStop();Log.i(TAG,“(8)onStop()”);} @Override

protected void onDestroy(){ // TODO Auto-generated method stub

super.onDestroy();Log.i(TAG,“(9)onDestroy()”);} } 五:运行结果截图:

实验二:用户界面——自我介绍

一:实验目的:

了解各种界面控件的使用方法;

掌握按键事件和触摸事件的处理方法;

掌握radioButton和radioGroup的使用方法。

二:实验设备

Eclipse 开发Android 应用 Android虚拟设备(AVD)

三:实验内容

要求写一个自我介绍的安卓应用,包括姓名,性别,爱好,其中性别用radioButton选项编写,点击提交时,姓名,性别,爱好会在下面显示出来。

四:实验核心代码:

public class MainActivity extends Activity { private EditText editText1;private EditText editText2;private EditText editText3;private TextView textView1;private TextView textView2;private TextView textView3;private RadioGroup radioGroup;private RadioButton radioButton1;private RadioButton radioButton2;private Button button;protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

editText1 =(EditText)findViewById(R.id.e1);

editText2 =(EditText)findViewById(R.id.e2);

textView1 =(TextView)findViewById(R.id.t1);

textView2 =(TextView)findViewById(R.id.t2);

textView3 =(TextView)findViewById(R.id.t3);

radioGroup =(RadioGroup)findViewById(R.id.RadioGroup1);

radioButton1 =(RadioButton)findViewById(R.id.RadioButton1);

radioButton2 =(RadioButton)findViewById(R.id.RadioButton2);

button =(Button)findViewById(R.id.button1);

radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener(){

public void onCheckedChanged(RadioGroup arg0, final int arg1){

button.setOnClickListener(new View.OnClickListener(){

public void onClick(View arg0){

String str = editText1.getText().toString().trim();

String str1 = editText2.getText().toString().trim();

textView1.setText(“姓名:”+str);

textView3.setText(“爱好:”+str1);

if(arg1 == R.id.RadioButton1)

textView2.setText(“性别:”+“男”);

else if(arg1 == R.id.RadioButton2)

textView2.setText(“性别:”+“女”);

}

});

}

});} } 五:运行结果截图:

实验三:不同界面的切换

一:实验目的

掌握各种界面布局的特点和使用方法;

掌握选项菜单,子菜单和快捷菜单的使用方法。

二;实验设备

Eclipse 开发Android 应用 Android虚拟设备(AVD)

三;实验内容:

设计一个Tab标签页,实现LinearLayout,RelativeLayout,AbsoluteLayout三种分页面之间的切换,每个页面的内容包括用户名和确定,取消两个按钮

四:实验核心代码: AndroidMainfest.xml:

public class MainActivity extends TabActivity { protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TabHost tabHost=getTabHost();LayoutInflater.from(this).inflate(R.layout.tab1,tabHost.getTabContentView(),true);LayoutInflater.from(this).inflate(R.layout.tab2,tabHost.getTabContentView(),true);LayoutInflater.from(this).inflate(R.layout.tab3,tabHost.getTabContentView(),true);tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“线性布局”).setContent(R.id.layout01));tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“绝对布局”).setContent(R.id.layout02));tabHost.addTab(tabHost.newTabSpec(“TAB1”).setIndicator(“相对布局”).setContent(R.id.layout03));} } Tab1,java public class Tab1 extends Activity { public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.tab1);} }

Tab2.java public class Tab2 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.tab2);} }

Tab3.java public class Tab3 extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.tab3);} }

五:运行结果截图:

实验四:登陆界面和广播消息

一:实验目的

了解使用Intent进行组件通信的原理; 了解Intent过滤器的原理与匹配机制;

掌握发送和接受广播消息的方法。

二:实验设备

Eclipse 开发Android 应用 Android虚拟设备(AVD)

三:实验内容

先写一个登陆界面,包括用户名,密码,点击登陆时实现页面的跳转功能,在第二个页面使用Intent发送消息,并调用sendBroadcast()函数把Intent携带的消息传送出去,用BroadcastReceiver接受广播消息,在页面下方显示广播内容。

四;实验核心代码:

public class MainActivity extends Activity { private Button button;@Override

protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(Button)findViewById(R.id.button1);button.setOnClickListener(new View.OnClickListener(){

public void onClick(View arg0){

Intent intent=new Intent(MainActivity.this,Second.class);

startActivity(intent);

} });} } public class Second extends Activity { private Button button2;private EditText editText;protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.second);

Intent intent=getIntent();

editText=(EditText)findViewById(R.id.e1);

button2=(Button)findViewById(R.id.button2);

button2.setOnClickListener(new View.OnClickListener(){

public void onClick(View arg0){

Intent intent=new

Intent(“com.example.broadcasttest.MY_BROADCAST”);

intent.putExtra(“message”, editText.getText().toString());

sendBroadcast(intent);

}

});

}

public class MyBroadcastReceiver extends BroadcastReceiver{ public void onReceive(Context context, Intent intent){

String msg=intent.getStringExtra(“message”);

Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();} }

android:name=“.Second”>

五:运行结果截图

实验五:Service绑定实现数据运算

一:实验目的

了解Service的原理和用途;

掌握本地服务的管理和方法; 掌握服务的隐式启动和显示启动方法;

掌握远程服务的绑定和调用方法。

二:实验设备

Eclipse 开发Android 应用 Android虚拟设备(AVD)

三:实验内容

以绑定方式使用Service,获取Service实例,当点击绑定服务时可以实现两个数的求差和比较大小功能,并输出结果,当点击取消绑定服务时,则无法运算。

四:实验核心代码

public class MathService extends Service{ private final IBinder mBinder=new LocalBinder();public class LocalBinder extends Binder{ MathService getService(){

return MathService.this;} } public IBinder onBind(Intent intent){ Toast.makeText(this, “本地绑定:MathService”,Toast.LENGTH_SHORT).show();return mBinder;}

public boolean onUnbind(Intent intent){ Toast.makeText(this, “取消本地绑定:MathService”, Toast.LENGTH_SHORT).show();return false;}

public long sub(long a,long b){ return a-b;}

public int compare(long a,long b){ if(a>b)return 1;else if(a==b)return 0;else return-1;

} }

public class MainActivity extends Activity { private MathService mathService;private Button button1;private Button button2;private Button button3;private Button button4;private EditText editText1;private EditText editText2;private EditText editText3;private boolean isBound=false;@Override

protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);editText1=(EditText)findViewById(R.id.e1);editText2=(EditText)findViewById(R.id.e2);editText3=(EditText)findViewById(R.id.e3);button1=(Button)findViewById(R.id.but1);button2=(Button)findViewById(R.id.but2);button3=(Button)findViewById(R.id.but3);button4=(Button)findViewById(R.id.but4);button1.setOnClickListener(new View.OnClickListener(){

public void onClick(View v){

if(!isBound){

final Intent serviceIntent=new Intent(MainActivity.this,MathService.class);

bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);

isBound=true;

}

}

});button4.setOnClickListener(new View.OnClickListener(){

public void onClick(View v){ if(isBound){

isBound=false;unbindService(mConnection);

mathService=null;}

} });

button2.setOnClickListener(new View.OnClickListener(){

public void onClick(View v){

if(mathService==null){

editText3.setText(“未绑定服务”);

return;

}

String a = editText1.getText().toString();

long a1 = Long.parseLong(a);

String b = editText2.getText().toString();

long b1 = Long.parseLong(b);

long result=mathService.sub(a1, b1);

String msg=String.valueOf(a1)+“-”+String.valueOf(b)+

“=”+String.valueOf(result);

editText3.setText(msg);

} });

button3.setOnClickListener(new View.OnClickListener(){

public void onClick(View v){

if(mathService==null){

editText3.setText(“未绑定服务”);

return;

}

String a = editText1.getText().toString();

long a1 = Long.parseLong(a);

String b = editText2.getText().toString();

long b1 = Long.parseLong(b);

long result=mathService.compare(a1, b1);

if(result==1){

editText3.setText(a+“>”+b);

}

else if(result==0){

editText3.setText(a+“=”+b);

}

else {

editText3.setText(a+“<”+b);

}

} });} private ServiceConnection mConnection=new ServiceConnection(){

public void onServiceDisconnected(ComponentName arg0){

mathService=null;

}

public void onServiceConnected(ComponentName name, IBinder service){

mathService=((MathService.LocalBinder)service).getService();

} };}

实验六:SQLite实现用户的增删改查

一:实验目的

了解SQLite数据库的特点和体系及结构;

掌握SQLite数据库的建立和操作方法;

理解ContentProvide的用途和原理;

掌握ContentProvider的创建和使用方法。

二:实验设备

Eclipse 开发Android 应用 Android虚拟设备(AVD)

三:实验内容

使用SQlite数据库实现用户(包括:姓名,年龄,身高)的添加数据,全部显示,清除显示,全部删除,ID删除,ID查询,ID更新的功能。

四:实验核心代码

public class MainActivity extends ActionBarActivity { private EditText et_name;private EditText et_sex;private EditText et_department;private EditText et_id;private EditText et_salary;private MyOpenHelper oh;private SQLiteDatabase db;private TextView tv;private LinearLayout ll;@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

oh = new MyOpenHelper(MainActivity.this, “test.db”, null, 1);

db = oh.getWritableDatabase();

et_name =(EditText)findViewById(R.id.et_name);

et_sex =(EditText)findViewById(R.id.et_sex);

et_department =(EditText)findViewById(R.id.et_department);

et_salary =(EditText)findViewById(R.id.et_salary);

et_id =(EditText)findViewById(R.id.et_id);

ll =(LinearLayout)findViewById(R.id.ll);}

public void add(View v){

db = oh.getWritableDatabase();

String name=et_name.getText().toString();

String sex=et_sex.getText().toString();

String department=et_department.getText().toString();

String salary=et_salary.getText().toString();

ContentValues values=new ContentValues();

values.put(“name”,name);

values.put(“sex”, sex);

values.put(“department”,department);

values.put(“salary”, salary);

db.insert(“staff”, null, values);

tv=new TextView(MainActivity.this);

tv.setText(“添加成功”);

db.close();} public void show(View v){

db = oh.getWritableDatabase();

Cursor cursor=db.query(“staff”, null, null, null, null, null, null, null);

while(cursor.moveToNext()){

String id=cursor.getString(cursor.getColumnIndex(“_id”));

String name=cursor.getString(cursor.getColumnIndex(“name”));

String sex=cursor.getString(cursor.getColumnIndex(“sex”));

String department=cursor.getString(cursor.getColumnIndex(“department”));

String salary=cursor.getString(cursor.getColumnIndex(“salary”));

tv=new TextView(MainActivity.this);

tv.setText(“ID:”+id+“;”+“Name:”+name+“;”+“Sex:”+sex+“;”+“Department:”+department+“;”+“Salary”+salary);

ll.addView(tv);

}

db.close();} public void clear(View v){

ll.removeAllViews();} public void deleteAll(View v){

db = oh.getWritableDatabase();

db.delete(“staff”, null, null);

tv=new TextView(MainActivity.this);

tv.setText(“删除成功”);

db.close();}

public void deleteById(View v){

db = oh.getWritableDatabase();

String id=et_id.getText().toString();

db.delete(“staff”, “_id=?”, new String[]{id});

db.close();

tv=new TextView(MainActivity.this);

tv.setText(“ID删除成功”);} public void findById(View v){

db = oh.getWritableDatabase();

String id=et_id.getText().toString();

Cursor cursor=db.query(“staff”, null, “_id=?”, new String[]{id}, null, null, null, null);

while(cursor.moveToNext()){

id=cursor.getString(cursor.getColumnIndex(“_id”));

String name=cursor.getString(cursor.getColumnIndex(“name”));

String sex=cursor.getString(cursor.getColumnIndex(“sex”));

String department=cursor.getString(cursor.getColumnIndex(“department”));

String salary=cursor.getString(cursor.getColumnIndex(“salary”));

tv=new TextView(MainActivity.this);

tv.setText(id+“;”+name+“;”+sex+“;”+department+“;”+salary);

ll.addView(tv);

tv=new TextView(MainActivity.this);

tv.setText(“ID查询成功”);

}

db.close();} public void updateById(View v){

db = oh.getWritableDatabase();

String id=et_id.getText().toString();

String name=et_name.getText().toString();

String sex=et_sex.getText().toString();

String department=et_department.getText().toString();

String salary=et_salary.getText().toString();

ContentValues values=new ContentValues();

values.put(“name”,name);

values.put(“sex”, sex);

values.put(“department”,department);

values.put(“salary”, salary);

db.update(“staff”, values, “_id=?”, new String[]{id});

tv=new TextView(MainActivity.this);

tv.setText(“更新ID成功”);

db.close();} }

public class MyOpenHelper extends SQLiteOpenHelper {

public MyOpenHelper(Context context, String name, CursorFactory factory,int version){

super(context, name, factory, version);}

@Override

public void onCreate(SQLiteDatabase db){

db.execSQL(“create table staff(_id integer primary key autoincrement,name text,sex text,department text,salary float)”);}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){} }

五:运行结果截图

实验七:天气预报 一:实验目的

了解位置服务的概念;

了解地图密钥的申请方法;

掌握获取地理信息的方法;

二:实验设备

Eclipse 开发Android 应用 Android虚拟设备(AVD)

三:实验内容

写一个项目,实现显示天气预报的用户界面,显示已发送SMS短信的用户界面,不同地区天气的转换

四:实验核心代码

package com.example.weather;

import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;import java.util.ArrayList;import java.util.List;

import net.sf.json.JSONArray;import net.sf.json.JSONObject;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.view.View;import android.widget.ArrayAdapter;import android.widget.EditText;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;

import com.zy.bean.Sms;import com.zy.bean.Weather;

public class MainActivity extends Activity { private MyConn conn = new MyConn();;private EditText et_city;private TextView tv_result;private ImageView iv_weather;private Handler handler;private Intent intent;private MyOpenHelper oh;private ServiceFunctions sFunctions;private MyArrayAdapter myArrayAdapter = null;private ListView lv;private int a = 1;private Weather weather;private List smsList = null;

@Override protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

oh = new MyOpenHelper(MainActivity.this, “weatherdemo.db”, null, 1);

// System.out.println(“数据库创建完”);

et_city =(EditText)findViewById(R.id.et_city);

tv_result =(TextView)findViewById(R.id.tv_result);

iv_weather =(ImageView)findViewById(R.id.iv_weather);

lv =(ListView)findViewById(R.id.lv);

// System.out.println(“lv找到了”);

intent = new Intent(this, MyService.class);

startService(intent);

Toast.makeText(MainActivity.this, “服务启动”, 0).show();

bindService(intent, conn, BIND_AUTO_CREATE);

Toast.makeText(MainActivity.this, “服务绑定”, 0).show();

handler = new Handler(new Handler.Callback(){

@Override

public boolean handleMessage(Message msg){

final Weather weather =(Weather)msg.obj;

tv_result.setText(weather.toString());

}

new Thread(new Runnable(){ @Override public void run(){

// TODO Auto-generated method stub

try {

URL url = new URL(weather.getDayPictureUrl());

HttpURLConnection con =(HttpURLConnection)url

.openConnection();

con.setRequestMethod(“GET”);

if(con.getResponseCode()== 200){

final Bitmap bitmap = BitmapFactory

.decodeStream(con.getInputStream());

runOnUiThread(new Runnable(){

}

@Override

public void run(){

// TODO Auto-generated method stub

iv_weather.setImageBitmap(bitmap);

}

});}

} catch(Exception e){

// TODO Auto-generated catch block e.printStackTrace();}

}).start();

return false;} });class MyConn implements ServiceConnection {

@Override public void onServiceConnected(ComponentName name, IBinder service){ sFunctions =(ServiceFunctions)service;} @Override public void onServiceDisconnected(ComponentName name){

} } class MyArrayAdapter extends ArrayAdapter {

} public MyArrayAdapter(Context context, int resource,int textViewResourceId, List objects){ super(context, resource, textViewResourceId, objects);} public void saveWeather(View view){ if(a == 1){

sFunctions.insertInfo(weather, oh);

a++;} else {

sFunctions.updateInfoById(“1”, weather, oh);} Toast.makeText(MainActivity.this, “保存天气信息成功”, 0).show();} public void show(View view){ smsList = sFunctions.findAll(oh);if(smsList.size()> 0){

List sList = new ArrayList();

for(Sms sms : smsList){

String s = sms.toString();

sList.add(s);

}

if(sList.size()> 0){

myArrayAdapter = new MyArrayAdapter(MainActivity.this,R.layout.second, R.id.tv_show, sList);

lv.setAdapter(myArrayAdapter);

} } }

public void getWeather(View view){

new Thread(new Runnable(){

String city = et_city.getText().toString();

@Override

public void run(){

try {

URL url = new URL(“http://api.map.baidu.com/telematics/v3/weather?location=”

+ URLEncoder.encode(city)

+ “&output=json&ak=QLZmpAbwFlWreQ28kLVgvKEC”);

HttpURLConnection con =(HttpURLConnection)url

.openConnection();

con.setRequestMethod(“GET”);

int code = con.getResponseCode();

if(code == 200){

BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));

JSONObject json = JSONObject.fromObject(reader

.readLine());

// System.out.println(obj.toString());

JSONArray array = json.getJSONArray(“results”);

JSONObject obj = array.getJSONObject(0);

JSONObject weather_data = obj.getJSONArray(“weather_data”).getJSONObject(0);

weather = new Weather(obj.getString(“currentCity”), obj

.getString(“pm25”), weather_data

.getString(“date”), weather_data

.getString(“weather”), weather_data

.getString(“wind”), weather_data

.getString(“temperature”), weather_data

.getString(“dayPictureUrl”), weather_data

.getString(“nightPictureUrl”));

Message msg = new Message();

msg.obj = weather;

handler.sendMessage(msg);

}

} catch(Exception e){

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}).start();} }

package com.example.weather;

import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;

public class MyOpenHelper extends SQLiteOpenHelper {

public MyOpenHelper(Context context, String name, CursorFactory factory,int version){

super(context, name, factory, version);}

@Override public void onCreate(SQLiteDatabase db){

db.execSQL(“create table sms(_id integer primary key autoincrement,sms_sender text,sms_body text,sms_receive_time text,return_result text)”);

db.execSQL(“create table weatherinfo(_id integer primary key autoincrement,info text)”);}

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){

} }

package com.example.weather;

import java.util.List;

import android.app.Service;import android.content.Intent;import android.content.ServiceConnection;import android.os.Binder;import android.os.IBinder;

import com.zy.bean.Sms;import com.zy.bean.Weather;

public class MyService extends Service { private ISmsDaoImpl daoImpl;private MyBinder myBinder = new MyBinder();

@Override public IBinder onBind(Intent intent){

return myBinder;}

@Override public void unbindService(ServiceConnection conn){

super.unbindService(conn);}

class MyBinder extends Binder implements ServiceFunctions{

public long insertSms(Sms sms,MyOpenHelper oh){

return MyService.this.insertSms(sms,oh);

}

public List findAll(MyOpenHelper oh){

return MyService.this.findAll(oh);

}

public long insertInfo(Weather w,MyOpenHelper oh){

return MyService.this.insertInfo(w,oh);

}

public int updateInfoById(String id, Weather w,MyOpenHelper oh){

return MyService.this.updateInfoById(id, w,oh);

} }

public long insertSms(Sms sms,MyOpenHelper oh){

daoImpl=new ISmsDaoImpl(oh);

long id = daoImpl.insertSms(sms);

return id;}

public List findAll(MyOpenHelper oh){

daoImpl=new ISmsDaoImpl(oh);

List smsList = daoImpl.findAll();

return smsList;}

public long insertInfo(Weather w,MyOpenHelper oh){

daoImpl=new ISmsDaoImpl(oh);

long id = daoImpl.insertInfo(w);

return id;}

public int updateInfoById(String id, Weather w,MyOpenHelper oh){

daoImpl=new ISmsDaoImpl(oh);

int num = daoImpl.updateInfoById(id, w);

return num;} } 五:运行结果截图

第五篇:最佳安卓游戏

2010 最易上瘾游戏 最易上瘾游戏 愤怒的小鸟 Angry Birds 瞄准射击 shoot U!涂鸦切割 Slice It!碧湖垂钓 Fishin2 Go 涂鸦跳跃 Doodle Jump 重力滚球迷宫 Labyrinth 水果忍者 Fruit Ninja 扔纸团 Paper Toss 极限挑战 The Impossible Game 炸毁 Blow up 物理空间 Space Physics 2010 最具人气游戏 愤怒的小鸟 Angry Birds 会说话的汤姆猫 Talking Tom Cat 口袋传奇 Pocket Legends 地牢守护者 Dungeon Defenders First Wave 和雏子一起做运动 一起高尔夫 2 Lets Golf 2 HD 会说话的圣诞老人 Talking Santa 植物大战僵尸 3 细胞分裂 5 Splinter Cell Conviction HD 阿凡达 3D Avatar 天空的荣耀 Skies of Glory 2010 最具创意游戏 你画我猜 What The Doodle 食物大合作 Spaghetti Marshmallows 繁忙的办公室 Office Rush 小羊快跑 SheepRun 吉他 Guitar Solo 爆竹娃 Squibble 火箭兔子 Rocket Bunnies 扔纸团 Paper Toss 水果忍者 Fruit Ninja 涂鸦跳跃 Doodle Jump 2010 最佳竞速游戏 都市赛车 5 Asphalt5 极品飞车 13 变速 Need For Speed:Shift 速度与激情之地下狂飙 Fast&Furious Adrenaline 鲁莽赛车 Reckless Racing 3D 超音速飞行 TurboFly 3D 摩托大赛 Motorbike GP 疯狂卡丁车 Krazy Kart Racing 穿山甲大冒险 Armadillo Roll

口袋赛车 PocketRacing 我的纸飞机 2 My Paper Plane2 2010 最佳塔防游戏 机器人塔防 Robo Defense 城堡勇士 Castle Warriors 枪之荣耀 Guns'n Glory 丧尸围城 Grave defence 植物大战僵尸 Plants vs Zombies 失落的战役 Towser Defense 水晶塔防 Crystallight Defence 别惹恶魔 leave Devil alone 农夫大战外星人 Rednecks vs Aliens 钉子户大战拆迁队 2010 最佳对战游戏 地牢守护者 Dungeon Defenders First Wave 天空的荣耀 Skies of Glory 狂野飙车 5 Asphalt5 迷你空中军队 Mini Squadron 三国杀 FIFA10 足球盛宴 EA FIFA 10 疯狂卡丁车 Krazy Kart Racing 史瑞克 3D 赛车 Shrek Karting HD 2010 最佳益智游戏 涂鸦切割 Slice It 重力球迷宫 Labyrinth 超级跌落 Super tumble 炸毁 Blow up 轨道建设 X Construction 炼金术 Alchemy 飞机领航员 Flightfrenzy 功夫泡泡球 Bonsai Blast 俄罗斯方块 Terris 景丽时间 Tangram Time 2010 最佳重力感应游戏 重力球迷宫 Labyrinth 保龄球 iBowl 穿山甲大冒险 Armadillo Roll 专业模拟飞行 X Plane Flight Simulator 碧湖垂钓 Fishin Go 涂鸦跳跃 Doodle Jump 小铁球历险记 Little Metal Ball 极限摩托车 MX Moto 3D 重力球完整版 Prism 3D 天生杀人狂之食人鲨 3D Hungry Shark

2010 最佳模拟经营游戏 模拟人生 3 The Sims 疯狂农场 Farm Frinzy 美女餐厅 2 Diner Dash 游戏发展国 Game Dev Story 海盗餐厅 Barrr 口袋上帝 Pocket God 饭店大亨 Hotel Mogul 疯狂寿司店 欢乐王国 Haypi kingdom 货物管理员 Cargo 2010 最佳角色游戏 泽诺尼亚传奇系列 ZENONIA 地牢守护者 Dungeon Defenders First Wave 蜘蛛侠 SpiderMan Tot

al Mayhem HD 地牢猎人 Dungeon Hunter 神秘传说阿卡纳 Legends Arcana 恶魔猎手 CaligoChaser 斯巴达英雄 Hero of Sparta 罪恶都市之西海岸的喧嚣 Gangstar West Coast Hustle 2010 最佳体育游戏 最佳体育游戏 实况足球 2011 Real Soccer 2011 劲爆棒球 Homerun Battle 3D 高山滑雪 Big Mountain Snowboarding 超级棒球明星 2011 Baseball Superstars 2011 一起高尔夫 2 Lets Golf 2 HD 魔幻保龄球 Magic Bowling 3D 台球大师 3d pool master 美式足球 Backbreaker Football 3D 投篮 Basketball Shots 3D 09 国际橄榄球赛 Rugby Nations09 手指任意球 Flick Kick Football 2010 最佳网游 口袋传奇 Pocket Legends 明珠三国 2011 最值得期待游戏 植物大战僵尸 Plants vs Zombies 割绳子 Cut the Rope


下载安卓 课程学习心得word格式文档
下载安卓 课程学习心得.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    安卓实习报告

    通信与电子信息专业实训报告项目名称:基于android的游戏开发班 级 10通信1班姓 名学 号指导教师 成 绩实训时间:年月日—目录 一、实训目的及其意义 .............................

    安卓手机培训

    安卓系统: 简介:Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组......

    个人事迹材料-安卓

    个人事迹材料 我是经济管理系11级酒店管理的方亮,自入团以来积极参加团组织的各类活动。努力完成团组织交给的任务,时时刻刻记住我应该做什么,如何做好的思想理念。 我深刻认......

    安卓课程设计报告

    安 卓 课 程 设 计 班 级 09级计算机二班 学 号 20097923 姓 名 郭丹 目录 第1章安卓应用程序开发背景 .......................................................... 3 §1......

    安卓系统简介

    安卓系统简介 操作系统是计算机系统的基本组成部分,计算机技术的飞速发展和日益广泛的应用使得操作系统的类型,作用、计算环境等均发生了较大的变化。近十年来,新技术的出现......

    如何学习安卓开发

    如何学习安卓开发?安卓开发学习已经成为IT行业的新潮流。时下,Android也以其创造力、前瞻性、延续性和实现能力成为行业首领,可是怎么学好Android呢?今天,欧柏泰克的老师告诉你......

    安卓学习(精选五篇)

    安卓开发学习准备要点介绍 要说当下IT行业当中最具创造力、前瞻性、延续性和实现能力,想必有相当的人会把票投给Google的安卓,安卓开发学习也成为新潮流。安卓开发学习要做什......

    安卓市场审核标准(定稿)

    安卓市场审核标准 软件标准 一、软件运行: 1、须经实机测试可顺畅运行,带有扣费陷阱/恶意侵犯用户隐私/包含木马后门、病毒的软件,不予通过; 2、须基于android平台原生开发,如J2M......