android基础知识三

1.listview失去焦点怎么处理
在listview子布局里面写,可以解决焦点失去的问题
android:descendantFocusability="blocksDescendants"
2.什么是匿名内部类,在什么时候调用
内部类:内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用。
匿名内部类:它只能使用一次,不区分static和非static。如果用到外部类的变量的话,必须是类变量或者实例变量,就是必须是类定义的变量,或者final的局部变量。匿名内部类如果是继承某个类的话是可以重写那个类的方法的,这个和普通内部类一样。
实现事件监听器的时候
用匿名内部类编码非常简洁,也容易读懂,不重复利用时使用。
3.android中asset和raw的区别;
*res/raw和assets的相同点:
1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

*res/raw和assets的不同点:
1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
*读取文件资源:
1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
InputStream is = getResources().openRawResource(R.id.filename);
//通过 资源 id 直接打开 raw 下的 流文件

2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename");
// 通过 AssectManager 管理器 来打开 assect 下的流文件
4.什么是线程
线程,有时被称为 轻量级进程 (Lightweight Process,LWP),是程序执行流的最小 单元 。一个标准的线程由线程 ID ,当前指令指针(PC), 寄存器 集合和 堆栈 组成。另外,线程是 进程 中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有 系统 资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以 创建 撤消 另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有 就绪 阻塞 运行 三种基本状态。每一个程序都至少有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为 多线程
5.线程和进程的区别
// 线程与进程的区别:
定义:
  1. 进程是系统进行资源分配和调度的一个独立单位
  2. 线程是进程的一个实体,是CPU调度和分派的基本单位,线程自己基本上不拥有系统资源,只拥有一点在系统运行中必不可少的资源,但是它可与同属一个进程的其他线程共享进程所拥有的全部资源
关系:
  1. 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程可以同时并发执行,他可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行顺序
