付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1.技术面试题 A1.1.基本面试题1.1.1.ListView 如何优化?如何防止 OOM?a.b.c.使用convertView 和ViewHolder,使得控件的绑定只需要运行一次,没用的Item 及时内存。如果自定义Item 中有在ater 中不要使用s,使用弱,Bitmap 对象要及时的话,要对进行处理。例如:压缩。ic 来修饰资源消耗过大的变量(例如 Context)。因为,s ic 是Java 中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。d.尽量避免在ListView 适配器中使用线程,因为线程产生内存的主要原因在于线程生命周期的不可控制。1.
2、1.2.的两种机制,广播发送的两种机制?广播a. 实现广播的方法有两种。一种是在 androidmanifest.xml 当中去广播,另法是在代码中动态广播,这两种方法虽然都能实 现广播机制,但是还是有很大不同,所以运用也要分情况。1)静态:如果在 androidmanifest xml 中去定义的话,那么该广播是在 activity 结束之后也不会结束的,原因在于它已经写在了manifest.xml 文件当中,也就是播没有影响。到了系统当中,所以无论你的 activity 是否存在,对于该 广2)动态:而在 java 代码中动态。广播,在该 activity 结束后,可以注销该广播,也就是它
3、随着 activity的而这样解 释,大家都应该清楚了。如果是一些系统应用,比如没电后啊,计算流量啊这样的功能,需要一直存在的,可以在 androidmanifest xml 中,而一些只有该 activity 存在时才有意义的广播,比如更改界面比较合 适,activity 都没了。该广播还等等,就用动态用呢?只会浪费资源而已。b. 安卓中广播的机制有:1)普通广播 sendBroadcast():按照的先后顺序发送至每一个已经(订阅)的广播,无法被终止,当然,先接收到广播的receiver 可以修改广播数据。 典型代表:开机启动广播。2)有序广播 sendOrderedBroadcast()
4、:按照被接收者的优先级顺序,在被接收者中一次。比三个广播接收者A,B,C,优先级是A B C。那这个消息先传给A,再传给B,最后传给C。每个接收者中终止广播,比如B 终止广播,C 就无法接收到。此外A 接收到广播后可以对结果对象进行操作,当广播传给B 时,B 可以从结果对象中取得A 存入的数据。如系统收到发出的广播就是有序广播。3)粘性广播 sendStickyBroadcast():使用这个 api 需限android.Manifest.permis.BROADCAST_STICKY,粘性广播的特点是ent 会一直保留到广播事件结束,而这种广播也没有所谓的 10 秒限制,(10 秒限制是指普
5、通的广播如果onReceive 方法执行时间太长,超过 10 秒的时候系统会将这个广播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行。)1.1.3.Fragment 的生命周期和 Activity 的生命周期的关系?fragment 的生命周期与管理activity 的生命周期极其相似。你所需要去思考的是 activity 的生命周期如何影响fragment的生命周期。Activity 直接影响它所包含的fragment 的生命周期,所以对 activity 的某个生命周期方法的调用也会产生对fragment相同方法的调用。例如:当activity 的o
6、nPause()方法被调用时,它所包含的所有的 fragment 们的onPause()方法都会被调用。Fragment 比activity 还要多出几个生命周期回调方法,这些额外的方法是为了与activity 的交互而设立,如下:onAttach(),当fragment 被加入到activity 时调用(在这个方法中可以获得所在的activity)。onCreateView(),当activity 要得到fragment 的layout 时,调用此方法,fragment 在其中创建自己的layout(界面)。 onActivityCreated(),当activity 的onCreated(
7、)方法返回后调用此方法。onDestroyView(),当 fragment 的layout 被销毁时被调用。onDetach(),当fragment 被从activity 中删掉时被调用。一旦activity 进入resumed 状态(也就是 running 状态),你就可以地添加和删除fragment 了。因此,只有当 activity在resumed 状态时,fragment 的生命周期才能独立的运转,其它时候是依赖于activity 的生命周期变化的。1.1.4. HashMap 和 HashTable 的区别?a.Hashtable 是支持多线程同步的,也就是说,是多线程安全的。 H
8、ashMap 则不是多线程安全的,要想做到多线程安全,需要程序员自己做同步。查看 Hashtable 的源代码就可以发现,除构造函数外,Hashtable 的所有public 方法中都有 synchronized 关键字,而 HashMap 的源代码中则连 synchronized 的都没有。(他们的区别类似于 Vector 与ArrayList,StringBuffer 与StringBuilder)。b.Hashtable 不允许 null 值(key 和 value 都不可以),HashMap 允许 null 值(key 和value 都可以)。1.1.5. 你的 APP 如何与网络交互
9、?Android有三种网络接口可以使用,他们分别是:.*(标准Java 接口).apache 接口和android net.*(Android网络接口)。下面分别介绍这些接口的功能和作用。a. 标准Java 接口java net.*提供与联网有关的类,包括流、数据包套接字(socket)、 ernet 协议、常见 Http 处理等。比如:创建 URL,以及 URLConnection/HttpURLConnection 对象、设置参数、到服务器、向服务器写数据、从服务器数据等通信。这些在Java 网络编程中均有涉及,Apache 接口看一个简单的socket 编程,实现服务器回发客户端信息。对
10、于大部分应用程序而言 JDK 本身提供的网络功能已远远不够,这时就需要 Android 提供的 Apache HttpC nt 了。它是一个开源项目,功能更加完善,为客户端的Http 编程提供高效、功能丰富的工具包支持。android net 接口常常使用此包下的类进行Android 特有的网络编程,如:WiFi,Android 联网信息,邮件等功能。1.1.6. Activity 生命周期,在按 Back 键和 Home 键时候,生命周期的变化。HOME 键的执行顺序:onPause-onStopBACK 键的顺序: onPause-onStop-onDestroyActivity 生命周期
11、详解:1. void onCreate(Bundle savedInstane)当 Activity 被第首次加载时执行。新启动一个程序的时候其主窗体的 onCreate 事件就会被执行。如果 Activity 被销毁后(onDestroy 后),再重新加载进 Task 时,其onCreate 事件也会被重新执行。注意这里的参数 savedInstane(Bundle 类型是一个键值对集合,大家可以看成是.Net 中的Dictionary)是一个很有用的设计,由于 前面已经说到机应用的特殊性,一个 Activity很可能被强制交换到交换到就是指该窗体不再对用户可见,但实际上又还是存在于某个 T
12、ask 中的,比如一个新的Activity压入了当前的Task 从而“遮盖”住了当前的 Activity,或者用户按了 Home 键回到桌面,又或者其他重要事件发生导致新的 Activity出现在当前 Activity 之上,比如来电界面), 而如果此后用户在一段时间内没有重新查看该窗体(Android 通过长按 Home 键可以选择最近运行的 6 个程序,或者用户直接再次点击程序的运行图标,如 果窗体所在的Task 和进程没有被系统销毁,则不用重新加载Pros, Task 和Task 中的Activity,直接重新显示Task 顶部的Activity,这就称之为重新查看某个程序的窗体),该窗
13、体连同其所在的 Task 和 Pros 则可能已经被系统自动销毁了,此时如果再次查看该窗体,则要重新执行 onCreate 事件初始化窗体。而这个时候可能希望用户继续上次打开该窗体时的操作状态进行操作,而不从头开始。例如用户在编辑时突然来 电,接完后用户又去做了一些其他的事情,比如保存来电号码到联系人,而没有立即回到编辑界面,导致了编辑界面被销毁, 当用户重新进入程序 时他可能希望继续上次的编辑。 这种情况就可以覆写 Activity 的 voidonSaveInstane(Bundle outS e)事件,通过向 outS e 中写入一些需要在窗体销毁前保存的状态或信息,这样在窗体重新执行o
14、nCreate 的时候,则会通过 savedInstane 将之前保存的信息传递进来,此时就可以有选择的利用这些信息来初始化窗体,而不从头开始。2. void onStart()onCreate 事件之后执行。或者当前窗体被交换到后,在用户重新查看窗体前已经过去了一段时间,窗体已经执行了 onStop 事件,但是窗 体和其所在进程并没有被销毁,用户再次重新查看窗体时会执行 onRestart 事件,之后会跳过 onCreate 事件,直接执行窗体的onStart 事 件。3. void onResume()onStart 事件之后执行。或者当前窗体被交换到后,在用户重新查看窗体时,窗体还没有被
15、销毁,也没有执行过 onStop 事件(窗体还继续存在于Task 中),则会跳过窗体的 onCreate 和onStart 事件,直接执行onResume 事件。4. void onPause()窗体被交换到时执行。5. void onStop()onPause 事件之后执行。如果一段时间内用户还没有重新查看该窗体,则该窗体的 onStop 事件将会被执行;或者用户直接按了 Back键,将该窗体从当前Task 中移除,也会执行该窗体的onStop 事件。6. void onRestart()onStop 事件执行后,如果窗体和其所在的进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的
16、 onRestart 事件,onRestart 事件后会跳过窗体的onCreate 事件直接执行onStart 事件。7. void onDestroy()Activity 被销毁的时候执行。在窗体的 onStop 事件之后,如果没有再次查看该窗体,Activity 则会被销毁。最后用一个实际的例子来说明 Activity 的各个生命周期。假设有一个程序由 2 个Activity A 和B 组成,A 是这个程序的启动界面。当用户启动程序时,Pros 和默认的Task 分别被创建,接着A 被压入到当前的Task 中,依次执行了 onCreate, onStart, onResume事件被呈现给了
17、用户;此时用户选择 A 中的某个功能开启界面 B,界面 B 被压入当前 Task 遮盖住了 A,A 的 onPause 事件执行,B 的 onCreate, onStart, onResume 事件执行,呈现了界面 B 给用户;用户在界面 B 操作完成后,使用 Back 键回到界面A,界面B不再可见,界面B 的onPause, onStop, onDestroy 执行,A 的onResume 事件被执行,呈现界面 A 给用户。此时突然来电,界面 A的onPause 事件被执行,接听界面被呈现给用 户,用户接听完后,又按了 Home 键回到桌面,打开另一个程序“联系人”,添加了联系人信息又做了一
18、些其他的操作,此时界面 A 不再可见,其 onStop 事件被执行,但并没有被销毁。此后用户重新从菜单中点击了的程序,由于 A 和其所在的进程和 Task 并没有被销毁,A 的 onRestart 和 onStart 事件被执行,接着 A 的 onResume事件被执行,A 又被呈现给了用户。用户这次使用完后,按 Back 键返回到桌面,A 的 onPause, onStop 被执行,随后 A 的onDestroy被执行,由于当前Task 中已经没有任何Activity,A 所在的Pros 的重要程度被降到很 低,很快A 所在的Pros 被系统结束1.1.7. 如何json,有没有看过 Jso
19、nObject 的源码。常用的json 框架:安卓自带的 JsonObject,谷歌的 Gson,阿里巴巴的 FastJson,还有Jackson(SpringMVC 中自带的Json器)。1.1.8. 如何使 apk 开机自启?android 开机事件会发送一个叫做 Android. ePLETED 的广播信息,程序会在接收到这个监听的时候开启应用。但是由于加载sd 卡的事件发生在该广播后,故而 apk 需要安装在sd 卡中。1.1.9.如何实现异步加载?采用多线程和线程池1.1.10.ent 可以加入什么数据?是否能放入 Bitmap?Android 中ent 传递类对象提供了两种方式一种
20、是 通过实现Serializable 接口传递对象,一种是通过实现 Parcelable接口传递对象。采用bundle 传递bitmap1.2.PL 面试题1.2.1.网络传输中如何处理 https?准备知识:Keytool 工具的使用。在用 Android上使用 SSL,第一步就是生成。1、的生成生成服务器端的pykeytool -genkey -alias test -keystore test.jks将keystore 中的 cert 导出来,用来生成客户端的验证htmlkeytool -exportcert -alias test -file test.cert -keystore t
21、est.jks生成 Android的因为 Android 要求要 BC,而 Java 的 keytool 本身不提供 BKS 格式,因此要自己手动配置。个人在配置的过程到了文件正在使用中,保存失败的情况,做法是将文件备份一下,用 unlocker 删除后将修改好备份放到原位置就好了。1.3.1bcprov-ext-jdk15on-146.jar到官网本地 jdk 对应的 jar,到 C:Program FilesJavajdk1.6.0_43jrelibext1.3.2 配置bcprov在 jdk_homejrelibsecurity目录中找到 java.security 在内容增加一行(数字
22、可以自己定义)htmlvider.11=.vider.BouncyCastleProvider1.3.3 生成android的htmlkeytool -importcert -keystore test.bks -file test.cert -storetype BKS -provider.vider.BouncyCastleProvider一、SSL?SSL(Secure Sockets Layer接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。SSL/T
23、LS 协议位于 HTTP 协议与传输层协议之间,采用公钥技术,为两个应用间的通讯提供加密、完整性校验以及认证。SSL 协议提供了三个功能:使用公钥对双端进行认证(一般仅进行服务器认证,客户端认证为可选)通信加密(Condentiality)数据完整性检查(Dataegrity)二、SSL 握手SSL 会话以称之为 SSL 握手的一系列消息交换开始,在握手过程中服务器通过公钥技术向客户端认证自身(可选,客户端向服务器认证自身),客户端和服务器协商加密消息的对称密钥,SSL 会话握手后的消息都使用对称密钥加密后传输,对称密钥还用于消息完整性检查。Cnt-Server CntoCnt 向 Serve
24、r 发送一个“Cnto”消息,说明它支持的算法列表、压缩方法及最高协议版本,以及稍后将被使用的随机数Ver: 客户端支持 TLS 协议最高版本号(最高 3.3)RandomNumber:客户端产生的 28byte 随机数,后续用作加密。CipherSuites 客户端支持的加密算法和密钥大小列表CompresMethods 客户可支持的压缩算法Server-Cnt Servero服务器向客户端发送“Servero”消息,包含服务器选择的算法、压缩方法、协议版本以及服务器产生的随机数。Ver: 选择的 TLS 版本号Randomber:服务器产生的 28 字节随机数,后续用作加密CipherSu
25、ite: 选择的加密算法和密钥大小。CompresMethod: 选择的数据压缩算法Server-CntServer 向Cnt 发送自身的链,链从服务器的公钥(public-keycerticate)开始一直到 CA 的根(certicateauthoritys root certicate).客户端需要对 server 的链进行验证,如果验证不通过,则终止连接。若验证通过,则可从 server 的公钥中获取到server 的公钥。验证流程见后续介绍。Server-CntRequestnt,则发送此消息请求 Cnt 的公钥如果 Server 需要认证C,此消息为可选。消息中包含Types: S
26、erver 可接收的类型列表DistinguishedNames: Server 可接收的 CA DN 列表。Server-Cnt ServeroDoneServer 发送此消息通知Cnt 已完成了初始化协商消息。Cnt-Server如果 Server 请求了 Cnt 的,即存在消息 4,则 cnt 将自身的链给 Server。Server 要对 Cnt 的证书链进行验证,如果验证不通过,则终止连接,如果验证通过则可从Cnt 的公钥中获取到Cnt 的公钥。验证流程见后续介绍.Cnt-Server CntKeyExchangeCnt 向 Server 发送premaster secret,并且用
27、 Server 的公钥加密。premaster secret 用于双方计算出对后续消息加密的对称密钥. 使用Server 的公钥加密的目的是确认 Server 具有消息 3 中所生成公钥的私钥,避免发送给的服务器。Cnt-ServerVerify如果Server 请求了 Cnt 的,则还需要发送Verify 消息,Cnt 将到现在为止发送和接收到的握手消息,使用Cnt 的私钥进行签名发送给 Server,用于向 Server 证明其有消息 6 中声称Cnt 公钥的私钥数据。Server 可使用消息 6 中获得的Cnt 公钥对消息进行验证。Cnt-Server ChangeCipherSpecC
28、nt 使用客户端随机数,服务器随机数以及premaster secret 产生加密消息的对称密钥 Master Secret。然后发送此消息告知 Server 后续消息将使用对称密钥加密Cnt-Server FinishedCnt 向 Server 发送此消息通知对端协商成功,此消息使用协商的公钥密钥加密。Server-Cnt ChangeCipherSpecServer 使用客户端随机数,服务器随机数以及premaster secret 产生加密消息的对称密钥 Master Secret。然后发送此消息告知Cnt 后续消息将使用对称密钥加密.Server-Cnt FinishedServer
29、 向Cnt 发送此消息通知对端协商成功,此消息使用协商的公钥密钥加密。三、SSL 通信模式:1.服务端:SSL 服务端需要通过 SSL 服务套接字来提供服务接口,而 SSL 服务套接字需要通过 SSL 上下文实例来创建。以下是对 SSL 服务端的启用过程的描述。(1)通过指定协议(一般是 TLS)获取 SSL 上下文(SSLContext)实例。(2)通过指定算法(X.509 相关)获取密钥管理器工厂(KeyManagerFactory)实例。(3)通过指定类型和提供者获取密钥库(KeyStore)实例。(4)密钥库实例使用约定的加载(Load)密钥库文件(.keystore)。(5)密钥管理
30、器工厂实例使用约定的和(4)中密钥库进行初始化(Initialize)。(6)SSL 上下文实例通过密钥管理器工厂实例提供的密钥管理器来初始化(Initialize)。(7)当 SSL 上下文实力初始化成功后,就可以获取该上下文所关联的服务套接字工厂(ServerSocketFactory)实例(8)服务套接字工厂实例依据指定的服务端口来创建(Create)服务套接字(ServerSocket)。(9)当 SSL 服务套接字创建成功,就可以等待客户端的连接,与客户端进行通信。(10)通信完毕可以关闭服务套接字。2.客户端(1)通过指定协议(一般是 TLS)获取 SSL 上下文(SSLConte
31、xt)实例。(2)通过指定算法(X.509 相关)获取密钥管理器工厂(KeyManagerFactory)实例。(3)通过指定算法(X.509 相关)获取信任管理器工厂(TrustManagerFactory)实例。(4)通过指定类型和提供者获取密钥库(KeyStore)实例。(5)通过指定类型和提供者获取信任密钥库(KeyStore)实例。(6)(4)中密钥库实例使用约定的加载(Load)密钥库文件(.keystore)。(7)(5)中信任密钥库实例使用约定的加载(Load)密钥库文件(.keystore)。(8)密钥管理器工厂实例使用约定的和(4)中密钥库进行初始化(Initialize)
32、。(9)信任密钥管理器工厂实例使用约定的和(5)中密钥库进行初始化(Initialize)。(10)当 SSL 上下文实力初始化成功后,就可以获取该上下文实例所关联的套接字工厂(SocketFactory)实例(11)套接字工厂实例依据指定的主机和端口来创建(Create)客户端套接字(Socket)。(12)当 SSL 服务套接字创建成功,就可以向服务端发送请求,与服务端进行通信。(13)通信完毕可以关闭服务套接字。服务端代码:javaimportjava.io.BufferedInputStream;importjava.io.FileNotFoundException;importjav
33、a.io.IOException;importjava.io.InputStream;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;import.ServerSocket;import.Socket;import.SocketAddress;importjava.security.KeyManagementException;importjava.security.KeyStore;importjava.security.KeyStoreException;importjava.security.NoSuchA
34、lgorithmException;import java.security.UnrecoverableKeyException;import java.security.cert.Exception;import .ServerSocketFactory;import .ssl.KeyManager;import .ssl.KeyManagerFactory;import .ssl.SSLContext;/*authord*TODOjava 线程开发之四 SSL 加密*开发步骤1.生成服务端密钥*2.导出服务端*3.生成客户端密钥*4.程序开发测试*关于的生成请参考 readme.txt*参
35、考资料:http/blog/1018778*ver1.0*date 2013-5-7 23:22:45*update 2013-5-8 10:22:45blgos/draem0507*/public class Server private ServerSocket serverSocket;private final sic char password=1qaz2wsx.toCharArray();private SSLContext context;private InputStream inputStream;public Server() inputStream=this.getCla
36、ss().getResourceAsStream(/test.jks);initContext();try /直接运行会报 .ssl.SSLException:/ServerSocketFactory factory=SSLServerSocketFactory.getDefault();ServerSocketFactory factory=context.getServerSocketFactory();/serverSocket = new ServerSocket(10000);serverSocket=factory.createServerSocket(10000);System.
37、out.prln(=启动安全 SocektServer 成功=);while (true) Socket socket = serverSocket.accept();new ReceiveSocket(socket).start(); catch (IOException e) e.prStackTrace();/ssl 上下文对象的初始化private void initContext() try KeyStore store=KeyStore.getInstance(JKS);store.load(inputStream, password);KeyManagerFactory fact
38、ory=KeyManagerFactory.getInstance(SunX509);factory.init(store,password);KeyManager keyManagers=factory.getKeyManagers();context=SSLContext.getInstance(SSL);context.init(keyManagers, null, null); catch (KeyStoreException e) e.prStackTrace(); catch (NoSuchAlgorithmException e) e.prStackTrace(); catch
39、(Exception e) e.prStackTrace(); catch (FileNotFoundException e) e.prStackTrace(); catch (IOException e) e.prStackTrace(); catch (UnrecoverableKeyException e) e.prStackTrace(); catch (KeyManagementException e) e.prStackTrace();public sic void main(String args) new Server();private class ReceiveSocket
40、 extends Thread private Socket socket;public ReceiveSocket(Socket socket) this.socket = socket;private ObjectInputStream reader;private ObjectOutputStream writer;Overridepublic void run() try reader=new ObjectInputStream(new BufferedInputStream(socket.getInputStream();/writer=new ObjectOutputStream(
41、socket.getOutputStream();/ 开启无限循环消息/java.io.EOFExceptionObject obj=reader.readUTF();SocketAddress address = socket.getRemoteSocketAddress();System.out.prln(address.toString() + t + obj);/Object obj=reader.readObject();/if(obj!=null)/User user =(User)obj;/System.out.prln(id=+user.getPassword()+tname=
42、+user.getName();/while (true) catch (IOException e) e.prStackTrace(); finally if (null != reader) try reader.close(); catch (IOException e) e.prStackTrace();if (null != writer) try reader.close(); catch (IOException e) e.prStackTrace();try socket.close(); catch (IOException e) e.prStackTrace();Andro
43、id 客户端代码:javaprotected VoidnBackground(Void. params) Log.i(TAG, nBackground);try SSLContext context;KeyStore ts = KeyStore.getInstance(BKS);ts.load(getResour().openRawResource(R.raw.test),1qaz2wsx.toCharArray();TrustManagerFactory tmf = TrustManagerFactory.getInstance(X509);tmf.init(ts);TrustManager
44、 tm = tmf.getTrustManagers();context = SSLContext.getInstance(SSL);context.init(null, tm, null);SocketFactory factory = context.getSocketFactory();SSLSocket socket = (SSLSocket) factory.createSocket(49, 10000);ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream();out.writeUTF(UUID
45、.randomUUID().toString();out.flush();System.out.prln(=客户端发送成功=);socket.close(); catch (Exception ex) ex.prStackTrace();return null;四、HTTPSHTTPS 可以视为HTTP 的安全版本(Secure),其安全基础基于 SSL 协议(Secure Socket Layer,接字层)。HTTPS在 HTTP 的基础上添加了一个加密和验证。其默认端口是 443.对于一些对数据安全要求比较高的网络应用,比如网络支付,网上,都是采用HTTPS 通信机制,其规范:RFC281
46、8HTTPS URL 连接的方式HTTPS 服务器与 HTTP URLHTTP 服务器的方式基本相同。用到的类:HttpsURLConnection。代码例子(验证服务器):HttpsURLConnection 方式javapublic sic String getHttpsContent(Map paramsMap, String urlPath)tryFiksFile = new File(bks 文件路径);if(bksFile.exists()InputStream keyStoreInput = new FileInputStream(bksFile);String keyStore
47、Type = KeyStore.getDefaultType();KeyStore keyStore = KeyStore.getInstance(keyStoreType);keyStore.load(keyStoreInput, KEYSTORE_PASSWORD.toCharArray();/ Create a TrustManagert trusts the CAs in our KeyStoreString tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();TrustManagerFactory tmf = TrustM
48、anagerFactory.getInstance(tmfAlgorithm);tmf.init(keyStore);KeyManagerFactory kmf = KeyManagerFactory.getInstance(X509);kmf.init(keyStore, KEYSTORE_PASSWORD.toCharArray();/ Create an SSLContextt uses our TrustManagerSSLContext sslContext = SSLContext.getInstance(TLS);sslContext.init(kmf.getKeyManager
49、s(), tmf.getTrustManagers(), null);X509HostnameVerifier hostnameVerifier =SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);StringBuilder entityBuilder = new StringBuilder();if(paramsMap!=null & !paramsMap.isEmpty()for(Mntry entry : paramsMn
50、trySet()entityBuilder.append(entry.getKey().append(=);entityBuilder.append(URLEncoder.encode(entry.getValue(), HTTP.UTF_8);entityBuilder.append(&);entityBuilder.deleteCharAt(entityBuilder.length() - 1);byte entity = entityBuilder.toString().getBytes();/l the URLConnection to use a SocketFactory from
51、 our SSLContext/URL url = new URL();URL url = new URL(urlPath);HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();urlConnection.setSSLSocketFactory(sslContext.getSocketFactory();urlConnection.setConnectTimeout(5 * 1000);urlConnection.setRequestMethod(T);urlConnection.setDoO
52、utput(true);/允许输出数据urlConnection.setRequestProperty(Content-Type,application/x-www-form-urlencoded);urlConnection.setRequestProperty(Content-Length,String.valueOf(entity.length);OutputStream outStream = urlConnection.getOutputStream();outStream.write(entity);outStream.flush();outStream.close();Input
53、Stream in = urlConnection.getInputStream();StringBuffer sb = new StringBuffer();String line = null;char ch = u0000;temp = 0 ;while (temp = in.read() != -1) ch = (char) temp;sb.append(char) temp);String result = sb.toString();return result;return -1;catch(Exception e)e.prStackTrace();return -2;HttpCn
54、t 方式:javapublic sicsynchronized HttpCnt getHttpCnt(Context context) throws KeyStoreException,NoSuchAlgorithmException,Exception, IOException, KeyManagementException,UnrecoverableKeyExceptionif(null=httpCnt)AssetManager sm=context.getAssets();InputStream keyStroreInputStream=sm.open(ca_zx.bks);KeySto
55、rekeyStore=KeyStore.getInstance(KeyStore.getDefaultType();keyStore.load(keyStroreInputStream, KEYSTORE_PASSWORD.toCharArray();SSLSocketFactory sf=new MySSLSocketFactory(keyStore);sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);HttpParams params=new BasicHttpParams();HttpProtocol
56、Params.setVer(params, HttpVer.HTTP_1_1);HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);HttpProtocolParams.setUseExpectContinue(params, true);ConnManagarams.setTimeout(params, 10000);HttpConnectionParams.setConnectionTimeout(params, 15000);HttpConnectionParams.setSoTimeout(params, 20000);Sc
57、hemeRegistry schreg=new SchemeRegistry();schreg.register(new Scheme(http, PlainSocketFactory.getSocketFactory(), 80);schreg.register(new Scheme(https,sf , 443);CntConnectionManager conman=new ThreadSafeCntConnManagarams, schreg);httpCnt=new DefaultHttpCnt(conman, params);return httpCnt;private siccl
58、ass MySSLSocketFactory extends SSLSocketFactorySSLContext sslContext=SSLContext.getInstance(TLS);public MySSLSocketFactory(KeyStore truststore)throws NoSuchAlgorithmException, KeyManagementException,KeyStoreException, UnrecoverableKeyException super(truststore);TrustManager tm=new X509TrustManager()
59、 Overridepublic X509 getAcceptedIers() return null;Overridepublic void checkServerTrusted(X509 chain, String authType)throwsException 1.2.2.网络交互是否使用过 Webkit?1.2.3.如何动态加载 dex?为何谷歌不建议使用反射?前言在目前的软硬件环境下,Native App 与Web App 在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是 Web App 的优势。本文对网上Andr
60、oid 动态加载 jar 的资料进行梳理和实践在这里与大家一起 ,试图改善频繁升级这一弊病。欢迎,但请保留文章原始出处:)Overridepublic void checkCntTrusted(X509 chain, String authType) throwsException ;KeyManagerFactory kmf = KeyManagerFactory.getInstance(X509); kmf.init(truststore, KEYSTORE_PASSWORD.toCharArray();sslContext.init(kmf.getKeyManagers(), new T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026文化类热点面试题及答案
- 资源循环业务风机叶片热解科研产线落地服务建设项目环境影响报告表
- 二手挖机买卖合同范文(标准版)
- 阳江110千伏塘口输变电工程环境影响报告表
- 2025-2026学年河北省沧州市海兴县数学三年级第二学期期末质量跟踪监视模拟试题(含解析)
- 2025-2026学年河北省保定市顺平县数学四年级第二学期期末检测试题含答案解析
- 2025-2026学年江门市蓬江区四年级数学下学期期中综合测试试题含答案
- 西宁市城中区教育局招聘区聘教师笔试真题2025
- 宜宾市叙州区增量政策性岗位招募笔试真题2025
- 常德科技职业技术学院招聘笔试真题2025
- 装配整体式叠合剪力墙安装作业规程
- 2026年应急管理信息化应用培训考试试卷(含答案)
- 高中数学 加练 专题5 第50练 复 数
- 贵州省黔东南州2025-2026学年七年级下学期期末考试英语试卷(含答案)
- SYT 6649-2025《油气管道管体缺陷修复技术规范》
- 2026年秋季新教材统编版九年级上册道德与法治全册知识点背诵提纲精简版
- 2026年高考地理真题山东卷含答案
- 2026中国新材料技术在航空航天领域应用趋势及投资前景报告
- 高支模(盘扣式)监理实施细则
- 协会会员档案管理制度
- 连续性肾替代治疗抗菌药物剂量调整专家共识(2026年版)
评论
0/150
提交评论