如何安全退出已调用多个Activity的Application?
1.利用ActivityContainer来管理所有的Activity的引用
2.使用广播通知BaseActivity结束
3.直接杀死进程
4.采用SingleTask的特点,结束应用
http://www.cnblogs.com/qifengshi/p/6477796.html
同一个程序不同的Activity如何放在不同的任务栈中?
需要为不同的activity设置不同的taskAffinity属性,启动activity的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。
Service的生命周期
当用Context.startService()来启动时,Service的生命周期依次为:oncreate——>onStartCommand——>onDestroy
当用Context.bindService()启动时:onStart——>onBind——>onUnbind——>onDestroy
Service有哪些启动方法,有什么区别,怎样停用Service?
第一种是通过调用Context.startService()启动,调用Context.stopService()结束
第二种方式是通过调用Context.bindService()启动,调用Context.unbindservice()结束,
通过startService启动时Service组件和应用程序没多大的联系;如果访问者不主动关闭,Service就不会关闭
通过bindService进行绑定时,应用程序可以通过ServiceConnection进行数据交互
Handler 原理
Andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。
Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。
Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。
Message Queue(消息队列):用来存放线程放入的消息。
线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。
进程优先级
前台进程:即与用户正在交互的Activity或者Activity用到的Service等,如果系统内存不足时前台进程是最后被杀死的
可见进程:可以是处于暂停状态(onPause)的Activity或者绑定在其上的Service,即被用户可见,但由于失去了焦点而不能与用户交互
服务进程:其中运行着使用startService方法启动的Service,虽然不被用户可见,但是却是用户关心的,例如用户正在非音乐界面听的音乐或者正在非下载页面自己下载的文件等;当系统要空间运行前两者进程时才会被终止
后台进程:其中运行着执行onStop方法而停止的程序,但是却不是用户当前关心的,例如后台挂着的QQ,这样的进程系统一旦没了有内存就首先被杀死
空进程:不包含任何应用程序的程序组件的进程,这样的进程系统是一般不会让他存在的
AIDL 解决了什么问题
AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在 Android 设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。如果在一个进程中(例如Activity)要调用另一个进程中(例如 Service, 设置了属性 android:process=”:remote” 后,Service 就会运行在另外一个进程)对象的操作,就可以使用AIDL生成可序列化的参数。 AIDL IPC机制是面向接口的,像COM或Corba一样,但是更加轻量级。它是使用代理类在客户端和实现端传递数据。
Sleep和Wait的区别
Sleep是一个线程类Thread的方法,它是线程睡眠一段时间后自动恢复
Wait是Object的方法,wait方法会进入一个等待锁定池,只有针对此对象发送notify或者notifyall后才能重新进入运行状态
android中的动画有哪几类,它们的特点和区别是什么?
两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
8、说说mvc模式的原理,它在android中的运用
mvc包含三个部分:
模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。
android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下:
1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,当然,如何你对android了解的比较的多了话,就一定 可以想到在android中也可以使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信,幸运的是,android提供了它们之间非常方便的通信实现。
2)控制层(controller):android的控制层的重任通常落在了众多的acitvity的肩上,这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。
11、 你后台的Activity被系统回收怎么办:
onSaveInstanceState当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B这个时候A会执行Java代码publicvoid onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putLong("id", 1234567890);}B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume就好了。savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。Java代码if(savedInstanceState != null){long id = savedInstanceState.getLong("id");}就像官方的Notepad教程 里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦, 没准你需要记住滚动条的位置...
15. 请介绍下Android的数据存储方式。
Android提供了5种方式存储数据:
1、使用SharedPreferences存储数据;
2、文件存储数据;pro...
3、SQLite数据库存储数据;
4、使用ContentProvider存储数据;
5、网络存储数据;Android 中的数据存储都是私有的,其他应用程序都是无法访问的,除非通过ContentResolver获取其他程序共享的数据。
16. 请介绍下ContentProvider是如何实现数据共享的。
一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
19. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
简单的说,Handler获取当前线程中的looper对象,looper用来从存放Message的MessageQueue中取出Message,再有Handler进行Message的分发和处理
21. 请解释下Android程序运行时权限与文件系统权限的区别。
apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。android系统有的权限是基于签名的。
28、IntentService有何优点?
答:IntentService 的好处Acitivity的进程,当处理Intent的时候,会产生一个对应的Service Android的进程处理器现在会尽可能的不kill掉你,非常容易使用
29、横竖屏切换时候activity的生命周期?
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
横竖屏切换候重新调用onCreate使用禁止切换程调用onCreate需要横屏竖屏使用同布局文件能种式行经我自写代码测试前竖屏经切换并使用横屏布局文件竖屏布局文件使用横屏状态知道我写合适本希望家讨论问题通查阅Android API知android:onConfigurationChanged实际应ActivityonConfigurationChanged()AndroidManifest.xml添加诉代码含义表示改变屏幕向、弹软件盘隐藏软键盘再执行onCreate()直接执行onConfigurationChanged()申明段代码按照Activity命周期都执行onCreate()onCreate()通显示前做些初始化工作所改变屏幕向操作都执行onCreate()能造重复初始化降低程序效率必且更能重复初始化导致数据丢失需要千万避免
30. 如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?**
解答:可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中
31. 如何将打开resaw目录中的数据库文件?**
解答:在Android中不能直接打开resaw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得resaw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。
32. Android引入广播机制的用意?**
答:a:从MVC的角度考虑(应用程序内)其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过 是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一 种补充关系,引入广播机制可以方便几大组件的信息和数据交互。b:程序间互通消息(例如在自己的应用程序内监听系统来电)c:效率上(参考UDP的广播协议在局域网的方便性)d:设计模式上(反转控制的一种应用,类似监听者模式)
34、android 中有哪几种解析xml的类?官方推荐哪种?以及它们的原理和区别
XML解析主要有三种方式,SAX、DOM、PULL。常规在PC上开发我们使用Dom相对轻松些,但一些性能敏感的数据库或手机上还是主要采用SAX方 式,SAX读取是单向的,优点:不占内存空间、解析属性方便,但缺点就是对于套嵌多个分支来说处理不是很方便。而DOM方式会把整个XML文件加载到内存 中去,这里Android开发网提醒大家该方法在查找方面可以和XPath很好的结合如果数据量不是很大推荐使用,而PULL常常用在J2ME对于节点处 理比较好,类似SAX方式,同样很节省内存,在J2ME中我们经常使用的KXML库来解析。
Sex解析
第一步:取得解析工厂。第二步:取得解析器。第三步:实例化一个解析对象。第四部:绑定解析目标和解析器。第五步:开始解析。
Dom解析==document
第一步:取得解析工厂。第二步:取得解析器。第三步:得到一个倒挂的Dom树。第四步:把子节点放入到nodelist中。第五步:循环取得nodelist的节点。第六步:循环取得node里面的子节点。
Sex解析,可以直接从XML文件中找到解析的目标。
Dom解析,直接加载整个XML文件,循环取得Dom中的值。
WedView控件可以直接显示一个网页
35、DDMS和TraceView的区别?
DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器
36、Activity被回收了怎么办?
只有另启用了
37、java中如何引用本地语言
可以用JNI接口
38、谈谈Android的IPC机制
IPC是内部进程通信的简称, 是共享”命名管道”的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。
41 创建线程有几种不同的方式?你喜欢哪一种?为什么?
1.继承Thread类(重写Runnable方法)代码简单,直接在方法里面操作。
2.实现Runnable接口(不用重写)更符合面向对象的思想
3.应用程序可以使用Executor框架来创建线程池实现Runable接口这种方式更受欢迎,因为不要继承Theard类,在应用设计中已经继承了别的对象的情况下,这需要多继承(Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用
4种activity的启动模式
standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。
singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。
Dialog提示方式
时间提示 日期提示 消息提示 进度提示
44 IntentFilter(Intent过滤器)
对于显式Intent,它的接受者已被指定,所以系统会自动把这个Intent发给指定的组件。但是对于隐式Intent,由于并没有指定其组件名属性,所以系统不知道该把它发给哪个组件名,于是系统就直接将其发出去,算是所有的组件都有权接收,这就需要定义一个组件可以接收到哪些Intent,所以就引入了IntentFilter(Intent过滤器)。
45 Intent的六大属性
组建名称 动作 数据 分类 额外信息 标识
data/type,你可以用Uri来做为data,比如Uri uri = Uri.parse(http://www.google.com );Intent i = new Intent(Intent.ACTION_VIEW,uri);手机的Intent分发过程中,会根据http://www.google.com 的scheme判断出数据类型type手机的Brower则能匹配它,在Brower的Manifest.xml中的IntenFilter中首先有ACTION_VIEW Action,也能处理http:的type,3、至于分类Category,一般不要去在Intent中设置它,如果你写Intent的接收者,就在Manifest.xml的Activity的IntentFilter中包含android.category.DEFAULT,这样所有不设置Category(Intent.addCategory(String c);)的Intent都会与这个Category匹配。4、extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。
46 Service的四大特点
①没有用户界面。②比Activity 的优先级高,不会轻易被Android系统终止。③即使Service被系统终止,在系统资源恢复后Service也将自动恢复运行状态。④可用于进程间通信(Inter Process Communication,IPC),解决两个不同Android应用程序进程之间的调用和通讯问题。
广播生命周期
调用对象-实现onReceive-结束
android:gravity与android:layout_gravity的区别
答案:LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。他们的区别在 于:android:gravity用于设置View组件的对齐方式,而android:layout_gravity用于设置Container组件的 对齐方式。
举个例子,我们可以通过设置android:gravity="center"来让EditText中的文字在EditText组件中居中显示;同 时我们设置EditText的android:layout_gravity="right"来让EditText组件在LinearLayout中居中 显示。来实践以下:
正如我们所看到的,在EditText中,其中的文字已经居中显示了,而EditText组件自己也对齐到了LinearLayout的右侧。
padding与margin的区别
padding填充的意思,指的是view中的content与view边缘的距离,类似文本中的indent
而margin表示的是view的左边缘与parent view的左边缘的距离
margin一般用来描述控件间位置关系,而padding一般描述控件内容和控件的位置关系。
简单,padding是站在父 view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离。margin则是站在自己的角度描述问题,规定自己和其他(上下左右)的 view之间的距离,如果同一级只有一个view,那么它的效果基本上就和padding一样了。
50 异常的三种方式
RunTimeException: 运行时异常
Exception:程序员处理异常
Error:硬件异常,程序不对其做处理。
51 进程的优先级
前台进程,可见进程,服务进程,后台进程,空进程
52 运行时异常和一般异常区别
Java提供了两类主要的异常:运行时异常runtime exception和一般异常checked exception。checked 异常。对于后者这种异常,JAVA要求程序员对其进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。运行时异常我们可以不处理。这样的异常由虚拟机接管。出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
53 Exception和Error区别
Exception:程序员处理异常(编程时候的异常,程序员可以控制)
Error:硬件异常,程序不对其做处理。(程序员不可控制)
54 File
对文件和目录进行操作的类
获取位图
BitMapfactory, resource ,drawable
session和cookies的区别
session是储存在服务器端的
cookies 是存储在客户端的即本地
list和map,set的区别
list是一个有续集和,可以重复
set跟list共用一个父类,set方法中不能有相同的元素
map以存储键值对的形式,存储的数据是无序的,key值不能相同
60 线程和进程?
1.定义
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
2.关系
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
相对进程而言,线程是一个更加接近于执行体的概念,它可以与同进程中的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列。
3.区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
- 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
- 线程的划分尺度小于进程,使得多线程程序的并发性高。
- 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
4.优缺点
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。
61 List和ArrayList的区别?
List是一个接口,是collection接口的一个字接口,是一个有序集合。而ArrayList是List的一个实现类,可以实现数组大小的改变,可以很方便实现增删数组内元素的操作。
62 ==和equals区别?
值类型是存在内存的栈中,引用类型的变量在栈中存储的是变量的地址,而本身存储在堆中。
==操作是比较两个变量的值是否相同,
对于比较引用类型变量,表示的是两个变量在堆中的地址是否相同,即栈中的内容是否相同。
equals是比较两个对象堆中内容是否相同。
==比较的是两个对象的地址。
equals不能比对8大基本数据类型
显然当equals为true时候,==不一定为true
63 内存泄漏
当一个对象已经不需要使用的时候,本该被回收的时候,有另外一个正在使用的对象,导致不能回收,存在内存中,形成了内存泄漏
单列模式造成的内存泄漏
非静态内部类创建静态实例造成的内存泄漏
Hanlder造成内存泄漏
线程造成内存泄漏
资源未关闭造成的内存泄漏(广播,File,BitMap,Cursor)
res和assets文件夹区别
相同点:两者属于静态,目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制
不同点:res/raw中的文件会被映射到R.java文件中,访问时候直接R.id.find....
65 HashMap和HashTable的区别
1.HashTable是基于陈旧的ictionary类,HashMap是java1.2引进的map接口的一个实现
2.HashTable是线程安全的,同步 HashMap线程不安全,不同步
3.只有HashMap可以让你将空值作为一个表的条目的key value
4.Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
66 this和Super的区别?
this表示当前对象,super表示当前的父类
举例:一个类A,这个A继承了B, B是A的父类。 如果A和B中都有一个aa(); 的方法
那么在A中this.aa();就是调用A中定义的方法,而Super.aa()调用的就是A的父类B中定义的方法aa();
67 JAVA中的IO分类
1.字节流
InputStream-文件输入流FileInputStream
OutputStream-文件输出流FileOutputStream
2.字符流
Reader-字符串输入流BufferedReader
Writer-字符串输出流BufferedWriter
3.对象流
ObjectInputStream,ObjectOutputStream
int 和 Integer 有什么区别
Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
int = 0 integer = null
跳出循环?
break; return; continue;