1.http协议和soap协议的区别
HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。
SOAP(Simple Object Access Protocal,简单对象访问协议) 技术有助于实现大量异构程序和平台之间的互操作性,根据我有限的了解,SOAP是把成熟的基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起。比如我们.NET中的WEB服务,就是基于SOAP。
简单对象访问协议(SOAP)是W3C组织的一个Note, 它描述了一种在分散的或分布式的环境中如何交换信息的轻量级协议。SOAP是一个基于XML的协议,它包括三个部分:SOAP封装(Envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;SOAP编码规则(Encoding Rules),用于表示应用程序需要使用的数据类型的实例;SOAP RPC表示(RPC Representation),表示远程过程调用和应答的协定;SOAP可以和多种传输协议绑定(Binding),使用底层协议交换信息。在这个文档中,目前只定义了SOAP如何和HTTP以及HTTP扩展进行绑定的框架。
SOAP是个通信协议, SOAP在HTTP协议的基础上,把编写成XML的REQUEST参数, 放在HTTP BODY上提交个WEB SERVICE服务器(SERVLET,ASP什么的) 处理完成后,结果也写成XML作为RESPONSE送回用户端, 为了使用户端和WEB SERVICE可以相互对应,可以使用WSDL作为这种通信方式的描述文件,利用WSDL工具可以自动生成WS和用户端的框架文件,SOAP具备把复杂对象序列化捆绑到XML里去的能力。
SOAP的前身是RPC, 就是远程呼叫处理的协议,这个协议安全性不是很好,多数防火墙都会阻挡RPC的通信包,而SOAP则使用HTTP协议作为基本的协议,使用端口80使得SOAP可以透过防火墙,完成RPC的功能。
SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的,现在我们编写WEB SERVICE不需要深入理解SOAP也没关系。如果SERVICE和CLIENT在同样的环境下使用SOAP,由于一般情况下都有自动生成SOAP程序框架的工具,因此不知道细节也没关系. 可是, 如果CLIENT和SERVICE的环境不同,比如说JAVA的Client和.NET的SERVICE进行通信,或者是VB CLIENT和TOMCAT下的JAVA SERVICE通信,还是要知道一点细节为好. 特别是, WSDL或者UDDI都不是标准,如果不让用就只好手工配制SOAP MESSAGE啦。
2.http和https的区别
在URL前加https://前缀表明是用SSL加密的。你的电脑与服务器之间收发的信息传输将更加安全。 Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。 http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议
要比http协议安全
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议
它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。
它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。
HTTPS和HTTP的区别:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全
HTTPS解决的问题:
1 . 信任主机的问题. 采用https 的server 必须从CA 申请一个用于证明服务器用途类型的证书. 改证书只有用于对应的server 的时候,客户度才信任次主机. 所以目前所有的银行系统网站,关键部分应用都是https 的. 客户通过信任该证书,从而信任了该主机. 其实这样做效率很低,但是银行更侧重安全. 这一点对我们没有任何意义,我们的server ,采用的证书不管自己issue 还是从公众的地方issue, 客户端都是自己人,所以我们也就肯定信任该server.
2 . 通讯过程中的数据的泄密和被窜改
1. 一般意义上的https, 就是 server 有一个证书.
a) 主要目的是保证server 就是他声称的server. 这个跟第一点一样.
b) 服务端和客户端之间的所有通讯,都是加密的.
i. 具体讲,是客户端产生一个对称的密钥,通过server 的证书来交换密钥. 一般意义上的握手过程.
ii. 加下来所有的信息往来就都是加密的. 第三方即使截获,也没有任何意义.因为他没有密钥. 当然窜改也就没有什么意义了.
2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书.
a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码, 还有一个CA 认证过的身份. 应为个人证书一般来说上别人无法模拟的,所有这样能够更深的确认自己的身份.
b) 目前少数个人银行的专业版是这种做法,具体证书可能是拿U盘作为一个备份的载体.
HTTPS 一定是繁琐的.
a) 本来简单的http协议,一个get一个response. 由于https 要还密钥和确认加密算法的需要.单握手就需要6/7 个往返.
i. 任何应用中,过多的round trip 肯定影响性能.
b) 接下来才是具体的http协议,每一次响应或者请求, 都要求客户端和服务端对会话的内容做加密/解密.
i. 尽管对称加密/解密效率比较高,可是仍然要消耗过多的CPU,为此有专门的SSL 芯片. 如果CPU 信能比较低的话,肯定会降低性能,从而不能serve 更多的请求.
ii. 加密后数据量的影响. 所以,才会出现那么多的安全认证提示
3.listview的逐行显示
可以将每一条数据先加载到list集合中,然后通过适配器将每一条数据加载到listview中实现listview对数据的逐行显示。
4.string和stringbuffer和stringbuilder区别?
STRING的长度是不可变的,STRINGBUFFER的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法。
stringbuilder类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
5.html5?
HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML [1](标准通用标记语言下的一个应用)标准版本;现在仍处于发展阶段,但大部分浏览器已经支持某些 HTML5 技术。HTML 5有两大特点:首先,强化了 Web 网页的表现性能。其次,追加了本地数据库等 Web 应用的功能。广义论及HTML5时,实际指的是包括HTML、CSS和JavaScript在内的一套技术组合。它希望能够减少浏览器对于需要插件的丰富性网络应用服务(plug-in-based rich internet application,RIA),如Adobe Flash、Microsoft Silverlight,与Oracle JavaFX的需求,并且提供更多能有效增强网络应用的标准集。
是一种标记语言。
6.图片的异步加载的方法?
1.利用软引用来缓存图片Bitmap,用图片的URL作为缓存查找的Key;
2.设两级缓存,一级是SoftReference,二级是本地SD卡;
3.如果两级缓存都没取到图片,则从服务器获取,并加入缓存;
4.加载完后通过回调接口通知UI更新;
7.handler机制的原理,looper通过什么方法开始的?
一个Handler允许你发送和处理Message和Runable对象,每个线程都有自己的Looper,每个Looper中封装着MessageQueue。Looper负责不断的从自己的消息队列里取出队头的任务或消息执行。每个handler也和线程关联,Handler负责把Message和Runable对象传递给MessageQueue(用到post ,sendMessage等方法),而且在这些对象离开MessageQueue时,Handler负责执行他们(用到handleMessage方法)。
其中Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域。
默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息。调用Looper.loop()之后循环已经开始,下一个由handler发的message将会被这个handler的handleMessage方法处理,这是一个----循环。
Looper从MessageQueue中取出Message之后,交由Handler的handleMessage进行处理。处理完成后,调用Message.recycle()将其放入Message Pool中。
8.如何让Activity变成一个窗口?
答:在清单文件AndroidManifest.xml中相应的<activity>标签内设置属性android:theme=”@android:style/Theme.Dialog”
9.后台的Activity被系统回收怎么办?
除了在栈顶的Activity,其他的Activity都有可能在内存不足的时候被系统回收,一个Activity越处于栈底,被回收的可能性就越大。如果我们没有覆写onSaveInstanceState()方法,此方法的默认实现会自动保存Activity中的某些状态数据,比如Activity中各种UI空间的状态。Android应用框架中定义的几乎所有的UI控件都恰当的实现了onSaveInstanceState()方法,因此当Activity被摧毁和重建时,这些UI控件会自动保存和恢复状态数据。比如EditText控件会自动保存和恢复输入的数据,而CheckBox控件会自动保存和恢复选中状态。开发者只需要为这些控件指定一个唯一的ID(通过设置android:id属性即可),剩余的事情就可以自动完成了。如果没有为控件指定ID,则这个控件就不会进行自动的数据保存和恢复操作。
由上所述,如果我们需要覆写onSaveInstanceState()方法,一般会在第一行代码中调用该方法的默认实现:super.onSaveInstanceState(outState)。
10.ListView优化?
答:1)、对convetView进行判空,是当convertView不为空的时候直接重新使用convertView
从而减少了很多不必要的View的创建
2)定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
3)、当ListView加载数据量较大时可以采用分页加载和图片异步加载
11.onSaveInstanceState() 和 onRestoreInstanceState();
答: Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState() 会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。
xUtils 与 afinal 目前的主要区别:
afinal 的View注解要继承FinalActivity, 如果要使用FragmentActivity或其他View自定义视图就要对已有代码进行较大的改造,耦合太强,非常不方便,而xUtils使用静态初始化方法。
xUtils对http模块进行了较大的重构,支持大文件上传,支持7种http谓词,mutipart支持设置subType,下载支持302重定向...
1.JSON和XML的数据可读性基本相同
2.JSON和XML同样拥有丰富的解析手段
3.JSON相对于XML来讲,数据的体积小
4.JSON与JavaScript的交互更加方便
5.JSON对数据的描述性比XML较差
6.JSON的速度要远远快于XML
14.广播的两种注册方式
1)动态注册/非常驻型注册/在代码中进行注册:应用程序关闭后不能再接受广播信息
在应用程序的代码中注册
注册BroadcastReceiver: registerReceiver(receiver, filter);
取消注册BroadcastReceiver: unregisterReceiver(receiver);
2)静态注册/常驻型注册/Manifast.xml中注册:应用程序关闭后广播接收器仍能接受广播信息
在AndroidManifest.xml的application里面定义receiver并设置要接收的action,程序中的核心代码示例:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_EDIT);
sendBroadcast(intent);
15.android中Serializable和Parcelable的联系?
相同点:都是Android中自定义对象的序列化
不同点:
1) Serializable序列化时会产生大量的临时变量,因而频繁调用GC,
使用内存时Parcelable比Serializable性能高
2) Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点, 也不提倡用,但在这种情况下,还是建议用Serializable
3) Serializable 的实现,只需要继承 implements Serializable 即可
Parcelabel 的实现,需要在类中实现实现writeToParcel、describeContents函数以及静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口
3) Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。
16.一个应用中有多少个Context?
1、创建Application 对象时, 而且整个App共一个Application对象
2、创建Service对象时
3、创建Activity对象时
所以总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)
17.AsyncTask与使用线程处理耗时操作的优劣是?
AsyncTask:就是一个线程池,调用简单快捷,过程可控,操作灵活,但是更占用系统资源
需要多个异步操作并需要UI变更时就会变得复杂,如果异步任务的数据特别庞大,
AsyncTask这种线程池结构的优势就体现出来了
Thread:涉及到Looper,Thread,Handler,message结构清晰,功能定义明确,对于多个异步任务简单
Handler和Looper机制,它们均基于消息实现,有时可能消息队列阻塞或其他原因无法准确的使用
18.Fragment怎么实现的?
继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局
在Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。
一个FragmentTransaction对象可以执行多个增删修的方法,如果你想把这些修改提交到Activity上,必须在最后调用一下这个对象的commit()方法
两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。
为了实现两个Fragment的交互,您可以在Fragment中定义一个接口,然后再这个接口中定义一个方法,在Fragment的onAttach()方法中调用这个接口中的方法。然后让Activity实现这个方法来完成Activity和Fragment之间的通信
可以通过FragmentManager的findFragmentById()来查找一个Fragment
19.缓存怎么实现的?
缓存可分为二大类:
一、通过文件缓存,
顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式;
二、内存缓存,也就是实现一个类中静态Map,对这个Map进行常规的增删查下面为一个简单的缓存代码
三. 大数据量的缓存肯定还是要保存到文件,这里当然要用到第三方开源框架来实现了,常用的有Oscache,Ehcache,Jcache,Jbosscache等等很多
20.解析XML PULL解析?
pull解析同样基于事件驱动型,android 官方API提供,可随时终止,调用next() 方法提取它们(主动提取事件)
Pull解析器运行方式与SAX相似。它提供了类似的事件,如 开始元素事件, 结束元素事件。使用 parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个 switch对感兴趣的事件进行选择处理。当元素开始解析时,调用 parser.nextText()可以获得下一个Text类型元素的值。
21.横竖屏切换
1. 在AndroidManifest.xml中为Activity设置configChanges属性,
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
configChanges有如下选项: 1. orientation :屏幕在纵向和横向间旋转, 2. keyboardHidden:键盘显示或隐藏 ,3.fontScale:用户变更了首选的字体大小 4.locale : 用户选择了不同的语言设定,5. keyboard :键盘类型变更,例如手机从12键盘切换到全键盘 6. touchscreen或navigation:键盘或导航方式变化,
如果缺少了keyboardHidden选项 不能防止Activity的销毁,并且在之后提到的onConfigurationChanged事件中 只能捕获竖屏变横屏的事件 不能捕获横屏变竖屏
2. 在对应的Activity中重写:onConfigurationChanged 方法:
public class MainActivity extends Activity {
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i("--Main--", "onCreate");
textView=(TextView)findViewById(R.id.tv_id);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i("--Main--", "onConfigurationChanged");
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
textView.setText("当前屏幕为横屏");
}else{
textView.setText("当前屏幕为竖屏");
}
}
}
22.Http中get和post的区别?
1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。
23.ViewPager如何实现?
答:a.Viewpager是一个控件,用的时候直接在布局中定义引用(Android.support.v4.view.ViewPager)即可。 b.ViewPager里面显示的是多个View,用LayoutInflater的对象调用inFlater()方法定义布局,并把View对象添加到List<View>集合中。
c.定义适配器继承PagerAdapter,设置给ViewPager。
24.请说出使用equal和==比较对象时的区别?
答:“==”比较的是2个对象的地址,而equals比较的是2个对象的内容。例如两个String类型的对象:String s1 = new String(“str”);
String s2 = new String(“str”);
用“==”比较的时候返回的是false,因为创建了两个对象,在内存中的地址不一样,用equals则返回true。
异步加载图片基本思想:
1.先从内存缓存中获取图片显示(内存缓冲)
2.获取不到的话从SD卡里获取(SD卡缓冲)
3.都获取不到的话从网络下载图片并保存到SD卡同时加入内存并显示(视情况看是否要显示)
26.Context里面主要包括什么具体的东西?
答:Context提供了关于应用环境全局信息的接口。它是一个抽象类,它的执行被Android系统所提供。它允许获取以应用为特征的资源和类型。同时启动应用级的操作,如启动Activity,broadcasting和接收intents。
27. 两个Activity之间怎么传递数据?
基本数据类型可以通过. Intent 传递数据
extras.putDouble(key, value)
intent.putExtra(name, value)
// 通过intent putExtra 方法 基本数据类型 都传递
intent.getStringExtra("key","value");
intent.getBooleanExtra("key","value")
Bundle bundle = new Bundle();
bumdle.putShort(key, value);
intent.putExtras(bumdle);
intent.putExtras(bundle)
Application 全局里面存放 对象 ,自己去实现自己的application的这个类,基础系统的application , 每个activity都可以取到
让对象实现 implements Serializable 接口把对象存放到文件上.
让类实现Serializable 接口,然后可以通过 ObjectOutputStream //对象输出流
File file = new File("c:\1.obj");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Student stu = new Student();
oos.writeObject(stu);
//从文件中把对象读出来
ObjectInputStream ois = new ObjectInputStream(arg0);
Student stu1 = (Student) ois.readObject();
文件/网络
intent.setData(Uri)
Uri.fromFile(); //大图片的传递
28,谈谈对Intent的理解?
答:实现页面(Activity)跳转,作为四大组件中起“枢纽”作用的对象
Intent中文意思“意图”,在四大组件中,服务和广播接收是通过Intents(消息,意图)来激活的。
Intent分为两种:显式Intent和隐式Intent区别
29.显式Intent和隐式Intent区别?
答:Intent是一种在不同组件之间传递的请求消息,是应用程序发出的请求和意图。
对于明确指出了目标组件名称的Intent,我们称之为显式Intent。
对于没有明确指出目标组件名称的Intent,则称之为隐式Intent。
Android系统使用IntentFilter 来寻找与隐式Intent相关的对象。
显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。
隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。
30,谈谈Service的生命周期?
答:Service的生命周期由使用Service两种方式决定,启动方式不同生命周期不同。
Start方式启动Service的生命周期:
onCreate()—onStartCommond()—onDestroy()
调用者和服务之间没有任何的联系,即使调用者退出,那么服务也仍然进行。
Bind方式启动Service的生命周期:onCreate()->onBind()->-->onUnbind() -> onDestroy()
调用者和服务绑定在一起,调用者退出,服务即便退出。
31,谈谈对Service的理解?
答:服务是一个应用程序组件,可以在后台执行长时间运行的操作,不提供用户界面。
一项服务“开始”,当一个应用程序组件(如一个活动)开始通过调用的StartService()
“绑定”一个服务,当一个应用程序组件绑定它通过调用bindService()
32,启动服务有几种方式?他们之间的区别是什么?
答:启动服务有两种方式。
一种是通过context.startService() 来启动Service
其生命周期为context.startService() ->onCreate()- >onStart()->Service running-->context.stopService()->onDestroy() ->Service stop
调用者和服务之间没有任何的联系,即使调用者退出,那么服务也仍然进行。
另外一种是通过使用bindService()启动Service
其生命周期为:context.bindService()->onCreate()->onBind()->Service running-->onUnbind() -> onDestroy() ->Service stop
调用者和服务绑定在一起,调用者退出,服务即便退出。
33,Intent 能传递什么数据类型?
a.简单或者基本数据类型
b.传递一个Bundle
c.传递Serializable对象
d.Parcelable对象
e.Intent
34,SharedPreferences能存储什么数据类型?
Shared Preferences:用来存储"key-value"paires格式的数据,它是一个
轻量级的键值存储机制,只可以存储基本的数据类型。如 String 、int 、
boolean 、float 、double、long 、byte、short
35,Android中五种数据存储方式分别是什么?他们的特点?
答:Android提供了五种存取数据的方式
(1) SharedPreference,存放较少的五种类型的数据,只能在同一个包内使
用,生成XML的格式存放在设备中
(2) SQLite数据库,存放各种数据,是一个轻量级的嵌入式数据库
(3) File文件,通过读取写入方式生成文件存放数据
(4) ContentProvider,主要用于让其他应用程序使用保存的数据
(5)通过网络获取数据和写入数据到网络存储空间
36,简述SharedPreferences存储方式
SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能读取数据而不支持写入数据,存储修改是通过Editor对象实现。
37,SQLite主要通过那两个类实现其功能的?
SQLiteOpenHelper:这个类是数据库的帮助类;用来进行数据库的创建;表的创建,以及版本的更新
SQLiteDatabase: 这个类里 封装了对表的具体的操作的方法,比如 增删改查的方法。
39,SharedPreferences与SQLite数据库的区别
SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。
18:简述Timer的用法
Timer是在一个应用运行期间进行的定时操作,当应用退出则定时操作也同时被取消。
使用Timer的步骤:
1:实例化Timer timer = new Timer();
2:实例化TimerTask t = new TimerTask(){
@Override
public void run() {
// TODO Auto-generated method stub
要执行的内容
}};
3: 调用:timer.schedule(t, 5000);执行
39,ListView的优化方案?
答:
1、判断contentView是否为空:如果自定义适配器,那么在getView方法中要考虑方法传进来的参数contentView是否为null,如果为null就创建contentView并返回,如果不为null则直接使用。在这个方法中尽可能少创建view。
2、使用viewHolder缓存数据:给contentView设置tag(setTag()),传入一个viewHolder对象,用于缓存要显示的数据,可以达到图像数据异步加载的效果。
3、分页加载:如果listview需要显示的item很多,就要考虑分页加载。比如一共要显示100条或者更多的时候,我们可以考虑先加载20条,等用户拉到列表底部的时候再去加载接下来的20条。分页加载还没学习。
40,MVC设计模式在Android中的应用?
答:
1.模型层(model):对数据库操作,对网络等操作都应在model中处理,对业务的计算等操作都应在该层。可以简单的理解为Android中的Java源文件
2.视图层(view):一般采用XML进行描述,使用的时候可以方便的引入,可以简单的理解为Android中Layout文件。 Android中也可以用JavaScript+HTML 等方式作为view 层。
3.控制层(controller):控制model和view的协调工作。简单的理解为Android中manifest文件.