android面试
腾讯面试题
int result = a+++3<<2;
int result = (a++ > 2)?(++a):(a+=3);
int b = 0x06;
int result = a&b;
Integer b = 34556;
boolean result = a==b;
return s.length() > 0 ? func(s.subString(1))+ s.charAt(0):"";
}
String result = func("Tencent");
比方 A = "Marginle"。B = Valaienie", 交集为aie,写个算法。
1.Activity和BroadCast Receiver的生命周期
Java基础
1.说出sleet,wait,notify的差别
2.怎样定位和解决Andorid的内存溢出问题
3.一个有N个元素的一维数组(A[0],A[1], ..., A[n-1]),设计一个算法求解该数组最大子数组。(要求时间复杂度是O(n))
4.用Java代码实现推断一个字符串中是否包括还有一个字符串,不要用jdk中String的indexOf方法。
5.用Java实现一个Singleton.
6.简述Observer设计模式,并画出Observer模式的典型结构类图
7.& 和&&的差别
8.什么是dpi,ps,sp?
适配是怎样做的。为什么?
9.用最有效率的方法算出2乘以8等于几?
10.静态成员类、非静态成员类有什么差别?什么是匿名内部类?
11.Handler机制的原理,内部是怎样实现的,消息队列的实现机制?
12.什么是ANR。怎样定位和避免?
13.APK之间互相传递数据
14.简述Android的启动过程
15.怎样载入ndk库?怎样在jni中注冊native函数,有几种注冊方法?
16.怎样收集软件崩溃信息?
17.简述软件编译流程和公布流程
18.是否编译过android源代码和linux内核源代码
19.写一个归并排序数组
20.自己定义控件相关
21.缓存实现
22.线程同步(生产者 消费者)
23.符号匹配(栈)
24.还问了下拉刷新和分页载入的实现机制
-------------------------------------------------------
盘古搜索面试总结
算法题
2.求一个数组的最大连续子序列和,比方:-10,3,5,2,-3,6,7
最笨的方法就是穷举法。用三层for循环
3.求一个数组中出现次数最多且值最大的数
android的基础题
1.service的生命周期
2.Intent用途。了解多少?IntentService知道么?
3.自己定义控件
4.xmpp协议的理解
5.广播创建方式有几种?有什么差别?
6.多线程有几种实现方式?
继承Thread, 实现Runnable接口。 AsynTask
------------------------------------------------------------
一、listview怎样优化(这个非常重要,多次被问到)
1.分页载入
2.convertView缓存
3.viewHolder
4.scrollListener,记住滑动的状态
二、经常使用排序算法,各种算法的复杂度,用Java实现一种排序算法。
四、单链表的反转、合并、排序
五、二分查找法
六、Intent Flag经常使用的记住几个
七、AIDL怎么用?全称是什么?
八、taskAffinity 亲和性
这个一般人应该都不熟悉,了解一下。面试中可能被问到,几率不大。
--------------------------------------------------------------
百度各种面试总结
1.Listview item缓存怎样实现
convertView
2.非常多view怎样缓存
3.图片上传
4.图片过大怎样处理?压缩后图片有多大?
分辨率压缩、质量压缩
5.OOM怎么办?
6.图片的缓存机制,怎样做到高效和稳定?
7.自己定义view怎么做能提高效率?
自己定义view怎样做图片缓存?自己定义view怎样推断单击和双击?自己定义view 的 onDraw方法主要做什么?
避免反复调用measure 和 layout
8.是否看过view的源代码
9.动画的机制及其底层实现?
10.二叉树、链表
11.平时看什么书?去哪些论坛看?
12.问项目底层实现
13.Linux文件系统实现,怎样实现文件的隐藏?
面试算法题总结
1.有一个整数数组,有负数和整数,用一个方法把正负数分开,要求空间复杂度是O(1),时间复杂度是:O(N)(百度移动平台部)
2.有一个数列。奇数个。当中有3个是单个的, 其他都是成对的。怎么找出当中随意一个单个的数(小米一面)
3.在一个数组中。找出出现次数最多且数值最大的一个数并输出
4.用最快的方式将两个数组合并到一个数组中?时间复杂度
答:这个问题是搜狗2012年的笔试题,我開始还真是没想太明确。
刚才看到HashMap的时候才发现原来是这么回事。
当须要往ArrayList,HashMap中放东西时。像int,double这样的内建类型是放不进去的,由于容器都是装object的,这就须要这些内建类型的外覆类了。比方:int相应的Integer。double相应的Double。
答:频繁插入,链表效率高,频繁查找数组效率高,那么综合一下,我个人认为是哈希表,或者说HashMap等使用hash算法的数据结构。
面试过程描写叙述曾经做过的项目。
项目中你觉得的难点是什么。
2、对于网络交互这块儿须要注意什么问题
用uml画一个在你的项目中使用的设计模式。
(多家公司都在问,好好研究一下)
(多家公司都问。Android方向面试必考的)
(常考的)
技术更新永无止境。要时刻保持清醒的头脑,不断学习,充实自己。才干在竞争中不被淘汰,祝大家好运。找到心仪的工作。
=================================================================================================================
sdk文档中有具体说明
wait 和 sleep的差别
java经常使用的数据结构 怎样实现
重载与重写差别
android 有哪些安全机制
android 应用之间有几种共享数据的方法
android 哪些操作会导致内存泄露 怎样排查
.9.png 和 png 的差别
sqlite 使用注意事项
Listview 中 getview中 convertview 的工作原理
service 有什么特征,在哪种情况下会用到service
面试
面试的时候会问你关于简历上的项目,会问得比較细。问你几个人做的,做了多长时间。画出原理图
intent 怎样开启activity的?
manifest 的作用
内存过低时,是用什么策略杀死进程@?
每种含义大家看SDK文档和详细跑下这样你的记忆会更深刻些。
每种含义是什么?
加入删除怎样提高性能?
百度Android开发面试题
DVM指Dalvik的虚拟机。
每个Android应用程序都在它自己的进程中执行,都拥有一个独立的Dalvik虚拟机实例。而每个DVM都是在Linux 中的一个进程,所以说能够觉得是同一个概念。
sim卡的文件系统有自己规范。主要是为了和手机通讯,sim本
身能够有自己的操作系统,EF就是作存储并和手机通讯用的
页式,段式。段页。用到了MMU,虚拟空间等技术
嵌入式实时操作系统是指当外界事件或数据产生时,可以接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出高速响应。并控制全部实时任务协调一致执行的嵌入式操作系统。主要用于工业控制、军事设备、
航空航天等领域对系统的响应时间有苛刻的要求,这就须要使用实时系统。又可分为软实时和硬实时两种。而android是基于linux内核的。因此属于软实时。
中文70(包含标点),英文160个字节
两种,一种是Tween动画、另一种是Frame动画。Tween动画,这样的实现方式能够使视图组件移动、放大、缩小以及产生透明度的变化。另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
andriod提供了 Handler 和 Looper 来满足线程间的通信。
Handler 先进先出原则。
Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程能够产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
2)Handler: 你能够构造Handler对象来与Looper沟通,以便push新消息到Message Queue里。或者接收Looper从Message Queue取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。
MVC(Model_view_contraller)” 模型_视图_控制器”。 MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同一时候改变两者。仅仅要 Controller改变了Models的数据或者属性,全部依赖的View都会自己主动更新。类似的。仅仅要Controller改变了View,View会
从潜在的Model中获取数据来刷新自己。
View重绘和内存泄露的好像是面试常常问的问题
1. View的刷新:
在须要刷新的地方,使用handle.sendmessage发送信息,然后在handle的getmessage里面运行invaliate或者postinvaliate.
2. GC内存泄露
出现情况:
1.数据库的cursor没有关闭
2.构造adapter时,没有使用缓存contentview
衍生listview的优化问题-----降低创建view的对象,充分使用contentview,能够使用一静态类来优化处理getview的过程/
3.Bitmap对象不使用时採用recycle()释放内存
4.activity中的对象的生命周期大于activity
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]
还有其它问题,大家欢迎提出阿,能够是总体架构的,还有这个Hal层.
这篇文章会涉及到下面几个内容
一 Activity的生命周期
二 让Activity变成一个窗体:Activity属性设定
三 你后台的Activity被系统
回收怎么办:onSaveInstanceState
四 调用与被调用:我们的通信使者 - Intent
一 Activity的生命周期
和其它手机 平台 的应用程序一样。Android的应用程序的生命周期是被统一掌控的。也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它。仅仅能学习并适应它。
简单地说一下为什么是这样:我们手机在执行
一个应用程序的时候,有可能打进来电话发进来短信。或者没有电了。这时候程序都会被中断,优先去服务电话的基本功能,另外系统也不同意你占用太多资源。至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。
言归正传,Activity的基本生命周期例如以下代码所看到的:
Java 代码
1
public class MyActivity extends Activity
2
{
3
protected void onCreate(Bundle savedInstanceState);
4
protected void onStart();
5
protected void onResume();
6
protected void onPause();
7
protected void onStop();
8
protected void onDestroy();
9
}
你自己写的Activity会按须要
重 载这些方法,onCreate是免不了的,在一个Activity正常启动的过程中,他们被调用的顺序是 onCreate -> onStart ->onResume, 在Activity被干掉的时候顺序是onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,可是有人问了
。程序正执行着呢来电话了,这个程序咋办?中止了呗,假设中止的时候新出的一个Activity是全屏的那么:onPause->onStop 。恢复的时候onStart->onResume 。假设打断
这个应用程序的是一个Theme为Translucent 或者Dialog 的Activity那么仅仅是onPause ,恢复
的时候onResume 。
具体介绍一下这几个方法中系统在做什么以及我们应该做什么:
onCreate:
在这里创建界面。做一些数据的初始化工作
onStart:
到这一步变成用户可见不可交互的
onResume:
变成和用户可交互的,(在activity 栈系统通过栈的方式管理这些个Activity的最上面,执行完弹出栈,则回到上一个Activity)
onPause:
到 这一步是可见但不可交互的。系统会停止动画等消耗CPU 的事情从上文的描写叙述已经知道。应该在这里保存你的一些数据,由于这个时候你的程序的优先级减少,有可能被系统收回。在这里保存的数据。应该在 onResume里读出来,注意:这种方法里做的事情时间要短。由于下一个activity不会等到这种方法完毕才启动
onstop:
变得不可见,被下一个activity覆盖了
onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方法或者是系统为了节省空间将它临时性的干掉。能够用 isFinishing()来推断它,假设你有一个Progress Dialog在线程中转动,请在onDestroy里把他cancel掉。不然等线程结束的时候,调用Dialog的cancel方法会抛异常的。
onPause,onstop, onDestroy。三种状态下 activity都有可能被系统干掉为了保证程序的正确性。你要在onPause()里写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般 都是数据库)。实际工作中由于生命周期的变化而带来的问题也非常多,比方你的应用程序起了新的线程在跑,这时候中断了,你还要去维护那个线程,是暂停还是杀 掉还是数据回滚。是吧?由于Activity可能被杀掉,所以线程中使用的变量和一些界面元素就千万要注意了。一般我都是採用Android的消息机制 [Handler,Message]来处理多线程和界面交互的问题。这个我后面会讲一些,近期由于这些东西头已经非常大了,等我理清思绪再跟大家分享。
二 让Activity变成一个窗体:Activity属性设定
讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么非常 简单你仅仅须要设置一下Activity的主题就能够了在AndroidManifest.xml 中定义 Activity的地方一句话:
Xml代码
android
:theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"
这就使你的应用程序变成对话框的形式弹出来了,或者 Xml代码
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
就 变成半透明的。[友情提示-.-]类似的这样的activity的属性能够在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中全部元素的属性的介绍都能够參考这个类android.R.styleable
上面说的是属性名称,详细有什么值是在android.R.style中
能够看到,比方这个"@android:style/Theme.Dialog"就相应于android.R.style.Theme_Dialog ,('_'换成'.' <--注意:这个是文章内容不是笑脸)就能够用在描写叙述文件
中了,找找类定义和描写叙述文件里的相应关系就都明确了。
三 你后台的Activity被系统回收怎么办:onSaveInstanceState
当你的程序中某一个Activity A 在执行时中,主动或被动地执行还有一个新的Activity B 这个时候A会执行
Java代码
1
public void onSaveInstanceState(Bundle outState) {
2
super.onSaveInstanceState(outState);
3
outState.putLong("id", 1234567890);
4
}
5
public void onSaveInstanceState(Bundle outState) {
6
}
B 完毕以后又会来找A, 这个时候就有两种情况。一种是A被回收。一种是没有被回收。被回 收的A就要又一次调用onCreate()方法,不同于直接启动的是这回 onCreate()里是带上參数 savedInstanceState,没被收回的就还是onResume就好了。
savedInstanceState是一个Bundle对象。你基本上能够把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,假设正常启动onCreate就不会有它,所以用的时候要推断一下是否为空。
Java代码
1
if(savedInstanceState !=null){
2
long id =savedInstanceState.getLong("id");
3
}
4
if(savedInstanceState !=null){}
就像官方的Notepad教程
里的情况。你正在编辑某一个note,突然被中断,那么就把这个note的id记住。再起来的时候就能够依据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不须要保存什么,比方你的界面就是读取一个列表。那就不须要特殊记住什么,哦,
没准你须要记住滚动栏的位置...
四 调用与被调用:我们的通信使者Intent
要 说Intent了,Intent就是这个这个意图,应用程序间Intent进行交流,打个电话啦,来个电话啦都会发Intent, 这个是Android架构的松耦合的精髓部分,大大提高了组件的复用性,比方你要在你的应用程序中点击button,给某人打电话,非常easy啊。看下代码先:
Java代码 :
1
Intent intent = new Intent();
2
intent.setAction(Intent.ACTION_CALL);
3
intent.setData(Uri.parse("tel:"+ number));
4
startActivity(intent);
扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。
什么读联系人,发短信啊,邮件啊,统统仅仅须要扔出intent就好了。这个部分设计地确实非常好啊。
那Intent通过什么来告诉系统须要谁来接受他呢?
通常使用Intent有两种方法。第一种是直接说明须要哪一个类来接收代码例如以下:
Java代码
1
Intent intent = new Intent(this,MyActivity.class);
2
intent.getExtras().putString("id","1");
3
startActivity(intent);
4
Intent intent = new Intent(this,MyActivity.class);intent.getExtras().putString("id","1");
5
startActivity(intent);
第一种方式非常明显,直接指定了MyActivity为接受者,而且传了一些数据给MyActivity。在MyActivity里能够用getIntent()来的到这个intent和数据。
另外一种就须要先看一下AndroidMenifest中的intentfilter的配置了
Xml代码
01
<intent-filter>
02
<action android:name="android.intent.action.VIEW" />
03
<action android:value="android.intent.action.EDIT" />
04
<action android:value="android.intent.action.PICK" />
05
<category android:name="android.intent.category.DEFAULT"/>
06
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
07
</intent-filter>
08
<intent-filter>
09
<action android:name="android.intent.action.VIEW"/>
10
<action android:value="android.intent.action.EDIT" />
11
<action android:value="android.intent.action.PICK" />
12
<category android:name="android.intent.category.DEFAULT" />
13
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
14
</intent-filter>
这里面配置用到了action, data, category这些东西。那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗?
action事实上就是一个意图的字符串名称。
上 面这段intent-filter的配置文件说明了这个Activity能够接受不同的 Action。当然对应的程序逻辑也不一样咯,提一下那个 mimeType,他是在
ContentProvider里定义的。你要是自己实现一个ContentProvider就知道了,必须指定 mimeType才干让数据被别人使用。
不知道原理说明确没,总结一句。就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面。这样就多么松藕合啊,并且符合了生命周期被系统管理的原则。
想知道category都有啥,Android为你预先定制好的action都有啥等等。请亲自訪问官方链接Intent
ps:想知道怎么调用系统应用程序的同学。能够细致看一下你的logcat。每次执行一个程序的时候是不是有一些信息比方:
Starting activity: Intent {action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} }
再对比一下Intent的一些set方法,就知道怎么调用咯,希望你喜欢:)
一。listview你是怎么优化的。
二,view的刷新,之前说过
三。IPC及原理
四,Android多线程
五,Android为什么要设计4大组件,他们之间的联系,不设计行不行(主要是为了实现MVC模式,然而java中最难的模式也是这个,非常少有产品能将这个模式做得非常好【Technicolor的面试官问的这个】)
六。service的周期。activity的周期。谈下你对Android内部应用的了解。比方他做电话,以及联系人等等应用。框架层有非常多东西还是多看看,熟悉Android怎么做的,无论你做应用程开发还是应用框架层开发非常有优点的。
在就是你项目经验,突出你遇到什么难点,然后是怎么解决的!尽量将每一个技术点凸显出来。当然面试官有时候会为了体现你是否真正做过。他会问你。你在这个应用中做那个模块,用了多少个类之类的问题。
偶尔有的面试官会问你,你用过Android自带的单元測试了没,怎么用的?
当然我面试过非常多家单位,有的是做平板。手机,数字电视,有的是做出个erp之类的client等等。出于前面的三个,基本上都是将Android的所有改掉,假设真正要做Android的话,大家要学的还非常多。
总 之,一句话,什么样的面试官都有,去面试的时候要做好一切心理准备,无论是技术还是基础都得扎实。
一个人的交谈能力也很重要。总之不是很标准的普通话, 最起码你说的得让别人听得懂,并且得把面试官讲得很彻底。这样你获得offer的机会更大。谈工资也有优势~~当然以前一家公司的面试官跟我说过,技术 是不惜钱的,仅仅要你有能力,多少钱他都请。
1.View怎样刷新?
View 能够调用invalidate()和postInvalidate()这两个方法刷新
希望,我们共同进步,找到自己梦想的公司:
1.android dvm 的进程和Linux的进程,应用程序的进程是否为同一个概念:
所以说能够觉得是同一个概念。
tween动画,这样的实现方式能够使视图组件移动,放大或缩小以及产生透明度的变化。frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
我感觉最要紧的是分清:多线程和双缓冲的使用情况。
系统会自己主动调用 View的onDraw()方法。
强行訪问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the originalthread that created a view hierarchy can touch its views.
因为实现SurfaceHolder.Callback接口,新线程就不须要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法能够锁定画布。绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比較方便得。
在这里保存的数据,应该在
这个仅仅须要在设置下Activity的主题theme,即在Manifest.xml定义Activity的地方加一句:
假设是作半透明的效果:
能处理哪些类型的数据?
Intent intent = new Intent();
intent.setClassName(“com.android.browser”,”com.android.browser.BrowserActivity”);
因此。在程序里对响应性能的设计非常重要,这样,系统不会显示ANR给用户。
android应用程序一般是执行在一个单独的线程(比如:main)里。这就意味你的应用程序所做的事情假设在主线程里占用了大长时间的话,就会引发ANR对话框,由于你的应用程序并没有给自己机会来处理输入事件或者Intent广播。
特别是,activity应该在它的关键生命周期方法(onCreate()和onResume())里尽可能少的去作创建操作。
潜在的耗时操作,比如网络或数据库操作。或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例。通过异步请求的方式)来完毕。然而,不是说你的主线程堵塞在那里等待子线程的完毕---也不是调用Thread.wait()或者Thread.sleep()。
替代的方法是:主线程应该为子线程提供一个Handler,以便完毕时可以提交给主线程。
以这样的方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由5秒输入事件的超时引发的ANR对话框。
这样的做法应该在其他显示UI的线程里效仿,由于它们都受同样的超时影响。
和在主线程里调用的其他方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但也不是在子线程里做这些任务(由于BroadcastReceiver的生命周期短),替代的是,假设响应Intent广播须要运行一个耗时的动作的话。应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity,由于它会创建一个新的画面,并从当前用户正在执行的程序上抢夺焦点。假设你的应用程序在响应Intent广播时须要向用户展示什么,你应该使用Notification Manager来实现。
特别是游戏。在子线程里做移动的计算。
假设你的程序有一个耗时的初始化过程的话,考虑能够显示一个Splash Screen或者高速显示主画面并异步来填充这些信息。
在这两种情况下,你都应该显示正在进行的进度,以免用户觉得程序被冻结了。
全部在res aw文件夹中的文件不会被压缩。这样能够直接提取该文件夹中的文件。能够将.db文件拷贝到res aw文件夹中
复制的基本方法是使用getResources().openRawResource方法获得res aw文件夹中资源的 InputStream对象,然后将该InputStream对象中的数据写入其它的文件夹中对应文件里。在Android SDK中能够使用SQLiteDatabase.openOrCreateDatabase方法来打开随意文件夹中的SQLite数据库文件。
而DOM方式会把整个XML文件载入到内存 中去,这里Android开发网提醒大家该方法在查找方面能够和XPath非常好的结合假设数据量不是非常大推荐使用,而PULL经常常使用在J2ME对于节点处 理比較好。类似SAX方式。相同非常节省内存。在J2ME中我们经常使用的KXML库来解析。
23.Activity 与 Task的启动模式有哪些。它们含义详细是什么?
假设不位于栈顶,会产生一个新的实例。
首先须要重写Application,主要重写里面的onCreate方法,就是创建的时候。初始化变量的值。然后在整个应用中的各个文件里就能够对该变量进行操作了。
启动Application时。系统会创建一个PID,即进程ID。全部的Activity就会在此进程上执行。那么我们在Application创建的时候初始化全局变量,同一个应用的全部Activity都能够取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其它Activity中值就会改变
由于在这样的情况下。用户的行为决定了不须要保存Activity的状态。通常onSaveInstanceState()仅仅适合用于保存一些暂时性的状态。而onPause()适合用于数据的持久化保存。
onStart() 仅仅有採用Context.startService()方法启动服务时才会回调该方法。该方法在服务開始执行时被调用。
多次调用startService()方法虽然不会多次创建服务,但onStart() 方法会被多次调用。
onDestroy()该方法在服务被终止时调用。
2)与採用Context.bindService()方法启动服务有关的生命周期方法
onCreate() -> onBind() -> onUnbind() -> onDestroy()
onUnbind()仅仅有採用Context.bindService()方法启动服务时才会回调该方法。
该方法在调用者与服务解除绑定时被调用。
假设先採用startService()方法启动服务,然后调用bindService()方法绑定到服务。再调用unbindService()方法解除绑定。最后调用bindService()方法再次绑定到服务。触发的生命周期方法例如以下:
onCreate() ->onStart() ->onBind() ->onUnbind()[重载后的方法需返回true] ->onRebind()
void onReceive(Context curContext, Intent broadcastMsg)
当接收器接收到一条broadcast消息,Android就会调用onReceiver(),并传递给它一个Intent对象,这个对象携带着那条broadcast消息。我们觉得仅当运行这个方式时。Broadcast receiver是活动的;这种方法返回时,它就终止了。这就是Broadcast receiver的生命周期。
2)因为Broadcast receiver的生命周期非常短,一个带有活动的Broadcast receiver的进程是受保护的,以避免被干掉;可是别忘了有一点,Android会在随意时刻干掉那些携带不再活动的组件的进程。所以非常可能会造成这个问题。
3)解决上述问题的方案採用一个Service来完毕这项工作,Android会觉得那个进程中(Service所在的进程)仍然有在活动的组件。
SurfaceView和View最本质的差别在于。surfaceView是在一个新起的单独线程中能够又一次绘制画面而View必须在UI的主线程中更新画面。
那么在UI的主线程中更新画面 可能会引发问题,比方你更新画面的时间过长,那么你的主UI线程会被你正在画的函数堵塞。那么将无法响应按键。触屏等消息。
当使用surfaceView 由于是在新的线程中更新画面所以不会堵塞你的UI主线程。
但这也带来了另外一个问题,就是事件同步。比方你触屏了一下,你须要surfaceView中thread处理。一般就须要有一个event queue的设计来保存touch event,这会稍稍复杂一点。由于涉及到线程同步。
由于这样的情况下,这一次Touch和下一次的Touch须要的时间比較长些,不会产生影响。
能够将dictionary.db文件拷贝到res aw文件夹中
android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构。它们之间有时候是一种相互依存的关系。有时候又是一种补充关系,引入广播机制能够方便几大组件的信息和数据交互。
可是。对于多 Activity 的应用来说,在打开多个 Activity 后。假设想在最后打开的 Activity 直接退出,上边的方法都是没实用的,由于上边的方法都是结束一个 Activity 而已。 当然,网上也有人说能够。 就好像有人问, 在应用里怎样捕获 Home 键, 有人就会说用 keyCode 比較 KEYCODE_HOME 就可以,而其实假设不改动 framework。根本不可能做到这一点一样。 所以。不妨自己亲自试一下。
那么。有没有办法直接退出整个应用呢? 在 2.1 之前。能够使用 ActivityManager 的 restartPackage 方法。
它能够直接结束整个应用。
在使用时须要权限 ndroid.permission.RESTART_PACKAGES。 注意不要被它的名字迷惑。
在 2.2 加入了一个新的方法。killBackgroundProcesses()。须要权限 android.permission.KILL_BACKGROUND_PROCESSES。 可惜的是。它和 2.2 的 restartPackage 一样。根本起不到应有的效果。
另外另一个方法,就是系统自带的应用程序管理里,强制结束程序的方法, forceStopPackage()。
它须要权限 android.permission.FORCE_STOP_PACKAGES。 而且须要加入 android:sharedUserId="android.uid.system"属性 相同可惜的是,该方法是非公开的。他仅仅能执行在系统进程,第三方程序无法调用。
由于须要在 Android.mk 中加入 LOCAL_CERTIFICATE := platform。
而 Android.mk 是用于在 Android 源代码下编译程序用的。
从以上能够看出。在 2.2,没有办法直接结束一个应用。而仅仅能用自己的办法间接办到。
在须要退出时,关闭每个 Activity 就可以。
可是这样做相同不完美。
你会发现,假设自己的应用程序对每个 Activity 都设置了 nosensor,在两个 Activity 结束 的间隙。sensor 可能有效了。 但至少。我们的目的达到了,并且没有影响用户使用。
步骤 第一步:继承 Service 类 public class SMSService extends Service { }
Context.startService()和 Context.bindService 服务不能自己执行,须要通过调用 Context.startService()或 Context.bindService()方法启动服 务。这两个方法都可 以启动 Service。可是它们的使用场合有所不同。
假设调用 startService()方法前服务已经被创建, 多次调用 startService() 方法并 不会导致多次创建服务。但会导致多次调用 onStart()方法。 採用 startService()方法启动的服务。仅仅能调用 Context.stopService()方法结束服务,服务结束 时会调用 onDestroy()方法。
2. Context.startService()启动 Service 有关的生命周期方法 onStart() 仅仅有採用 Context.startService()方法启动服务时才会回调该方法。
该方法在服务开 始执行时被调用。 多次调用 startService()方法虽然不会多次创建服务,但 onStart() 方法会被多次调用。 3. Context.bindService()启动 Service 有关的生命周期方法 onBind()仅仅有採用 Context.bindService()方法启动服务时才会回调该方法。
该方法在调用者与 服务绑定时被调用, 当调用者与服务已经绑定。多次调用 Context.bindService()方法并不会导致该方法被多次调 用。
onUnbind()仅仅有採用 Context.bindService()方法启动服务时才会回调该方法。
该方法在调用者 与服务解除绑定时被调用。 备注: 1. 採用 startService()启动服务 Intent intent = new Intent(DemoActivity.this, DemoService.class); startService(intent); 2.Context.bindService()启动 Intent intent = new Intent(DemoActivity.this, DemoService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE); //unbindService(conn);//解除绑定
1.对多线程的运用和理解,及多线程之间handle的传值。
2.对android虚拟机的理解,包含内存管理机制垃圾回收机制。
3.framework工作方式及原理,Activity是怎样生成一个view的。机制是什么。
4.android本身的一些限制,比方apk包限制大小,读取大文件时的时间限制。
5.ANR是什么?哪些情况下会发生?开发时怎样寻找ANR?
ANR,Application not respons,我个人觉得就是在UI线程进行耗时操作所造成的。Android的Activity反应时间是5秒,BroadCast是10秒。所以尽量不要做耗时的操作。
开发的时候假设遇到了ANR,就看你操作的地方是否进行了耗时操作。是否在UI线程进行了耗时的网络请求或者I/O操作,避免这些就OK了。
还有String,StringBuilder,StringBuffer这3个的差别。
都有必要好好看看。
列个表,大家能够依照以下的去学习。不要一下看完,你看完也没用,你没有深入理解。每三天学一种,半年后,我认为你应该会进步非常多。
然后能够看看“编程之美”等算法书,应该会有较大的提高。
、hash表、双端队列、位图(bitmap)
其他:并查集
常见算法
1)基本思想:枚举,递归。分治。模拟,贪心。动态规划,剪枝,回溯
2)图算法:深度优先遍历与广度优先遍历,最短路径。最小生成树。拓扑排序
3)字符串算法:字符串查找,hash算法,KMP算法
4)排序算法:冒泡、快排、桶排序
5)动态规划:背包问题。最长公共子序列,最优二分检索树
6)数论问题:素数问题,整数问题,进制转换。同余模运算
7)排列组合:排序和组合算法
8)其他:LCA与RMQ问题
会是你的加分点。所以,系统而且深入的学习一下就很有必要了。