第5章 基本程序单元Activity
它代表手机屏幕中的一屏,在其生命周期中,有一些方法会被系统回调,见下图:
1、创建、配置、启动和关闭Activity
◆创建。一般是继承android.app包中的Activity类,但如果说比如只想实现一个列表,那么可以继承ListActivity。通常情况需要重写onCreate方法,且调用setContentView方法显示视图。
◆配置。需要在AndroidMannifest.xml中添加该Activity。
◆启动。startActivity(intent)
◆关闭。在当前Activity中调用finish()
2、多个Activity的使用
◆使用Bundle在Activity之间交换数据,如:
Intent intent=new Intent (MainActivity.this,RegisterActivity.class);
Bundle bundle=new Bundle();
bundle.putCharSequence("user",user);//user为String类型。
intent.putExtras(bundle);
startActivity(intent);
接收方:
Intent intent=getIntent();
Bundle bundle=intent.getExtras();
String aa=bundle.getString("user");
3、调用另一个Activity并返回结果
使用startActivityForResult(intent,CODE);
可以用这个CODE来进行判断。做相应的处理。
4、使用Fragment
即碎片的意思,使用多个Fragment可以在一个单独的Activity中建立多个UI面板,也可以在多个Activity中重用Fragment。
Activity被暂停或者被销毁时,Fragment也被暂停或销毁,但是当Activity在运行时,可以单独的对每一个Fragment进行操作,如添加或删除。
◆创建Fragment
必须创建一个Fragment的子类,或者继承自另一个已经存在的Fragment的子类,并重载onCreateView方法。
◆在Activity中添加Fragment
一种方法是直接在布局文件中添加,另一种是在运行的时候将其添加进Activity的布局中。
为了让程序支持横屏和竖屏需要创建两个布局文件??这个难度就有点大,多余多屏情况,工作量很大。
此处有两个例子,其代码下一次一定要仔细看下。
第6章 Android应用核心Intent
1、Intent包含组件名称、动作、数据、种类、额外和标记等内容。
◆组件名称。由类名和包名组成。可以用setComponet进行设置,用getComponent方法读取。
◆动作。目标组件包括Activity和Broadcast这两类。
标准Activity动作,有ACTION_MAIN(作为初始的Activity启动,没有数据输入/输出) ACTION_EDIT (将数据显示给用户用于编辑)等。
Broadcast 动作 有ACTION_TIME_TICK(每分钟通知一次当前时间改变)
可以使用setAction方法设置动作,可以用getAction方法读取。
◆数据。Data表示操作数据的URI和MIME类型。不同的动作和不同的数据类型匹配。如动作是ACTION_EDIT的话,那么数据就是包含用来编辑文档的URI.
可以用setDataAndType同时制定数据的URI和MIME类型。
◆种类Category
有CATEGORY_DEFAULT等。方法有addCategory等。
◆额外。可以通过putExtras和getExtras来设置和读取Bundle
◆标记Flags
2、Intent使用
如返回桌面
Intent intent=new Intent();
intent.setAction(intent.ACTION_MAIN);
intent.addCategory(intent.CATEGORY_HOME);
startActivity(intent);
Intent可以分为显示和隐式两类。
其中显示Intent通过组件名称来制定目标组件。而对于隐式则需要使用不同的策略。一般通过Intent过滤器来接收
3、Intent过滤器
一般通过在配置文件中用<intent-filter>来进行设置。
至少包含一个<action>标签,同样包括数据以及种类测试。
第7章 事件处理
通过重载按键事件,以及根据按键码来进行判断和识别的。
第11章 ContentProvider实现数据共享
是不同应用程序之间共享数据的唯一方式
1、使用预定义的Content Provider
通过getContentResolver获取对象,然后用query(URI,固定列...)方法查询,再通过索引进行遍历,获取字段值
在这之前要再AndroidManifest中要添加访问比如联系人记录的权限,uses-pemission。。。
2、自定义 Content Provider
如果自定义Content Provider那么需要完成以下操作:
建立数据存储系统、继承ContentProvider类来提供数据访问方式
在应用程序的AndroidManifest文件中声明Content Provider
第12章 线程与消息处理
对于比较耗时的操作,一般都会开辟一个单独的线程来执行,对UI的操作由主线程执行,子线程要想操作UI必须通过消息处理传递机制Handler来解决这个问题。
1、创建线程
创建线程有两种方法,一种是通过Thread类的构造方法创建线程对象(可以自定义线程类(继承Thread),或者直接在语句中使用创建),并重写run()方法实现,另一种是通过实现Runnable接口实现
2、线程操作
start() sleep(1000)interrupt()
一点语法:Log.i("提示:","中断线程")//第一个参数为Tag 第二个参数为Text
int 转string String.valueOf(i);
3、Handler消息传递机制
◆循环者Looper
一个线程对应一个Looper对象,而一个Looper对象又对应一个MessageQueue队列,而MessageQueue用于存放Message。可以有多个Handler
要想在子线程中Handler对象,首先要使用Looper类的prepare()方法来初始化一个Looper对象,然后创建Handler对象,从消息队列中获取和处理消息。再使用Looper类的loop()方法启动Looper.
◆Handler的作用
(1)将message或Runnable应用post()或者sendMessage()方法发送到MessageQueue中,当MessageQueue循环到该消息时,则调用相应的handlerMessage方法对齐进行处理
(2)在子线程中与主线程进行通信,也就是与UI线程进行通信。
具体用法:利用实现接口做一个线程,在里面用handler获取,设置,发送消息
在主线程中实例化handler获取以及处理消息,根据信息更新界面。
4、Service应用
Service用于在后台完成用户指定的操作,用户可以使用其他控件来与Service进行通信。可以再后台处理网络事物,播放音乐、执行I/O、进程间通信(IPC)或者与ContentProvider通信。
Started Service
当其它组件如(Activity)调用startService()启动服务,一旦启动,则在后台无限期运行,如果操作完成,服务需要停止自身。
调用方式为:
startService() ->如果是第一次创建则onCreate() 执行一次性建立过程-> onStartCommand()->需要所使用stopSelf()停止自身,或者其它组件调用stopService()
Bound Service
当其它组件调用bindService()方法绑定到服务,多个组件可以绑定到一个服务,当它们都解绑时,服务才被销毁(onDestroy())。
bindService() ->如果是第一次创建则onCreate() 执行一次性建立过程-> onBind()-> 都解绑时系统将其销毁
可以通过Intent来使用这两种服务,可以将服务声明为私有的,从而阻止其它应用程序的访问。
5、创建Started Service
继承IntentService类
在不需要同时处理多个请求的情况下,使用IntentService类来实现服务时非常好的选择,只需要实现onHandleIntent()方法来完成客户端的任务。
继承Service类
如果需要让服务处理多个请求时,就用到它。需要开启新线程来执行任务,每次处理一个请求
6、创建Bound Service
方法有:继承Binder类、使用Messenger、使用AIDL
◆如果服务仅用于本地应用程序并且不跨进程工作,则可以实现自己的Binder类,如客户端与服务位于同一个应用程序和进程。
◆如果需要服务与远程进程通信,则可以使用Messenger来为服务提供接口,该技术允许不使用AIDL执行进程间通信(IPC)
◆如果使用AIDL则需要添加一些东西
7、管理Service的生命周期
见第四条。
服务这一章下次需要好好整一整。
第14章 网络编程及Internet应用
1、使用HttpURLConnection访问网络
需要使用URL的openConnection方法来获得。
◆默认发送get请求,地址?参数名=参数值,使用,分隔。进行传递,传递中文会产生乱码,因此要用Base64编码来解决乱码问题。
若要访问网络资源,还要获取权限。
◆get方式发送的请求值适合发送1024个字节以内的数据,若数据较大时,就要用post方式来提交,此时,需要用setRequestMethod("POST")等其它一些参数。
2、使用HttpClient访问网络
对于简单页面提交可以用HttpURLConnection来搞定,但是对于复杂的联网操作,就需要用Apache组织提供的HttpClient项目来实现。不过它实际上是对原来的访问网络的方法进行了封装。
◆发送get请求
(1)创建HttpClient对象
(2)创建HttpGet对象
(3)如果需要发送请求参数,可以用HttpGet的setParams()方法来添加请求参数。
(4)调用HttpClient对象的execute方法发送请求。返回一个HttpResponse对象
(5)调用HttpResponse的getEntity方法,获得包含响应内容的HttpEntity对象,通过该对象可以获取服务器响应的内容。
◆发送POST请求类似。
3、使用WebView显示网页
安卓提供了内置的浏览器,该浏览器使用了开源的WebKit引擎,可以搜索网址、看电子邮件、播放视频节目等。
◆通过loadUrl方法可以加载指定的网页。
◆loadData方法和loadDataWithBaseURL都可以加载HTML代码。但是前者加载中文时,会乱码,而后者不会。
◆通过getSetting().setJavaScriptEnabled(true)方法可以让JavaScript可用。但若使对话框也可以加载的话还要用setWebChromeClient方法。
数据库
在安卓系统中,集成了一种轻量型的数据库即SQLite,是使用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。
SQLiteOpenHelper类是用来创建数据库的。
SQLiteDatabase类是用来管理数据库的。