android 面试题
下载地址
CSDN下载地址:
1.常用的存储方式有哪些?
(五种,说出哪五种,五种存储方式什么情况下用。)注意sharepreferes对象支持读取不支持写入,写入引用Editor。
SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。
除SQLite数据库外,另一种常用的数据存储方式,其本质就是一个xml文件,常用于存储较简单的参数设置。
即常说的文件(I/O)存储方法,常用语存储大数量的数据,但是缺点是更新数据将是一件困难的事情。
从网络读取数据和写入数据。 Android提供了通过网络来实现数据的存储和获取的方法。
我们可以调用WebService返回的数据或是解析HTTP协议实现网络数据交互。
4.除了handler和子线程,还有一个处理线程的是什么,主要方法是什么?
AsynTask,doInbackGround+onPostExecute
doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如访问网络。该方法必须重写。
onPostExecute(Result) 这个方法运行于UI主线程,在doInBackground(Params…)方法执行后调用,该方法用于接收后台任务执行后返回的结果,刷新UI显示
TCP---传输控制协议,提供的是面向连接、可靠的字节流服务,传输数据前经过“三次握手”建立连接,保证数据传输的可靠性,但效率比较低。一般用于对于数据传输安全性较高的场合。
UDP---用户数据报协议,是一个简单的面向数据报的运输层协议,面向无连接。UDP不提供可靠性,数据传输可能发生错序,丢包,但效率较高。一般用于对于实时性要求较高的场合。
(1). AsyncTask,其中doInBackground()和onPostExecute(Result)两个方法非常重要
doInBackground() 这个方法运行在后台线程中,主要负责执行那些很耗时的操作,如访问网络。该方法必须重写。
onPostExecute(Result) 这个方法运行于UI主线程,在doInBackground(Params…)方法执行后调用,该方法用于接收后台任务执行后返回的结果,刷新UI显示。
在子线程中执行完耗时操作需要刷新UI时,通过handler.sendMessage()发消息给主线程, 然后在主线程Handler中的handleMessage()方法中执行刷新UI操作
Activity有四种本质区别的状态: 1)在屏幕的前台(Activity栈顶),叫做活动状态或者运行状态(active or running)
存数据,ArrayList数组存储数据,索引值以下标来搜索,查询比较方,删除增加比较麻烦,但是linkedList以链表式存储数据,对于增删比较方便。
4)使用Bitmap及时调用recycle() // 把 重复循环的方法设置 为null,释放内存
前面的章节讲过,在不使用Bitmap对象时,需要调用recycle()释放内存,然后将它设置为null。虽然调用recycle()并不能保证立即释放占用的内存,但是可以加速Bitmap的内存的释放。
下面以构造ListView的BaseAdapter为例说明如何对Adapter进行优化。
弱引用与软引用的根本区别在于:只具有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候,通常不被回收。
MainActivity onCreate()
MyFragment onActivityCreated() 可以处理fragment数据的初始化
MainActivityonStart()
MyFragmentonStart()
MainActivityonResume()
MyFragment onResume()
按后退键
MyFragment onPause()
MainActivity onPause()
MyFragment onStop()
MainActivityonStop()
MyFragment onDestoryView()销毁掉自己的视图
MyFragment onDestory()
MyFragment onDetach() 解除和activity的关系
1.先从内存缓存(Map<String,SoftReference<Bitmap>>中获取图片显示
3.都获取不到的话通过子线程从网络加载图片并保存到内存及SD卡中并通过handler显示
1).Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
http://wenku.baidu.com/view/03dc4b46b307e87100f69604.html
2)、 构造adapter没有使用缓存contentview
内存泄露大多数都是由于相同的错误导致的,即:对Context拥有较长时间的引用。
不要保留对Context-Activity长时间的引用(对Activity的引用的时候,必须确保拥有和Activity一样的生命周期)
尝试使用Context-Application来替代Context-Activity
mvc是model,view,controller的缩写,mvc包含三个部分:
l模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
l视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
l控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
所谓单例设计模式简单说就是无论程序如何运行,采用单例设计模式的类(Singleton类)永远只会有一个实例化对象产生。具体实现步骤如下:
(1)将采用单例设计模式的类的构造方法私有化(采用private修饰)。
(2)在其内部产生该类的实例化对象,并将其封装成private static类型。
程序在接口和子类之间加入了一个过渡端,通过此过渡端可以动态取得实现了共同接口的子类实例化对象
所谓观察者模式,举个例子现在许多购房者都密切观察者房价的变化,当房价变化时,所有购房者都能观察到,以上的购房者属于观察者,这便是观察者模式。
java中可以借助Observable类和Observer接口轻松实现以上功能。当然此种模式的实现也不仅仅局限于采用这两个类。
封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
记录打开的Activity:(http://zdpeng.iteye.com/blog/1576055)
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
19·Final ,finally,finalized,区别;
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此
方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
1一打开百度地图页面,显示的就是目前所在城市地图,谷歌地图不然。
2百度地图的界面,百度地图很多都是在显眼位置用文字做提示,一目了然,谷歌界面有点炫,很多用图标来表示,但是用起来相对复杂,不熟悉的用户需要确定这个图标是否是所需要选择的。
4百度地图有个视野内搜索功能,可以很方便地查找到目标位置,谷歌地图没有。这个很重要。
5一个重要界面布局问题,百度地图是地图视野在左,而谷歌地图是地图视野在右,我们现在时喜欢从左到右看东西啊,这点百度地图更符合用户习惯。(当然也可能是我常用百度地图,所以这么觉得)
PS:刚在知乎上有朋友说到——因“左图右列表”强调的是“地图”,反之强调的是“搜索”;我们发现用户在经过这么些年的教育后,“不在乎”地图在哪边,相对其它体验,这一点影响用户选择服务的权重并不高。
6百度地图已经和都市圈合作推出了部分城市如北京、上海、深圳、广州的三维地图,谷歌地图没有。
7百度地图地图视野上方有个截图功能,可以直接拉框截图,谷歌地图没有。
8使用百度的占大多数,经常可以听到“百度一下啊”的话语。随之带来百度地图的使用率也相对较高。
1如果需要从网络地图上获取数据的话,谷歌地图完胜,而且还有谷歌地球在一旁辅助,如虎添翼,从网上各种各样的谷歌地图相关工具软件就可以看出。
2路线查询时输入地点名称却有多个符合条件时,会给出一个下拉菜单给予选择,同一地点谷歌地图提供的数据精确到街道,而百度地图精确到区。
3谷歌地图可以将侧边栏隐藏起来,看到更大的地图视野,而百度地图是点击全屏来显示更大的视野,两种切换方式比起来谷歌的更舒服。
4谷歌地图有个分享链接功能,而且还提供“粘贴 HTML 以便嵌入到网站”这一功能,百度没有。
5界面布局百度地图更简洁,但是色彩搭配上和画面感上谷歌地图更好。
http://wenku.baidu.com/view/3ef50eddd15abe23482f4d7e.html
android系统架构分从下往上为linux 内核层、运行库、应用程序框架层、和应用程序层 linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。
applicationframework(应用软件架构),java应用程序开发人员主要是使用该层封装好的api进行快速开发。
上面的四个层次,下层为上层服务,上层需要下层的支持,调用下层的服务,这种严格分层的方式带来的极大的稳定性、灵活性和可扩展性,使得不同层的开发人员可以按照规范专心特定层的开发。
1)、convertView复用,对convetView进行判空,当convertView不为空时重复使用,为空则初始化,从而减少了很多不必要的View的创建
2)定义一个ViewHolder,封装Listview Item条目中所有的组件,将convetView的tag设置为ViewHolder,不为空时通过ViewHolder的属性获取对应组件即可
3)、当ListView加载数据量较大时可以采用分页加载和图片异步加载
通过直接发送URI把参数带过去,或者通过Manifest里的intentfilter的data属性
1):MediaPlayer:主要用于播放音频,可以播放视频,但是一般不用其进行视频播放。
2):SoundPool: 主要用于播放一些短促的声音片段,主要优势是cpu资源占有量低,反应延迟小。
1. onTouch方法: onTouch方法是View的 OnTouchListener接口中定义的方法。 当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。 (当把手放到View上后,onTouch方法被一遍一遍地被调用) 2.onTouchEvent方法: onTouchEvent方法是override 的Activity的方法。 重新了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会别调用。
json简单说就是对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构
SIM卡的文件系统有自己的规范,主要是为了和手机通讯,SIM本身可以有自己的操作系统,EF就是作 存储并和手机通讯用的。
封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕
xUtils 源于Afinal框架,对Afinal进行了适当的精简,和一些适度的扩展和重构。
xUtils 具有Afinal的一些特性如:无需考虑bitmap在android中加载的时候oom的问题和快速滑动的时候图片加载位置错位等问题;简洁,约定大于配置...
// 对XUtils的理解: Dbutils 、ViewUtils、HttpUtils、BitmapUtils
DbUtils模块:android中的orm框架,一行代码就可以进行增删改查。
ViewUtils模块:android中的ioc框架,完全注解方式就可以进行UI绑定和事件绑定。
// Android 中ANR异常的处理方法 :( 意思是: 应用程序没有响应 )
2.广播在10秒内没有完成返回( BroadcastReceiver )
2.在主线程内进行一些缓慢的磁盘操作(例如执行没有优化的SQL查询)
2.获取数据后,调用handler.sendmessage方法
1>简而言之: 一个程序至少有一个进程,一个进程至少有一个线程
3>进程在执行的过程中拥有独立的内存单元,而多个线程共享内存,从而提高了程序的运行效率
4>每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
5>多线程的意义在于一个应用程序中,有多个执行部分可以同时执行, 但是操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理及分配资源,这就是进程和线程的重要区别
清单文件之指定URI或者代码里面指定URI,contentProvider通过URI访问数据
AIDL的英文全称是Android Interface DefineLanguage
当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的
其次需要在AndroidManifest.xml文件中配置MyService类,代码如下:
<service android:name=".MyService">
<action android:name="net.blogjava.mobile.aidlservice.RemoteService"/>
为什么要指定调用AIDL服务的ID,就是要告诉外界MyService这个类能够被别的进程访问,只要别的进程知道这个ID,正是有了这个ID,B工程才能找到A工程实现通信。
首先我们要将A工程中生成的RemoteService.java文件拷贝到B工程中,在bindService方法中绑定aidl服务
绑定AIDL服务就是将RemoteService的ID作为intent的action参数。
// 应用升级(版本号升级 ) 或软件升级,数据库就会跟着升级
在清单文件更改版本号,上传更新的应用到平台,利用平台的更新提醒用户是否更新新版本。
先更改版本号,在onupgress方法内判断版本号是否一致,不一致则更新数据库。
1) 继承某个现有组件,在其基础上添加额外功能,如继承Gallery实现CoverFlow效果
2)复合型组件定义:继承某个Layout,实现复合组件自定义,如TextView和EditText组合实现登录注册组件
3)继承View,实现onDraw()方法,实现自己绘制组件,如翻页效果组件
通常实现分页加载有两种方式,一种是在ListView底部设置一个按钮,用户点
在ListView底部设置一个按钮,用户点击即加载实现思路:
// 加上底部View,注意要放在setAdapter方法前
ListView.addFooterView(moreView);
bt.setOnClickListener(new OnClickListener() {
pg.setVisibility(View.VISIBLE);// 将进度条可见
bt.setVisibility(View.GONE);// 按钮不可见
handler.postDelayed(new Runnable() {
bt.setVisibility(View.VISIBLE);
mSimpleAdapter.notifyDataSetChanged();// 通知listView刷新数据
当用户滑动到底部时自动加载实现思路: 实现OnScrollListener 接口重写
Standard、singleTop、singleTask、singleInstance
standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶+的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
singleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
实例连接:http://wenku.baidu.com/view/b73dd968af1ffc4ffe47ac0c.html
图片轮播是由viewpage和handler两者结合所实现的,
1.这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object
2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可
以使用同步控制块或者方法。sleep不出让系统资源;wait是进入线程等待池
等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,
因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用
notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系
统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到
3.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而
Android使用UncaughtExceptionHandler捕获全局异常(未捕获的异常处理程序)
语法:静态变量前要加static来修饰,而实例变量前则不加;
android:descendantFocusability="blocksDescendants"
内部类:内部类可以是static的或者非static的,static内部类只能包含静态方法和静态类变量,只能访问外部类的静态元素,内部类可以实例化,多次使用。
1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
*res/raw和assets的不同点:
1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
InputStream is = getResources().openRawResource(R.id.filename);
//通过 资源 id 直接打开 raw 下的 流文件
2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作
InputStream is = am.open("filename");
// 通过 AssectManager 管理器 来打开 assect 下的流文件
线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
2.线程是进程的一个实体,是CPU调度和分派的基本单位,线程自己基本上不拥有系统资源,只拥有一点在系统运行中必不可少的资源,但是它可与同属一个进程的其他线程共享进程所拥有的全部资源
1.一个线程可以创建和撤销另一个线程,同一个进程中的多个线程可以同时并发执行,他可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行顺序
进程有独立的地址空间,一个进程崩溃后,不会对其他进程产生影响
对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程,(因为进程在切换时耗费的资源要大一些,效率差一些)
线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。
(2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(4)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
(1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。 (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。
(4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
abstract可以修饰抽象方法,而一个类只要有一个抽象方法,就必须用
用interface修饰的类,里面的方法都是抽象方法,因此在定义接口的时候,可以
直接不加那些修饰,系统会默认的添上去。接口里面的字段都是公有常量,即
// 抽象类: 有抽象方法和普通方法 、 抽象类==父类( 抽象类是 顶级父类 )
// 比较两个对象是否相等 == 比较的是地址、 = 比较的是值
//final不能和 static 、actaret 一起使用
dom解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后就可以使用 DOM 接口来操作这个树结构。优点是对文档增删改查比较方便,缺点占用内存比较大。
sax解析:基于事件驱动型,优点占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改,不能中途停止。
pull解析:同样基于事件驱动型,android 官方API提供,可随时终止,调用next() 方法提取它们(主动提取事件)
WebSettings、WebViewClient、WebChromeClient
设置WebView的一些属性、状态等,例如允许使用javascript,允许使用缓存,允许使用内置的缩放组件
setJavaScriptEnabled(true); 设置支持js
主要帮助WebView处理各种通知、请求事件(例如,点击链接时候如何显示界面,页面开始加载,加载完毕之后有何动作等)
shouldOverrideUrlLoading()onPageStarted() onPageFinished()
辅助WebView处理Javascript的对话框、网站图标、网站Title、加载进度等
核心方法有onJsAlert()onJsConfirm() onJsPrompt() onProgressChanged() onReceivedIcon()
loadUrl(url) 通过url地址加载互联网或本地网页
如:loadUrl("http://www.baidu.com"); // 互联网地址
loadUrl("file://android_asset/html/index.html"); //本地网页
loadData(data,type,encoding) 直接加载网页内容,容易乱码,一般用 loadDataWithBaseURL代替
显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
1:创建一个继承BroadcastReceiver类的广播接收器。
2:在清单文件中注册广播并在<intent-filter>中设置优先级 priority(只要比你想拦截程序的短信接收器优先级高就可以了)
3:在onReceiver()中调用abortBroadcast()就可以了
2.通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
3.throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛出。
如果在方法中会有异常被抛出而你又不希望在这个方法体内对此异常进行处理,可以使用throws在声明方法的时候同时声明他可能会跑出的异常。
DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念。
运行时权限 Dalvik( android 授权) 文件系统 linux 内核授权
1:对称加密(DES,AES)和非对称(RSA公钥与私钥)。
对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。
定义一个类继承Application,定义一个集合存放所有的activity,定义一个添
加的方法,再写一个退出的方法,使用for循环全部调用finish方法,然后在每个
Activity的onCreate方法中调用自定义类里的添加方法,然后在需要使用一键退出
ListView分页加载通常有两种实现方式:一种是ListView底部设置一个按钮,用户点击即加载;另一种是当用户滑动到底部时自动加载。
Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
答:在清单文件AndroidManifest.xml中相应的<activity>标签内设置属性android:theme=”@android:style/The
ArrayList<String> al=new ArrayList<String>();
Iterator<String> it=al.iterator();
System.out.println(it.next());
StringBuilder与StringBuffer的区别 。
1,一个类似于 String 的字符串缓冲区,对它的修改不会像String那样重创建对象。
2,使用append()方法修改Stringbuffer的值,使用toString()方法转换为字符串。
HashSet:元素无需、不可重复;ArrayList:元素有序,可重复
HashMap以兼职对的形式伯村数据,key值可重复,value值不可重复
第一种:帧布局(框架布局)FrameLayout,在这个布局中,所有的子元素统统放于这块区域的左上角,并且后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分和全部遮挡。
第三种:绝对布局AbsoluteLayout,又可以叫做坐标布局,可以直接指定子元素的绝对位置,这种布局简单直接,直观性强,但是由于手机屏幕尺寸差别比较大,使用绝对定位的适应性会比较差。
1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。
public static void main(String[] args) throws IOException
//创建一个文件读取流对象,并初始化时指定名称的文件相关联。
//要保证此文件是已存在,如不存在会发生异常:FileNotFoundException
FileReader fr = new FileReader("demo.txt");
//read方法一次只读一个字符,而且会自动向下读取。当读取完后会返回-1.
4). 属性名必须与json串中属性名保持一致 (因为Gson解析json串底层用到了Java的反射原理)
显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
<receive android:name=".IncomingSMSReceiver ">
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED")
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver.filter);
)IPC(Inter-Process Communication,进程间通信),
1.Android虚拟机启动之前系统会先启动serviceManager进程;
2.service Manager打开binder驱动,并通知binder kernel驱动程序这个进程将作为System ServiceManager;
5.然后client可以通过getService获取到需要连接的目的Service的IBinder对象,这个IBinder是Service的BBinder在binder kernel的一个参考,
byte、short、int、long、float、double、char、boolean
答:编译时异常:程序正确,但因为外在的环境条件不满足引发。例如:用户错
误及I/O问题----程序试图打开一个并不存在的远程Socket端口。这不是程序本
身的逻辑错误,而很可能是远程机器名字错误(用户拼写错误)。对商用软件系统,
程序开发者必须考虑并处理这个问题。Java编译器强制要求处理这类异常,如果
运行期异常:这意味着程序存在bug,如数组越界,0被除,入参不满足规范.....
这类异常需要更改程序来避免,Java编译器强制要求处理这类异常。
equals是判断两个变量或实例所指向的内存空间的值是不是相同
95、HttpClient与HttpUrlConnection的区别
通过fromJson()实现对象的反序列化(即将json串转换为对象类型)
通过toJson()实现对象的序列化 (即将对象类型转换为json串)
通过google提供的Gson解析json时,定义JavaBean的规则是什么?
4). 属性名必须与json串中属性名保持一致 (因为Gson解析json串底层用到了Java的反射原理)
像这种情况,你想算出f(x)就必需算出f(x-1),而f(x)和f(x-1)实际上都是用共一个方法,只是参数相差一.这种时候用递归就很快.
事务,也是数据库事务,指的是作为单个逻辑工作单元执行的一系列操作。正常的情况下,操作应该顺利进行,与操作相关的所有数据库信息也成功地更新;
但是,如果在这一系列过程中任何一个环节出了差错,导致操作失败了,数据库中所有信息都必须保持操作前的状态不变。否则,数据库的信息将会一片混乱而不可预测。
一个逻辑工作单元要称为事务,必须满足ACID(原子性,一致性,隔离性和持久性)
事务的结束只能有两种形式:提交和回滚。操作完全成功则提交,产生永久性的修改;操作不完全成功则回滚,恢复到事务开始前的状态。它们将结束一个事务。
(1)关闭自动提交事务。通过设置连接的自动提交事务属性为false,
ps:就是我们平时最常用的那种,setXxxListener后就重写里面的对应方法,通常都是临时使用一次,复用性不高
因为外部类不能直接访问用户界面类中的组件,要通过构造方法将组件传入使用,这样的结果就是代码不够简洁
只需要让Activity类实现~Listener事件监听接口,在Activity中定义重写对应的事件处理器方法
http://www.2cto.com/kf/201403/287434.html
1. onKeyDown:
功能:该方法是接口KeyEvent.Callback中的抽象方法,所有的View全部实现了该接口并重写了该方法,该方法用来捕捉手机键盘被按下的事件。
功能:该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。
4. onTrackBallEvent:
功能: 接下来将介绍的是手机中轨迹球的处理方法onTrackBallEvent。所有的View同样全部实现了该方法。
http://blog.csdn.net/liranke/article/details/6855601
This和getApplicationContext ()的区别
getApplicationContext():生命周期是整个应用,应用摧毁,它才摧毁。
this:代表当前,在Activity当中就是代表当前的Activity,换句话说就是Activity.this在Activity当中可以缩写为this.
onCreate-->
onStart-->
onResume-->
5、修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation",执行步骤3
6、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged
onConfigurationChanged-->
onConfigurationChanged-->
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候
Activity未被完全覆盖只是失去焦点:onPause--->onResume
先在布局文件中调用v4包下的ViewPager,在java代码中初始化ViewPager,并设置adapter(继承PagerAdapter),再设置监听onPageChangeListener
eclipse中的流程:右击你的项目 -- Properties -- Android --Add 选择SlidingMenu库
3)SlidingMenu.LEFT_RIGHT 左右2测菜单
方法的重载属于,编译时多态,方法名相同参数列表不同,返回值必须相同或都没有返回值类型。 方法的覆盖属于运行时多态,子类覆盖父类的方法,子类指向父类引用,在调用方法的时候用父类的引用调用。
实现类有:ArrayList 数组实现轻量级,运行快,线程不安全。JDK1.2 查询快
Vector 数组实现重量级,运行慢,线程安全。JDK1.0保证元素的无序唯一,自定义对象存进HashSet为了保证元素内容不重复需要覆盖hashCode()与equals()方法。
SortedSet(不重要) 元素有序(Unicode升序)唯一
LinkedList 链表实现 常用语堆栈与队列的实现 增删操作快
实现类有:HashSet,底层用hashCode()算法实现,
现Comparable接口的 compareTo(object o)方法
Map(接口): 与Collection接口无关,有一个子接口SortedMap特点: 元素是key-value, key
实现类: HashMap 轻量级 线程不安全的,允许key或value为null JDK1.2
HashTable 重量级 线程安全的 不允许key或value为null JDK1.0
Properties是HashTable的子类,主键和值都是字符串
publicclassHomeFeatureLayoutextendsHorizontalScrollView {
privateArrayList<ListItem> items = null;
privateGestureDetector gestureDetector;
View.OnTouchListener gestureListener;
privatestaticfinalint SWIPE_MIN_DISTANCE =5;
privatestaticfinalint SWIPE_THRESHOLD_VELOCITY =300;
publicHomeFeatureLayout(Context context, ArrayList<ListItem> items){
setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
this.setHorizontalScrollBarEnabled(false);
this.setVerticalScrollBarEnabled(false);
LinearLayout internalWrapper =newLinearLayout(context);
internalWrapper.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
internalWrapper.setOrientation(LinearLayout.HORIZONTAL);
for(int i =0; i<items.size();i++){
TextView header = (TextView)featureLayout.findViewById(R.id.featureheader);
ImageView image = (ImageView)featureLayout.findViewById(R.id.featureimage);
TextView title = (TextView)featureLayout.findViewById(R.id.featuretitle);
title.setTag(items.get(i).GetLinkURL());
TextView date = (TextView) featureLayout.findViewById(R.id.featuredate);
Image cachedImage =newImage(this.getContext(), items.get(i).GetImageURL());
image.setImageDrawable(cachedImage.getImage());
title.setText(items.get(i).GetTitle());
date.setText(items.get(i).GetDate());
internalWrapper.addView(featureLayout);
gestureDetector =newGestureDetector(newMyGestureDetector());
setOnTouchListener(newView.OnTouchListener() {
publicboolean onTouch(View v,MotionEventevent) {
if (gestureDetector.onTouchEvent(event)) {
elseif(event.getAction() ==MotionEvent.ACTION_UP ||event.getAction() ==MotionEvent.ACTION_CANCEL ){
int featureWidth = getMeasuredWidth();
activeFeature = ((scrollX +(featureWidth/2))/featureWidth);
int scrollTo = activeFeature*featureWidth;
classMyGestureDetectorextendsSimpleOnGestureListener {
publicboolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY) {
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE&&Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
activeFeature = (activeFeature< (items.size() -1))? activeFeature +1:items.size() -1;
smoothScrollTo(activeFeature*getMeasuredWidth(),0);
elseif (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE&&Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY){
activeFeature = (activeFeature>0)? activeFeature -1:0;
smoothScrollTo(activeFeature*getMeasuredWidth(),0);
1):数组在定义时必须定义长度,而集合在定义时不必定义长度。
2):数组在定义时必须要声明数组的数据类型,而集合不必。但是一般情况下我们都是存储统一数据类型的数据,我们可以使用泛型的写法来限制集合里面的数据类型。
GPS定位需设置权限android.permission.ACCESS_LOCATION_FINE
网络定位需设置权限android.permission.ACCESS_LOCATION_COARSE
即GPS定位比网络定位在精确度方面更精准,但在速度方面稍差一些,而且GPS定位适合在室外环境下使用,网络定位在室内,室外都可以。
#defineSENSOR_TYPE_ACCELEROMETER 1 //加速度
#defineSENSOR_TYPE_MAGNETIC_FIELD 2 //磁力
#defineSENSOR_TYPE_ORIENTATION 3 //方向
#defineSENSOR_TYPE_GYROSCOPE 4 //陀螺仪
#defineSENSOR_TYPE_LIGHT 5 //光线感应
#define SENSOR_TYPE_PRESSURE 6 //压力
#defineSENSOR_TYPE_TEMPERATURE 7 //温度
#defineSENSOR_TYPE_PROXIMITY 8 //接近
#defineSENSOR_TYPE_GRAVITY 9 //重力
#defineSENSOR_TYPE_LINEAR_ACCELERATION 10//线性加速度
#defineSENSOR_TYPE_ROTATION_VECTOR 11//旋转矢量
Integeri= new Integer(1);(要把integer 当做一个类看)
int 是基本数据类型(面向过程留下的痕迹,不过是对java的有益补充)
Integer 是一个类,是int的扩展,定义了很多的转换方法
类似的还有:floatFloat;double Double;string String等
1.ViewFilpper类继承于ViewAnimator类。而ViewAnimator类继承于FrameLayout。
查看ViewAnimator类的源码可以看出此类的作用主要是为其中的View切换提供动画效果。该类有如下几个和动画相关的方法。
2.ViewPager用于实现多页面的切换效果,该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中加入“android-support-v4.jar”
public static int[] doMaoPao(int[] in){
for(int j=0;j<length-1-i;j++){
System.out.print("输出j="+in[j]+"");
System.out.print("输出j+1= "+in[j+1]);
// System.out.print("i="+in[i]);
publicstatic int[] doPaiXv(int[] in){
for(intj=i+1;j<in.length;j++){
System.out.print("输出j="+in[j]+"");
System.out.print("输出i= "+in[i]);
publicstatic void binary_sort(int a[]){
publicstatic void main(String[] args) {
inta[] = {2,6,9,8,4,7,3,1,0,5};
通过get方式提交的数据有大小的限制,通常在1024字节左右。也就是说如果提交的数据很大,用get方法就可需要小心;而post方式没有数据大小的限制,理论上传送多少数据都可以。
通过get传递数据,实际上是将传递的数据按照”key,value”的方式跟在URL的后面来达到传送的目的的;而post传递数据是通过http请求的附件进行的,在URL中并没有明文显示
什么是API
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节.
简单来说,就是一套可供调用的系统接口.
常遇到的异常、如何解决
异常的继承结构:
基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。
Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。
1、SQLException:操作数据库异常类。
问题:当Java应用程序与数据库进行沟通时如果产生了错误,就会触发这个类。同时会将数据库的错误信息通过这个类显示给用户。当用户插入数据的时候,如果这个字段的值跟现有的纪录重复了,违反了数据库的唯一性约束,此时数据库就会跑出一个异常信息。这个信息一般用户可能看不到,因为其发生在数据库层面的。此时这个操作数据库异常类就会捕捉到数据库的这个异常信息,并将这个异常信息传递到前台。如此的话,前台用户就可以根据这个异常信息来分析发生错误的原因。
解决方案:检查插入的数据是否重复。
2、 ClassCastException:数据类型转换异常。
问题:在Java应用程序中,有时候需要对数据类型进行转换。这个转换包括显示的转换与隐式的转换。不过无论怎么转换,都必须要符合一个前提的条件,即数据类型的兼容性。在数据类型进行转换之前,就保证数据类型的兼容性。如此的话,就不容易造成数据类型的转换异常。如在只允许数值类型的字段中,可以设置不允许用户输入数值以外的字符。
解决方案:注意相应的组件在初始化的时候,是否相对应。
3、 NumberFormatException:字符串转换为数字类型时抛出的异常。
在数据类型转换过程中,如果是字符型转换为数字型过程中出现的问题,对于这个异常在Java程序中采用了一个独立的异常,即NumberFormatException.如现在讲字符型的数据“123456”转换为数值型数据时,是允许的。但是如果字符型数据中包含了非数字型的字符,如123#56,此时转换为数值型时就会出现异常。系统就会捕捉到这个异常,并进行处理。
解决方案:检查数据是否正确。
4.java.lang.NullPointerException
(1).如果使用第三包的jar包,jar包中有错误
(2).没有实例化组件
(3).没有把Adapter和值绑定;
(4).当页面中某个组件赋值为null时activity会出现错误,程序崩溃后其他页面的数据就会被重新初始化
(5).用Intent传值时,获取的key不存在
(6).没有赋初始值
5.java.lang.ClassNotFoundException 异常的解释是"指定的类不存在"。
6. java.lang.ArithmeticException 这个异常的解释是"数学运算异常",比如程序中出现了除以零这样的运算就会出这样的异常。
7. java.lang.ArrayIndexOutOfBoundsException
异常的解释是"数组下标越界",现在程序中大多都有对数组的操作,因此在调用数组的时候一定要认真检查,看自己调用的下标是不是超出了数组的范围,一般来说,显示(即直接用常数当下标)调用不太容易出这样的错,但隐式(即用变量表示下标)调用就经常出错了,还有一种情况,是程序中定义的数组的长度是通过某些特定方法决定的,不是事先声明的,这个时候,最好先查看一下数组的length,以免出现这个异常。
8. java.lang.IllegalArgumentException
这个异常的解释是"方法的参数错误",比如g.setColor(intred,int green,int blue)这个方法中的三个值,如果有超过255的也会出现这个异常,因此一旦发现这个异常,我们要做的,就是赶紧去检查一下方法调用中的参数传递是不是出现了错误。
9. java.lang.IllegalAccessException
这个异常的解释是"没有访问权限",当应用程序要调用一个类,但当前的方法即没有对该类的访问权限便会出现这个异常。对程序中用了Package的情况下要注意这个异常
10.安全异常:产生的原因是由于当前的设备不支持当前程序,这个是由于机型产生的问题,我们应该换一个设备进行测试,检测当前程序存在什么样的异常;另一种原因是获取激活的网络信息实体类,需要添加权限,否则会出现此异常
解决办法:在配置文件中,添加android_permission_Access_NetWork_State的权限
11. RejectExcuteException:一个异步任务只能执行一次,否则会报异常
一个线程最多能执行5个线程,超出则等待,否则会报拒绝执行的异常
解决办法:使用子线程+handler来代替AsyncTask,或者一个线程中少添加几个异步操作。
12.Out of memory:内存溢出是存放的数据过多导致内存不足的溢出事件
13.Memory leak:内存泄露是本应该释放的资源没有充分得到释放,就继续添加数据导致内存泄露事件;
Java应用程序中常见的异常类还有很多。如未找到相应类异常、不允许访问某些类异常、文件已经结束异常、文件未找到异常、字段未找到异常等等。一般系统开发人员都可以根据这个异常名来判断当前异常的类型。
ArithmeticException(除数为0的异常),BufferOverflowException(缓冲区上溢异常), BufferUnderflowException(缓冲区下溢异常),IndexOutOfBoundsException(出界异常), NullPointerException(空指针异常),EmptyStackException(空栈异常), IllegalArgumentException(不合法的参数异常),NegativeArraySizeException, NoSuchElementException, SecurityException,SystemException, UndeclaredThrowableException
常用的推送,并简单介绍
并行的都包括:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM);
推送的实现原理:
XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。所有从一个client到另一个client的jabber消息和数据都要xmppserver,client连接到server,server利用本地目录系统的证书对其认证,client制定目标地址,让server告知目标状态,server查找,连接并进行相互认证,client间进行交互。
XMPP系统特点:
1)客户机/服务器通信模式;(2)分布式网络;(3)简单的客户端;(4)XML的数据格式。
通俗解释:
其实XMPP是一种很类似于http协议的一种数据传输协议,它的过程就如同“解包装--〉包
装”的过程,用户只需要明白它接受的类型,并理解它返回的类型,就可以很好的利用xmpp来进行数据通讯。
服务器提供数据前段实现容易出现什么问题
接口不可用,接口提供的数据格式不是我们想要的。
133.如何判断那种网络
1.网络是否连接(包括Wifi和移动网络)
// 是否有可用网络
private boolean isNetworkConnected() {
ConnectivityManager cm =
(ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo network = cm.getActiveNetworkInfo();
if (network != null) {
return network.isAvailable();
}
return false;
}
2.wifi是否可用
// Wifi是否可用
private boolean isWifiEnable() {
WifiManager wifiManager = (WifiManager) mContext
.getSystemService(Context.WIFI_SERVICE);
return wifiManager.isWifiEnabled();
}
GPS是否可用
[javascript] view plaincopyprint?
// Gps是否可用
private boolean isGpsEnable() {
LocationManager locationManager =
((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE));
return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
抽象类和接口的区别
abstract可以修饰抽象方法,而一个类只要有一个抽象方法,就必须用abstract定义该类,即抽象类。抽象类,被继承,实现它里面的方法,可以只有普通方法
用interface修饰的类,里面的方法都是抽象方法(不能实例化),因此在定义接口的时候,可以直接不加那些修饰,系统会默认的添上去。接口里面的字段都是公有常量,即public static final修
饰的字段。可以没有函数原型,里面可以是空的。
135. Android中版本代号
Android 1.0(没有开发代号)
Android 1.1 - Petit Four
Android 1.5 - Cupcake
Android 1.6 - Donut
Android 2.0/2.1 - Éclair
Android 2.2 - Froyo
Android 2.3 -Gingerbread
Android 3.0/3.1/3.2 -Honeycomb
Android 4.0 - Ice CreamSandwich
Android 4.1/4.2/4.3 -Jelly Bean
Android 4.4 - KitKat
Android 5.0/5.1 – Lollipop
136. Final和Finally的区别
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
136. 分享平台有哪些
ShardSdk、友盟等。
137. 后台Activity被回收如何恢复
重写onSaveInstanceState()方法,在此方法中保存需要保存的数据,该方法将会在activity被回收之前调用。通过重写onRestoreInstanceState()方法可以从中提取保存好的数据
138.Android事件分发的理解
事件分发:public booleandispatchTouchEvent(MotionEvent ev)
Touch 事件发生时 Activity的 dispatchTouchEvent(MotionEvent ev) 方法会以隧道方式(从根元素依次往下传递直到最内层子元素或在中间某一元素中由于某一条件停止传递)将事件传递给最外层 View的 dispatchTouchEvent(MotionEvent ev) 方法,并由该 View 的 dispatchTouchEvent(MotionEvent ev) 方法对事件进行分发。dispatchTouchEvent 的事件分发逻辑如下:
如果 returntrue,事件会分发给当前 View并由dispatchTouchEvent 方法进行消费,同时事件会停止向下传递;
如果 returnfalse,事件分发分为两种情况:
如果当前 View 获取的事件直接来自 Activity,则会将事件返回给 Activity 的 onTouchEvent 进行消费;
如果当前 View 获取的事件来自外层父控件,则会将事件返回给父 View 的 onTouchEvent进行消费。
如果返回系统默认的 super.dispatchTouchEvent(ev),事件会自动的分发给当前 View的 onInterceptTouchEvent 方法。
▐ 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
在外层 View 的 dispatchTouchEvent(MotionEvent ev) 方法返回系统默认的 super.dispatchTouchEvent(ev) 情况下,事件会自动的分发给当前 View 的 onInterceptTouchEvent 方法。onInterceptTouchEvent 的事件拦截逻辑如下:
如果onInterceptTouchEvent 返回 true,则表示将事件进行拦截,并将拦截到的事件交由当前 View的 onTouchEvent 进行处理;
如果onInterceptTouchEvent 返回 false,则表示将事件放行,当前 View上的事件会被传递到子 View 上,再由子 View 的 dispatchTouchEvent 来开始这个事件的分发;
如果onInterceptTouchEvent 返回 super.onInterceptTouchEvent(ev),事件默认会被拦截,并将拦截到的事件交由当前 View 的 onTouchEvent 进行处理。
▐ 事件响应:public boolean onTouchEvent(MotionEvent ev)
在 dispatchTouchEvent 返回 super.dispatchTouchEvent(ev) 并且 onInterceptTouchEvent返回 true 或返回super.onInterceptTouchEvent(ev) 的情况下 onTouchEvent 会被调用。onTouchEvent 的事件响应逻辑如下:
如果事件传递到当前 View 的 onTouchEvent 方法,而该方法返回了 false,那么这个事件会从当前 View 向上传递,并且都是由上层 View 的 onTouchEvent 来接收,如果传递到上面的 onTouchEvent 也返回false,这个事件就会“消失”,而且接收不到下一次事件。
如果返回了 true 则会接收并消费该事件。
如果返回super.onTouchEvent(ev) 默认处理事件的逻辑和返回 false 时相同。
到这里,与 Touch 事件相关的三个方法就分析完毕了。
139. 线程的几种状态
1)新建状态(New):新创建了一个线程对象。
2)就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3)运行状态(Running):就绪状态的线程获取了CPU,执行run()方法。
4)阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5)死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
当调用start方法的时候,该线程就进入就绪状态。等待CPU进行调度执行,此时还没有真正执行线程。
140. Ddms和Traceview的区别
DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器。
150. PathImage是什么
.9.PNG是安卓开发里面的一种特殊的图片,这种格式的图片通过ADT自带的编辑工具生成,使用九宫格切分的方法,使图片支持在android 环境下的自适应展示。
151. Android项目的目录结构
1)src目录:src(即SourceCode),src目录用来存放应用程序中所有的源代码,代码的源文件一般存放在该目录下的相应的包下。
2)gen目录:gen目录,该目录下一般只有一个文件,即R文件。该文件夹下面有个R.java文件,R.java是在建立项目时自动生成的,定义该项目所有资源的索引。
3)Android4.1目录:该文件夹下包含android.jar文件,这是一个Java归档文件,其中包含构建应用程序所需的所有的AndroidSDK库(如Views、Controls)和APIs。
通过android.jar将自己的应用程序绑定到AndroidSDK和AndroidEmulator,这允许你使用所有Android的库和包,且使你的应用程序在适当的环境中调试。
4)assets目录:该目录存放应用程序中使用的外部资源文件,如声音视频等,在Android程序中可以通过输入/输出流对该目录中的文件进行读写。
5)res目录:该目录用来存放程序这用到的图片、界面布局文件及XML格式的描述文件。该目录下有多个目录。新建一Android项目,在res目录下一般会有drawable,layout,valuse三个目录。drawable用来存放图片资源,目录下一般会有三个目录分别存放高中低三种不同分辨率的图片,layout目录用来存放应用程序的界面布局文件,values目录下存放字符串资源,颜色资源,数组资源等XML文件。
6)AndroidManifest.xml
152. Intentservice的用法
androidservicethreadstringclassnullIntentService实现原理及内部代码:
Android中除了Service还有一个IntentService,他们之间到底有哪些区别呢?在继承关系上而言IntentService是Service的子类,内部实现的代码中涉及到一些Android入门开发者不了解的Looper,Android123在早期的文章中已经说明他们的用法,这里不再赘述,有关原理大家可以看源码实现如下:
publicabstractclassIntentServiceextendsService{
privatevolatileLoopermServiceLooper;
privatevolatileServiceHandlermServiceHandler;//一个Handler封装了Looper对象
privateStringmName;
privatebooleanmRedelivery;
privatefinalclassServiceHandlerextendsHandler{
publicServiceHandler(Looperlooper){
super(looper);
}
@Override
publicvoidhandleMessage(Messagemsg){
onHandleIntent((Intent)msg.obj);
stopSelf(msg.arg1);
}
}
publicIntentService(Stringname){//构造方法,需要提供一个name作为标识
super();
mName=name;
}
对于下面的setIntentRedelivery的参数,如果为真时
onStartCommand(Intent,int,int)}willreturn
Service#START_REDELIVER_INTENT},soifthisprocessdiesbefore
onHandleIntent(Intent)}returns,theprocesswillberestarted
如果为假时
onStartCommand(Intent,int,int)}willreturn
Service#START_NOT_STICKY},andiftheprocessdies
publicvoidsetIntentRedelivery(booleanenabled){
mRedelivery=enabled;
}
@Override
publicvoidonCreate(){//这里重写父类Service的创建,主要是构造一个线程
super.onCreate();
HandlerThreadthread=newHandlerThread("IntentService["+mName+"]");
thread.start();
mServiceLooper=thread.getLooper();
mServiceHandler=newServiceHandler(mServiceLooper);
}
@Override
publicvoidonStart(Intentintent,intstartId){//Android2.0以前的Service启动参数控制
Messagemsg=mServiceHandler.obtainMessage();
msg.arg1=startId;
msg.obj=intent;
mServiceHandler.sendMessage(msg);
}
@Override
publicintonStartCommand(Intentintent,intflags,intstartId){//Android2.0以后的服务启动参数
onStart(intent,startId);
returnmRedelivery?START_REDELIVER_INTENT:START_NOT_STICKY;
}
@Override
publicvoidonDestroy(){//服务摧毁的时候Looper一定要释放掉,这点很重要。
mServiceLooper.quit();
}
@Override
publicIBinderonBind(Intentintent){
returnnull;
}
protectedabstractvoidonHandleIntent(Intentintent);
}
从上面的代码相信大家可以看出IntentService和Service的不同了,通过Looper和Thread来解决标准Service中处理逻辑的阻塞问题,毕竟Android的Service也是会阻塞的。
关于使用
IntentService是Service类的子类,用来处理异步请求。客户端可以通过startService(Intent)方法传递请求给IntentService,IntentService通过workerthread处理每个Intent对象,执行完所有的工作之后自动停止Service。
说明:workerthread处理所有通过传递过来的请求,创建一个workerqueue,一次只传递一个intent到onHandleIntent中,从而不必担心多线程带来的问题。处理完毕之后自动调用stopSelf()方法;默认实现了Onbind()方法,返回值为null;
模式实现了哦你StartCommand()方法,这个方法会放到workerqueue中,然后在onHandleIntent()中执行0
使用IntentService需要两个步骤:
1、写构造函数
2、复写onHandleIntent()方法
好处:处理异步请求的时候可以减少写代码的工作量,比较轻松地实现项目的需求
用Service来处理后台耗时操作,却很少注意到还有个IntentService
首先IntentService是继承自Service的,那我们先看看Service的官方介绍,这里列出两点比较重要的地方:
1.AServiceisnotaseparateprocess.TheServiceobjectitselfdoesnotimplyitisrunninginitsownprocess;unlessotherwisespecified,itrunsinthesameprocessastheapplicationitispartof.
2.AServiceisnotathread.Itisnotameansitselftodoworkoffofthemainthread(toavoidApplicationNotRespondingerrors).
稍微翻一下(英文水平一般)
1.Service不是一个单独的进程,它和应用程序在同一个进程中。
2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作
关于第二点我想说下,不知道很多网上的文章都把耗时的操作直接放在Service的onStart方法中,而且没有强调这样会出现ApplicationNotResponding!希望我的文章能帮大家认清这个误区(Service不是一个线程,不能直接处理耗时的操作)。
有人肯定会问,那么为什么我不直接用Thread而要用Service呢?关于这个,大家可以网上搜搜,这里不过多解释。有一点需要强调,如果有耗时操作在Service里,就必须开启一个单独的线程来处理!!!这点一定要铭记在心。
IntentService相对于Service来说,有几个非常有用的优点,首先我们看看官方文档的说明:
IntentServiceisabaseclassforServicesthathandleasynchronousrequests(expressedasIntents)ondemand.ClientssendrequeststhroughstartService(Intent)calls;theserviceisstartedasneeded,handleseachIntentinturnusingaworkerthread,andstopsitselfwhenitrunsoutofwork.
This"workqueueprocessor"patterniscommonlyusedtooffloadtasksfromanapplication'smainthread.TheIntentServiceclassexiststosimplifythispatternandtakecareofthemechanics.Touseit,extendIntentServiceandimplementonHandleIntent(Intent).IntentServicewillreceivetheIntents,launchaworkerthread,andstoptheserviceasappropriate.
Allrequestsarehandledonasingleworkerthread--theymaytakeaslongasnecessary(andwillnotblocktheapplication'smainloop),butonlyonerequestwillbeprocessedatatime.
稍微翻译理一理,这里主要是说IntentService使用队列的方式将请求的Intent加入队列,然后开启一个workerthread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的workerthread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。下面给一个小例子:
1Service:
packagecom.zhf.service;
importAndroid.app.Service;
importAndroid.content.Intent;
importAndroid.os.IBinder;
publicclassMyServiceextendsService{
@Override
publicvoidonCreate(){
super.onCreate();
}
@Override
publicvoidonStart(Intentintent,intstartId){
super.onStart(intent,startId);
//经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作
System.out.println("onStart");
try{
Thread.sleep(20000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("睡眠结束");
}
@Override
publicIBinderonBind(Intentintent){
returnnull;
}
}
2.IntentService:
packagecom.zhf.service;
importAndroid.app.IntentService;
importAndroid.content.Intent;
publicclassMyIntentServiceextendsIntentService{
publicMyIntentService(){
super("yyyyyyyyyyy");
}
@Override
protectedvoidonHandleIntent(Intentintent){
//经测试,IntentService里面是可以进行耗时的操作的
//IntentService使用队列的方式将请求的Intent加入队列,然后开启一个workerthread(线程)来处理队列中的Intent
//对于异步的startService请求,IntentService会处理完成一个之后再处理第二个
System.out.println("onStart");
try{
Thread.sleep(20000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("睡眠结束");
}
}
测试主程序:
packagecom.zhf.service;
importAndroid.app.Activity;
importAndroid.content.Intent;
importAndroid.os.Bundle;
publicclassServiceDemoActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startService(newIntent(this,MyService.class));//主界面阻塞,最终会出现Applicationnotresponding
//连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理)
startService(newIntent(this,MyIntentService.class));
startService(newIntent(this,MyIntentService.class));
}
}
153. IntentService有何优点?
答案:IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的workerthread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。
154. 如何启用service,如何停用service?
答案:①:通过调用Context.startservice()启动,调用Context.stopservice()结束,startservice()可以传递参数给service.
②:通过调用context.bindservice()启动,调用Context.unbindservice()结束,还可以通过serviceConnection访问service。
155. 解释下单线程中message、handler、MessageQueue、Looper之间的关系。
答案:简单来说,Handler获取当前线程中的looper对象,looper用来从存放Message说的MessageQueue中获取Message,再有Handler进行Message的分发和处理。
156. AIDL全称是什么?能处理哪些数据?
答案:全称是:Android Interface Definition Landuage是一种街口描述语言;编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的,aidl的IPC的机制和COM或CORBA类似,是基于接口的,是轻量级的。使用代理类在客户端和实现层间接传递值。
157. Activity的启动模式有哪些?
答案:①、standard,每次激活activity时,都创建activity实例,并放入任务栈。
②、singleTop,如果activity自己激活自己,即任务栈栈顶就是该activity,则不需要创建,其余情况都要创建activity实例。
③、singleTask,如果要激活的那个activity在任务栈中存在该实例,则不需要创建,只需要把此activity放入栈顶,并把该activity以上的activity实例都pop;
④、singleInstance,如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;
158. 如何评价Android?
Android平台的五大优势:
开放性、挣脱运营商的束缚、丰富的硬件选择、不受任何限制的开发商、无缝结合的Google应用
Android平台的五大不足:
一、安全和隐私
二、首先开卖Android手机的不是最大运营商
三、运营商仍然能够影响到Android手机
四、同类机型用户减少
五、过分依赖开发商缺少标准配置
159. 断点续传
断点续传下载,其实就是记录下原来下载的位置,然后从那个位置开始下载就是了。
160. Dvm是什么
Android 运行环境主要指的虚拟机技术——Dalvik。Android中的所有Java程序都是运行在Dalvik VM上的。Android上的每个程序都有自己的线程,DVM只执行.dex的Dalvikexecutable 文件。每个Android应用在底层都对应有一个独立的DVM实例并在其解释下执行。
170. 图片三级缓存的机制
实现图片缓存也不难,需要有相应的cache策略。这里我采用内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且也把它划到缓存的层次结构中。当根据url向网络拉取图片的时候,先从内存中找,如果内存中没有,再从缓存文件中查找,如果缓存文件中也没有,再从网络上通过http请求拉取图片。在键值对(key-value)中,这个图片缓存的key是图片url的hash值,value就是bitmap。所以,按照这个逻辑,只要一个url被下载过,其图片就被缓存起来了。
171. 你看好的行业领域
穿戴
172. 如何控制耗电量
在以下情况下耗电比较多:
1、 大数据量的传输。
2、 不停的在网络间切换。
3、 解析大量的文本数据。
1、 在需要网络连接的程序中,首先检查网络连接是否正常,如果没有网络连接,那么就不需要执行相应的程序。
2、 使用效率高的数据格式和解析方法。(fastJson,LoganSquare-master)
3、使用GZIP压缩方式下载数据,能减少网络流量
4、 其它一些优化方法:
回收java对象,特别是较大的java对像
对定位要求不是太高的话尽量不要使用GPS定位,可能使用wifi和移动网络cell定位即可。GPS定位消耗的电量远远高于移动网络定位。
尽量不要使用浮点运算。
获取屏幕尺寸等信息可以使用缓存技术,不需要进行多次请求。
173. Service用在哪个线程
默认情况下Service是运行在启动该Service的应用主线程的,如果Service中的操作占用大量的CPU资源或有阻断操作(比如播放MP3或者访问网络)会影响应用主线程的响应性能,甚至会造成“应用程序无响应(ANR)”问题。
174. ContentProvider和SQL的区别
Sql只能在该工程的内部共享数据,ContentProvider能在工程之间实现数据共享。
175.Android如何访问自定义ContentProvider
1.第一:得到ContentResolver类对象:ContentResolver cr =getContentResolver();
2. 第二:定义要查询的字段String数组。
3. 第三:使用cr.query();返回一个Cursor对象。
4.第四:使用while循环得到Cursor里面的内容。
176.Uri有什么组成
答:URI由是部分组成:
A,标准的前缀:ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
B,唯一标识整个ContentProvider:主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
C,描述了数据的路径,确定返回哪类数据:路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定
D, ID唯一标注请求的数据:我们要请求数据的ID
177. 对android系统的理解
5大优势:
一、 开放性
二、 挣脱运营商的束缚
三、 丰富的硬件选择
四、 不受任何限制的开发商
五、 无缝结合的Google应用
Android的5大不足
一、 安全和隐私
二、 首先开卖Android手机的不是最大运营商
三、 运营商仍然能够影响到Android手机
四、 同类机型用户减少
五、 过分依赖开发商缺少标准配置
178. 简单介绍服务
服务是没有界面的长生命周期的代码。一个很好的例子是媒体播放器从列表中播放歌曲。在一个媒体播放器程序中,大概要有一个或多个活动(activity)来供用户选择歌曲并播放它。然而,音乐的回放就不能使用活动(activity)了,因为用户希望他导航到其他界面时音乐继续播放。这种情况下,媒体播放器活动(activity)要用Context.startService()启动一个服务来在后台运行保持音乐的播放。系统将保持这个音乐回放服务的运行直到它结束。注意一下,你要用Context.bindService()方法连接服务(如果它没有运行,要先启动它)。当连接到服务后,你可以通过服务暴露的一个接口和它通信。对于音乐服务,它允许你暂停、倒带,等等。
179. 一条最长短信约占多少byte
180. 上拉加载下拉刷新如何实现
答:实现OnScrollListener 接口重写onScrollStateChanged 和onScroll方法,使用onscroll方法实现”滑动“后处理检查是否还有新的记录,如果有,调用addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了,把自定义的mFooterView去掉。使用onScrollStateChanged可以检测是否滚到最后一行且停止滚动然后执行加载
181.手机适配如何做,自适应
答:
在布局中设置控件尺寸是尽量使用fill-parent,warp-content,dp等值,文字使用sp
尽量使用Relativelayout。
对不同的屏幕提供不同大小的图片,
已知应用支持平台设备的分辨率,可以提供多个layout_320*480 ...
drawable-hdpi,drawable-mdpi,drawable-ldpi分别代表分辨率为480*800,360*480,240*360,放置图片大小相差1.5倍
最后还需要在AndroidManifest.xml里添加下面一段,没有这一段自适应就不能实现:
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:anyDensity = "true"/>
在</application>标签和</manifest> 标签之间添加上面那段代码。即可。
182. Manifest中放什么东西
AndroidManifest.xml是每个android程序中必须的文件。它位于整个项目的根目录,描述了package中暴露的组件(activities,services,等等),他们各自的实现类,各种能被处理的数据和启动位置。
除了能声明程序中的Activities,ContentProviders,Services,和IntentReceivers,还能指定
permissions和instrumentation(安全控制和测试)
183. 自定义组件的实现思路
答: Android自定义组件有三种实现思路:
1) 继承某个现有组件,在其基础上添加额外功能,如继承Gallery实现CoverFlow效果
2) 继承某个Layout,实现复合组件自定义,如TextView和EditText组合实现登录注册组件
3) 继承View,实现onDraw()方法,实现自己绘制组件,如翻页效果组件
184. 项目中的混淆打包
a在项目的project.properties文件中加入如下代码:
proguard.config=proguard.cfg即可
好处:1.隐藏代码,避免被反编译2.减少代码提交,提高效率4.android中四大组件不能被混淆,所用在清单文件中声明的都是被混淆5.native不能被混淆
185. 什么是020,b2b,b2c,
http://blog.sina.com.cn/s/blog_64e090b001016843.html
186.如何进行手势判断
用onTouchEvent(ev)判断手势
187. Xutil的用法
http://www.csdn123.com/html/topnews201408/82/6182.htm
188. ContentProvider Uri的组成
189. 数据库如何写sql语句
公司框架中中有对数据库的增删改查,有时候自己也写一些复杂的sql语句】
190. 电商领域的核心
订单,支付,购物,和信息安全
191. Asynctask的原理
AsyncTask的本质是一个线程池,所有提交的异步任务都会在这个线程池中的工作线程内执行,当工作线程需要跟UI线程交互时,工作线程会通过向在UI线程创建的Handler传递消息的方式,调用相关的回调函数,从而实现UI界面的更新。
192.asset和res的区别
答:res/raw和assets的相同点:
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
res/raw和assets的不同点:
1)res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即 R.raw.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
2)res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹
3)读取文件资源举例:
读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作
InputStream is =getResources().openRawResource(R.raw.filename);
读取assets下的文件资源,通过以下方式获取输入流来进行写操作
AssetManager am = null;
am = getAssets();
InputStream is = am.open("filename");
193. 瀑布流如何实现
就是异步下载图片的时候把图片添加到scrollview中,
你需要几列就在scrollview中放置几个linearlayout,在scrollview滑动的的时候动态的测量linearlayout随机生成linearlayout的高度
194. 图片的内存不足
可能是你加载的当前的图片占用内存大于当前剩余内存,解决方法就是及时释放内存,不显示的图片要释放掉。也可能是你加载的图片是空的,导致内存不足。android系统给图片分配的内存只有8M,当加载大量图片时往往会出现OOM。
Android加载大量图片内存溢出解决方案:
1)尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存,可以通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source
2)使用BitmapFactory.Options对图片进行压缩
InputStream is =this.getResources().openRawResource(R.drawable.pic1);
BitmapFactory.Options options=newBitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 10; //width,hight设为原来的十分一
Bitmap btp=BitmapFactory.decodeStream(is,null,options);
3)运用Java软引用,进行图片缓存,将需要经常加载的图片放进缓存里,避免反复加载
及时销毁不再使用的Bitmap对象
if(!bmp.isRecycle() ){
bmp.recycle() //回收图片所占的内存
system.gc() //提醒系统及时回收
}
195. Http和Https有什么区别
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。http的连接很简单,是无状态的,...HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全
196. 相册缩略图如何实现
publicclass Thumbnail extends Activity {
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
saveMyBitmap("ooo");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void saveMyBitmap(String bitName)throws IOException {
File originalFile = newFile("sdcard/pic/ll.jpg");
Bitmap bmp = decodeFile(originalFile);
File f = new File("/sdcard/" +bitName + ".jpg");
f.createNewFile();
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(f);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
//BitmapFactory.Options options=newBitmapFactory.Options();
//options.inSampleSize = 10;
//options.inTempStorage = new byte[16*1024];
//Bitmap bmp = BitmapFactory.decodeFile("/sdcard/pic/sd.jpg");
//Bitmap bmp =BitmapFactory.decodeFile("/sdcard/pic/ll.jpg", options);
//bmp = Bitmap.createScaledBitmap(bmp, 800,480, true);
bmp.compress(Bitmap.CompressFormat.JPEG, 30,fOut);
try {
fOut.flush();
} catch (IOException e) {
e.printStackTrace();
}
try {
fOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//decodes image and scales it to reducememory consumption
private Bitmap decodeFile(File f){
try {
//Decode image size
BitmapFactory.Options o = newBitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(newFileInputStream(f),null,o);
//The new size we want to scale to
final int REQUIRED_HEIGHT=800;
final int REQUIRED_WIDTH=480;
//Find the correct scale value. It should be thepower of 2.
int width_tmp=o.outWidth, height_tmp=o.outHeight;
System.out.println(width_tmp+" "+height_tmp);
Log.w("===", (width_tmp+" "+height_tmp));
int scale=1;
while(true){
if(width_tmp/2<REQUIRED_WIDTH &&height_tmp/2<REQUIRED_HEIGHT)
break;
width_tmp/=2;
height_tmp/=2;
scale++;
Log.w("===",scale+"''"+width_tmp+" "+height_tmp);
}
//Decode with inSampleSize
BitmapFactory.Options o2 = newBitmapFactory.Options();
o2.inSampleSize=scale;
return BitmapFactory.decodeStream(newFileInputStream(f), null, o2);
} catch (FileNotFoundException e) {}
return null;
}
}
197.View更新页面的五种方式
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable,long);
View.postInvalidate();
View.Invalidate();
198.Android程序的入口
action节点中的android.intent.action.MAIN表明它所在的Activity是整个应用程序的入口点
199. 高德地图了解
地图渲染技术:性能提升10倍,所占空间降低80%,比传统地图软件节省流量超过90%
专业在线导航功能:覆盖全国364个城市、全国道路里程352万公里
在线导航功能:最新高德在线导航引擎,全程语音指引提示,完善偏航判定和偏航重导功能。
AR虚拟实景:AR功能结合手机摄像头和用户位置、方向等信息,将信息点以更直观的方式展现给用户,为发现和目标地点指引
丰富的出行查询功能:地名信息查询、分类信息查询、公交换乘、驾车路线规划、公交线路查询、位置收藏夹等丰富的基础地理信息查询工具。
锁屏语音提示,即使你的iPhone在锁屏状态也能听到高德导航的语音提示,不用担心一直开着iPhone屏幕费电了。
夜间导航HUD抬头提示,打开高德导航并开启HUD,把iPhone放到汽车挡风玻璃下,高德导航会把路线提示倒映到汽车挡风玻璃上,看起来特别方便,不用担心低头看手机影响驾驶了。
动态导航
交通路况实时播报
智能计算到达目的地所需的时间
避堵路线方案规划
摄像头提醒
离线下载
2D、3D离线地图
分地区下载地图包
全国地图包、全国概要图
地图搜索
热门地点、线路搜索
公交、自驾出行线路规划
公交、火车、天气查询服务
全新引擎
最新3D版本,360度旋转视角
矢量数据传送
观看更流畅、更清晰
兴趣点
餐饮、住宿、优惠、
演出、团购全覆盖
海量兴趣点随意搜
叫车服务
2013年7月,高德地图更新,新增打车功能,综合快的打车、嘀嘀打车两家资源,覆盖80%市场份额。与阿里合作后,高德地图凭借高市场占有率,逐渐从单一地图向LBS工具箱转变。新版高德地图不仅增加了可预约的出租车数量,提高了打车效率,覆盖城市也扩展到26个
200. Activity中 this和getActivity区别
This指的是Activity当前的上下文
getActivity()指的是在fragment当中调用得到他所在的Activity
201. 单例模式和抽象工厂各自的优点
单例模式:减少创建对象的次数,对内存的管理更方便,占用内存更少
抽象工厂:把公共的部分抽取出,提高了代码的复用性,也减少了代码量,便于管理。
202. Android的几种缓存方式
内存缓存,文件缓存,网络缓存
203. 简单讲解一下递归
递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。
这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
(3)数据的结构形式是按递归定义的。
如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。
递归的缺点:
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
递归典型问题: 梵塔问题(汉诺塔问题)
已知有三根针分别用A, B, C表示,在A中从上到下依次放n个从小到大的盘子,现要求把所有的盘子
从A针全部移到B针,移动规则是:可以使用C临时存放盘子,每次只能移动一块盘子,而且每根针上
不能出现大盘压小盘,找出移动次数最小的方案.
204. 如何根据权重实现布局
//权重和父容器orientation有关
horizontal指水平方向权重 android:layout_width
vertical 指垂直方向权重 android:layout_height
Layout_weight是线性布局,也就是LinearLayout里面用到的
在layout_width设置为fill_parent的时候,layout_weight代表的是你的控件要优先尽可能的大,但尽可能大是有限度的,即fill_parent.
在layout_width设置为wrap_content的时候,layout_weight代表的是你的控件要优先尽可能的小,但这个小是有限度的,即wrap_content.
205.在Activity中This和GetApplictionContext的区别
getApplicationContext() 返回应用的上下文,生命周期是整个应用,应用摧毁它才摧毁
Activity.this的context 返回当前activity的上下文,属于activity ,activity 摧毁他就摧毁
getBaseContext() 返回由构造函数指定或setBaseContext()设置的上下文
this.getApplicationContext()取的是这个应 用程序的Context,Activity.this取的是这个Activity的Context,这两者的生命周期是不同 的,前者的生命周期是整个应用,后者的生命周期只是它所在的Activity。
206. Android中项目升级注意的问题
在清单文件里面的android:versionCode和android:versionName有版本文件, 客户端同时存储该应用当前版本号 (SharedPreferences/Sqlite), 每次打开应用,去检测服务器版本号与本地版本号是否一致,如果不一 致,则自定义对话框提示是否下载更新
207. Xml解析有几种,分别是什么
三种分别为:sax,pull,dom
dom解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后就可以使用 DOM 接口来操作这个树结构。优点是对文档增删改查比较方便,缺点占用内存比较大。
sax解析:基于事件驱动型,优点占用内存少,解析速度快,缺点是只适合做文档的读取,不适合做文档的增删改,不能中途停止。
pull解析:同样基于事件驱动型,android 官方API提供,可随时终止,调用next() 方法提取它们
208. 播放视频的实现方式
1)使用系统自带的播放器来播放,指定Action为ACTION_VIEW,Data为Uri,Type为其MIME类型。
//调用系统自带的播放器
Intentintent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri,"video/mp4");
startActivity(intent);
2)使用VideoView组件来播放, 可以结合MediaController来实现播控, 只是不能随意更改视频的大小及位置。
3)使用MediaPlayer和SurfaceView来实现,这种方式很灵活,可以自定义视频播放的大小和位置。
209. IPC是什么
IPC(Inter-Process Communication,进程间通信),aidl是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口.编译器可以通过扩展名为aidl的文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的.
BroadcastReceiver也可以实现进程间通信
ContentProvider 提供进程间数据共享
210. Viewpager是如何使用
我们可以做很多事情,从最简单的导航,到页面菜单等等。那如何使用它呢,与LisstView类似,我们也需要一个适配器,他就是PagerAdapter,也可以与fragment结合使用
211. 如何自定义一个Adapter
继承自BaseAdapter实现里面的方法,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度,然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必 须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的 布局。我们用LayoutInflater的方法将定义好的main.xml文件提取成View实例用来显示。然后 将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定 义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得 要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面 首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那 再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了
212. 横竖屏切换时候activity的生命周期?
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
1.返回键与Home键区别?
back键默认行为是finish处于前台的Activity的即Activity的状态为Destroy状态为止,再次启动该Activity是从onCreate开始的(不会调用onSaveInstanceState方法)。Home键默认是stop前台的Activity即状态为onStop为止而不是Destroy,若再次启动它,会调用onSaveInstanceState方法,保持上次Activity的状态则是从OnRestart开始的---->onStart()--->onResume()
3.谈谈Android的IPC机制
IPC是内部进程通信的简称,是共享”命名管道”的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。
4.android 的优势与不足 Android平台手机 5大优势: 一、开放性
在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟
开发性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。 二、挣脱运营商的束缚
在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?
互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。 三、丰富的硬件选择
这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢? 四、不受任何限制的开发商
Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。 五、无缝结合的Google应用
如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。 再说Android的5大不足: 一、安全和隐私
由于手机与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。
二、首先开卖Android手机的不是最大运营商
众所周知,T-Mobile在23日,于美国纽约发布了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服务则要另当别论了!
三、运营商仍然能够影响到Android手机
在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。
四、同类机型用户减少
在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型以外。
五、过分依赖开发商缺少标准配置
在 使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在 Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐播放器,全部依赖第三方开发,缺少了产品的统一性。
Android操作系统是Google在什么时间公布的
A、2007年11月5日 B、2010年5月20日晚10点30分
C、2009年11月10日 正确答案:A
2、Android基于什么平台的开源智能手机操作系统名称
A、WinCE B、Linux C、SHP 正确答案:B
3、Linux平台由以下下哪些组成?
A、操作系统 B、中间件 C、用户界面 D、应用软件 正确答案:ABCD
4、Android操作系统主要的特点是:
A、与Google无缝结合 B、实现个性化应用 C、良好的平台开放性 D、软件均要收费 正确答案:ABC
5、Android操作系统向开发人员提供是
A、全部免费 B、部分收费 C、只有10%左右是收费的
正确答案:A
6、Android个性化界面设置的添加方式
A、点选屏幕下方添加键进行添加 B、长按屏幕空白处进行添加 C、直接拖拽至屏幕进行添加 正确答案:ABC
7、个性化界面设置不同内容包括:
A、快捷方式 B、小插件 C、窗口小部件 D、文件夹
正确答案:ABCD
8、Android操作系统采用全新解锁方式描述正确的是:
A、自定义图型解锁; B、滑动解锁;
C、规定图型解锁; D、只可侧键解锁; 正确答案:AB
9、Android支持谷歌全方位移动服务,丰富最新网络体验包括:
A、电子市场; B、Google Talk; C、Google搜索;
D、G-mail邮箱; E、Google地图 正确答案:ABCDE
10、截止2010年12月,中国上市的Andriod操作系统已经发布了以下哪几个版本
A、1.0 B、1.3 C、1.5 D、1.6
E 、2.0 F、2.1 G、2.2 正确答案:ACDEFG
11、在中国,以下哪些属于Android软件主要下载门户?
A、安卓网 B、机锋网 C、百度 D、Google E、优亿市场 正确答案:ABE
12、Android安装软件后缀是:( )
A..sis B.cab C..apk D..jar 正确答案:C
13、以下哪些不是Android操作系统的版本:( )
A、1.0 B、1.3 C、 2.0 D、2.1 E 、2.2 正确答案:B
14、Android操作平台的开放性也针对了众多手机品版的厂家进行了完全的开放,以下有哪几个品牌的手机从未使用过Android操作系统
A.HTC B.I phone C.samsung D.诺基亚 E.黑莓
正确答案:BDE
15、Android1.5操作系统叫( )
A.纸杯蛋糕 B.甜甜 C.法式奶油夹心甜点 D.果馅饼
E.冻酸奶 正确答案:A
16、Android1.6操作系统叫( )
A.纸杯蛋糕 B.甜甜 C.法式奶油夹心甜点 D.果馅饼
E.冻酸奶 正确答案:B
17、Android2.0操作系统叫( )
A.纸杯蛋糕 B.甜甜 C.法式奶油夹心甜 D.果馅饼
E.冻酸奶 正确答案:C
18、Android2.1操作系统叫
A.纸杯蛋糕 B.甜甜圈 C.法式奶油夹心甜点 D.果馅饼
E.冻酸奶 正确答案:D
19、Android2.2操作系统叫( )
A.纸杯蛋糕 B.甜甜 C.法式奶油夹心甜点 D.果馅饼
E.冻酸奶 正确答案:E
20、Android2.2操作系统与Android2.1操作系统对比有哪些方面的提升
A.整体性能大幅度的提 B.3G网络共享功能
C.全面的Flash支持 D.App2 sd功能(安装程序到SD卡)
E.全新的软件商店 F.更好的网络体验
正确答案:ABCDEF
21、Android系统可以同时运行多个程序吗?
A.可以; B.不可以 正确答案:A
22、以下对Android操作系统描述正确的是:
A.系统资源占用少,系统运行速度快
B.完全开放性的操作系统,对所有软件开发商、手机厂商、运营商平等享有
C.有众多的软件提供给消费者下载
D.个性化的操作界面,操作简单
正确答案:ABCD
23、Android操作系统的手机可以有以下几个方法进行软件安装A.通过手机直接登陆百度网站下载安装;
B.通过手机直接登陆Android门户网站进行下载安装;
C.通过数据线与电脑连接直接下载安装;
D.通过PC终端上网下载至SD卡里再插入手机进行安装; 正确答案:ABCD
24、Android操作系统具有个性化操作界面设置,以下关于进行添加描述正确的
A. 点选屏幕下方添加键进行添 B.长按屏幕空白处进行添加
C.直接拖拽至屏幕进行添加 D.不可直接拖拽至屏幕进行添加 正确答案:ABC
26、Android从哪个版本开始支持动态壁纸
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:D
27、Android从哪个版本开始支持3D动态相册 A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:D
28、Android从哪个版本开始系统自带支持mobileAP热点 A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:E
29、Android从哪个版本开始支持Flash10.1
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:E
30、Android从哪个版本开始系统自带支持AllShare协议 A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:E
31、Android从哪个版本开始可以提供多个不同账户统一收件箱 A.1.0 B.1.3 C. 2.0
D.2.1 E .2.2 正确答案:C
32、Android从哪个版本开始浏览器支持双击缩放
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:C
33、Android从哪个版本开始强化了语音识别的搜索功能
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:C
34、Android从哪个版本开始加入微软Exchange服务支持
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:C
35、Android从哪个版本开始支持双击上传图片至YouTube
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:C
36、Android从哪个版本开始支持谷歌地图服务更新
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:C
37、Android从哪个版本开始支持所有文本输入区应用语音识别
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:D
38、Android从哪个版本开始支持3D相片集
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:D
39、Android从哪个版本开始支持修复FM收音机
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2
正确答案:D
40、 以下哪些是Android的优势
A、 开源的操作系统,代码完全开放,开放成本最低
B、 便捷的用户体验界面,操作简单
C、 平台技术先进,更好的支持互联网业务
D、 系统资源占用少,系统速度快 正确答案:ABCD
41、Android从哪个版本开始软件可安装到存储卡上
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:E
42、Android从哪个版本开始自动更新设备上已经安装的应用程序
A.1.0 B.1.3 C. 2.0 D.2.1 E .2.2 正确答案:E
43、Android能实现手机的主屏幕的自定义,并将常用的各种应用以图标的形式添加至主屏幕界面
A、对 B、错 正确答案:A
44、Android能实现手机的主屏幕的自定义,但是添加的图标要按照功能属性排列
A、对 B、错 正确答案:B
45、Android操作系统的主屏界面图标设置一次后,就不能更改
A、对 B、错 正确答案:B
46、、Android操作系统可以将哪些类型不同内容,随意添加至主屏幕
A、快捷键 B、窗口小部件 C、文件夹 D、壁纸
正确答案:ABCD
android 面试题相关推荐
- Android 基本面试题
Android 基本面试题 一.java 核心思想 1.八种基本数据类型和封装类 基本类型 大小(字节) byte 1 short 2 int 4 long 8 float 4 double 8 bo ...
- 【Android面试】Android面试题集锦 (陆续更新)(最新2012-6-18)
1.android开发新浪面试题[开发者必看哦] 下载地址 http://www.eoeandroid.com/thread-177885-1-1.html 2.华为关于android笔试题案例解析 ...
- android面试题总结加强
在加强版的基础上又再加强的android应用面试题集 有些补充略显臃肿,只为学习 1.activity的生命周期. 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的 ...
- 【Android面试】Android面试题集锦 (陆续更新)
[Android面试]Android面试题集锦 (陆续更新) 分类: [杂七杂八]2011-05-11 17:58 2064人阅读 评论(0) 收藏 举报 一些常见的Android面试基础题做下总结, ...
- Android之面试题总结加强版(一)
转载:http://blog.csdn.net/itachi85/article/details/7426451 自己总结的最强android应用面试题集 1.activity的生命周期. 方法 描述 ...
- 好全的Android面试题
转载:http://www.jianshu.com/p/84ee896c3329 需求描述 各种新技术接触渠道比较狭窄, 面试没有底气. 常见面试知识点及回答没有较系统的准备,就业指导提供的资料没时间 ...
- 安卓Android面试题大全
56个问题都是经常用到的,可以深入研究下,也是必须掌握的开发必备知识. 安卓Android面试题汇总 搜集了一些Android面试题目,供将要面试或者正在面试的朋友参考. 1, 谈谈你对Activit ...
- 金三银四的面试黄金季节,Android面试题来了!
金三银四的跳槽季节,你准摆好了吗? 首先我们分享一个Android知识图谱. 下面是一些面试官基本必问的问题,请一定要去了解! 基础知识 – 四大组件(生命周期,使用场景,如何启动) java基础 – ...
- Android面试题Java基础篇
Android面试题Java基础篇,由本人整理汇总,后续将继续推出系列篇,如果喜欢请持续关注和推荐,更多精彩内容可以关注微信公众号(Android高级编程):android-tech 系列文章目录: ...
- 2020年度整理国内一线互联网公司内部Android面试题库
一眨眼又到年底了,每到这个时候,我们都会慢慢反思,这一年都做了什么?有什么进步?年初的计划都实现了吗?明年年初有跳槽的底气了吗? 况且2020年我们经历了新冠疫情的洗礼,很多程序员都经历了失业,找工作 ...
最新文章
- 计算机解决问题没有奇技淫巧,但动态规划还是有点套路
- java jmx jboss_jboss中JMX的连接与Mbean的获取
- 新建一个doophp项目
- 有哪些LSTM(Long Short Term Memory)和RNN(Recurrent)网络的教程?
- mysql5.6兼容包_freebsd9.1源码安装apache、mysql、php环境(亲侧通过)
- storage.googleapis.com 访问与下载慢
- 你真的不了解这个地球
- 【物理总结】初中物理重要常数、单位换算、概念、规律和理论及知识的应用归纳大全梳理总结
- Linux_基础_软件包管理
- ROC曲线与AUC区域的理解与实践
- ECharts力导向布局图增加滚动条
- 文本聚类python fcm_机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现
- 向量叉乘公式_大物学习笔记(公式总结)
- 计算机重启命令编码,电脑倒计时重启代码是什么
- 龟兔赛跑Description乌龟与兔子在马路上赛跑,马路边可以随地进行休息。
- 计算机网络八大性能指标
- Git报错:another git process seems to be running in this repository
- 针对目前windows系统的所有勒索病毒补丁和安全工具
- ❁将xls批量转换成xlsx
- 挂载NTFS分区的两种方法
热门文章
- php面试需要穿正装吗,研究生复试,到底要不要穿正装?正装如何选?4个建议送给你...
- Linux 自动发送本机 IP 到邮箱
- 小学计算机京剧脸谱教案,小学信息技术课教学设计模板
- Neural Motifs: Scene Graph Parsing with Global Contex解读
- LX3352系列精密切割机满足各种划切需求
- 全球及中国四象限光电探测器行业发展模式及投资需求潜力预测报告2021年版
- UE5--我要成为建模大师
- 只有部署 SSL 证书才能保护网上隐私信息安全
- Java强引用、软引用、弱引用、虚引用有什么区别?
- JAVA中强引用和弱引用的区别