区别:
进程和线程区别: 他们是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,不会对其他进程产生影响
线程只是一个进程中不同的执行路径,线程有自己的堆栈和局部变量,线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉, 所以多线程的操作要比多进程的程序健壮。 但在进程切换时耗费资源较大,效率要差一些
对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程,(因为进程在切换时耗费的资源要大一些,效率差一些)
进程是表示资源分配的基本单位,又是调度运行的基本单位。
线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。
线程的优点:
(1)易于调度。
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(3)开销少。创建线程比创建进程要快,所需开销很少。。
(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
进程和线程的关系:
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(3)处理机分给线程,即真正在处理机上运行的是线程。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
6.接口和抽象类的区别
abstract可以修饰抽象方法,而一个类只要有一个抽象方法,就必须用
abstract定义该类,即抽象类。
用interface修饰的类,里面的方法都是抽象方法,因此在定义接口的时候,可以
直接不加那些修饰,系统会默认的添上去。接口里面的字段都是公有常量,即
public static final修饰的字段。
//接口是多继承 、抽象类是单继承
//接口里面只有抽象方法
// 抽象类: 有抽象方法和普通方法 、 抽象类==父类( 抽象类是 顶级父类 )
// 比较两个对象是否相等 == 比较的是地址、 = 比较的是值
//final不能和 static 、actaret 一起使用
7.xml有几种解析方式、区别
基本的解析方式有三种: DOM,SAX,Pull
dom解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后就可以使用 DOM 接口来操作这个树结构。优点是对文档增删改查比较方便,缺点占用内存比较大。
sax解析:基于事件驱动型,优点占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改,不能中途停止。
pull解析:同样基于事件驱动型,android 官方API提供,可随时终止,调用next() 方法提取它们(主动提取事件)
8.webview的辅助类
WebSettings、WebViewClient、WebChromeClient
WebSettings
设置WebView的一些属性、状态等,例如允许使用javascript,允许使用缓存,允许使用内置的缩放组件
setJavaScriptEnabled(true); 设置支持js
WebViewClient
主要帮助WebView处理各种通知、请求事件(例如,点击链接时候如何显示界面,页面开始加载,加载完毕之后有何动作等)
shouldOverrideUrlLoading() onPageStarted() onPageFinished()
WebChromeClient
辅助WebView处理Javascript的对话框、网站图标、网站Title、加载进度等
核心方法有onJsAlert() onJsConfirm() onJsPrompt() onProgressChanged() onReceivedIcon()
onReceivedTitle()
9.webview加载网页的两种方式
loadUrl(url) 通过url地址加载互联网或本地网页
如:loadUrl("http://www.baidu.com"); // 互联网地址
loadUrl("file://android_asset/html/index.html"); //本地网页
loadData(data,type,encoding) 直接加载网页内容,容易乱码,一般用 loadDataWithBaseURL 代替
10.Intent可以被传递的数据类型
intent是连接Activity, Service, BroadcastReceiver, ContentProvider四大组件的信使,,可以传递八种基本数据类型以及string, Bundle类型,以及实现了Serializable(java)或者Parcelable(安卓)的类型。
Intent可以划分成显式意图和隐式意图。
显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
11.拦截短信 短信其实是一个有序广播
1:创建一个继承BroadcastReceiver类的广播接收器。
2:在清单文件中注册广播并在<intent-filter>中设置优先级 priority(只要比你想拦截程序的短信接收器优先级高就可以了)
3:在onReceiver()中调用abortBroadcast()就可以了
12.Throws与Throw的区别
1.throw则是指抛出的一个具体的异常类型。
2.通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
3.throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛出。
如果在方法中会有异常被抛出而你又不希望在这个方法体内对此异常进行处理,可以使用throws在声明方法的时候同时声明他可能会跑出的异常。
4.两者位置不同.
13.Service是如何启动
1通过startService
Service会经历onCreate->onStart
stopService的时候直接onDestroy

  如果是调用者(TestServiceHolder)自己直接退出而没有调用stopService的
  话,Service会一直在后台运行。
  下次TestServiceHolder再起来可以stopService。


2通过bindService
Service只会运行onCreate,这个时候TestServiceHolder和TestService绑定在一起

TestServiceHolder退出了,Srevice就会调用onUnbind->onDestroyed
  所谓绑定在一起就共存亡了。
14.android虚拟机的进程和linux的关系
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念。
15.程序运行的权限和文件系统权限的区别
运行时权限 Dalvik( android 授权) 文件系统 linux 内核授权
16.访问网络如何加密
1:对称加密(DES,AES)和非对称(RSA公钥与私钥)。
(支付宝里的商户的公钥和私钥)
2:MD5(算法)
3:Base64
17.访问网络都有哪两种方式
get与post是两种不同的提交方式
get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
get安全性非常低,post安全性较高。
HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。
18.一键退出的实现
定义一个类继承Application,定义一个集合存放所有的activity,定义一个添
加的方法,再写一个退出的方法,使用for循环全部调用finish方法,然后在每个
Activity的onCreate方法中调用自定义类里的添加方法,然后在需要使用一键退出
的地方调用类中的退出方法即可。
19.gc是什么
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。
20.listview的分页加载
ListView分页加载通常有两种实现方式:一种是ListView底部设置一个按钮,用户点击即加载;另一种是当用户滑动到底部时自动加载。
在此说一下第一种方式点击底部按钮即加载的实现思路:

通过addFooterView()方法为listview底部加入一个“加载更多”按钮和加载进度的视图,默认按钮显示,加载进度为gone。当用户点击“加载更多”按钮时,按钮设置为gone,加载进度显示,并开启子线程从网络上加载下一页数据,加载完毕,发消息给handler,再handler的handleMessage()方法中通过adapter的notifyDataSetChanged方法通知listview刷新,显示刚加入的数据,并恢复按钮显示,加载进度隐藏。

21、说说java的反射机制原理以及应用场合
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有
属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态
获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
类对象: 封装了类的描述信息的对象,类加载的产物,由jvm创建java.lang.Class
应用场景: Gson 序列化反序列化
获取类对象的方式:1. 类名.class2. 类的对象.getClass()3. Class.forName("
包名.类名")
22、contentprovider怎么实现数据共享
一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。
要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。
如何通过一套标准及统一的接口获取其他应用程序暴露的数据?
Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
23、java有几种引用类型
强引用,软引用、弱引用、幽灵引用、
24、如何让Activity变成一个窗口?
答:在清单文件AndroidManifest.xml中相应的<activity>标签内设置属性
android :theme="@android:style/Theme.Dialog"
25,启动一个线程时run()还是start()
start()
26,ArrayList的便利
ArrayList<String> al=new ArrayList<String>();
for(int i=0;i<10;i++){
al.add(String.valueOf(i));
}
Iterator<String> it=al.iterator();
while(it.hasNext()){
System.out.println(it.next());
}

猜你喜欢

转载自blog.csdn.net/unfinished_story/article/details/80159379