http://blog.csdn.net/z516518/article/details/6776376

1. 什么是Activity?

四大组件之一,一般的,一个用户交互界面对应一个activity, activity 是Context的子类,同时实现了window.callback和keyevent.callback, 可以处理与窗体用户交互的事件. 我开发常用的的有ListActivity  ,PreferenceActivity 等…如果界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity.

2.Activity 之间的交互

一是两个Activity之间的跳转,二是两个Activity的传值。

首先是不同Activity之间的跳转。在一个Activity类里面可以通过“ startActivity(intent) ”来完成跳转到另外一个Activity。我们重点要关注的就是里面的intent参数。Intent用于应用程序之间的交互和通讯,它不仅能够支持同一个程序里面的通讯还能和其他应用程序之间交互通讯。比如通过它可以直接启动浏览器到某个网页,启动打电话界面,启动发短信界面等等。我们这里讨论的只是用于同一程序内部的不同activity的跳转。instent使用起来也比较简单,看代码:

Intent intent = new Intent();

intent.setClass(ActivityMain.this,Activity2.class);

startActivity(intent);

setclass方法里面的第一个参数当前类的实例,第二个参数是你要跳转到的Activity类。然后通过startActivity启动跳转(完整的代码在下面会放出,有兴趣的可以下载运行看看)。

接着我们看看如何在不同的Activity传值。同样还是通过instent这个类。它里面有个putExtra方法,可以通过键值对的方式附加信息到instent上,然后另个activity就可以通过类似intent.getStringExtra(键名)来获取传过来的值了(不仅仅是string类型,其他类型大家可以自己试试)。上图中的123字符串就是通过这种方式由前面的activity传递过去的!当然我也是刚刚才接触这个不久,不知道android里面还有没有其他的方式,还需要再慢慢学习了

3.请描述一下Activity生命周期。

生命周期描述的是一个类从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法..

在这个过程中会针对不同的生命阶段会调用不同的方法

Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:oncreate ondestroy onstop onstart onresumeonpause

其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;

onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;

这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在什么时候调用呢?

答案就是:在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;

如果被onDestroy了,则是调用onCreate方法。

最后讲自己项目中的经验,比如说豆瓣客户端每次进入某个界面的时候要刷新列表,这个刷新列表的操作 就放在onStart()的方法里面.这样保证每次用户看到的数据都是最新的.

在读文档的时候还发现 activity还有两个方法 onPostResume() 和 OnPostCreate()这两个生命周期的方法,不过开发的时候没有用到过.

4.两个Activity之间跳转时必然会执行的是哪几个方法。

一般情况比如说有两个activity,分别叫A,B ,当在A里面激活B组件的时候, A 会调用onPause()方法,然后B 调用onCreate() ,onStart(), OnResume() , 这个时候B覆盖了窗体, A会调用onStop()方法.  如果B呢 是个透明的,或者是对话框的样式, 就不会调用onStop()方法

5.横竖屏切换时候Activity的生命周期。

这个生命周期跟清单文件里的配置有关系

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期

2、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

总结一下整个Activity的生命周期

补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变

Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState--> onPause --> onStop      onRestart -->onStart--->onResume

Activity未被完全覆盖只是失去焦点:onPause--->onResume

6. 如何将一个Activity设置成窗口的样式。

答:在AndroidManifest.xml中在你需要显示为窗口的activity中添加如果属性:android:theme="@style/Theme.FloatActivity"即可

如果说您觉得新建style.xml及float_box.xml文件的方式麻烦或者只想Test一下,那么可以直接添加您对应需要展示为 Dialog style的Activity的android:theme属性值为 android:theme="@android:style/Theme.Dialog"。

7.你后台的Activity被系统回收怎么办?如果后台的Activity由于某原因被系统回收可了,如何在被系统回收之前保存当前状态?

除了在栈顶的activity,其他的activity都有可能在内存不足的时候被系统回收,一个activity越处于栈底,被回收的可能性越大.

protected void onSaveInstanceState(BundleoutState) {

super.onSaveInstanceState(outState);

outState.putLong("id",1234567890);

}

public void onCreate(BundlesavedInstanceState) {

//判断 savedInstanceState是不是空.

//如果不为空就取出来

super.onCreate(savedInstanceState);

}

8.如何退出Activity?如何安全退出已调用多个Activity的Application?

1、抛异常强制退出:

该方法通过抛异常,使程序Force Close。

验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity:

每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播:

在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

4、递归退出

在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

上面是网上的一些做法.

其实 可以通过 intent的flag 来实现..intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity,然后在新的activity的oncreate方法里面 finish掉.

讲一讲你对activity的理解

把上面的几点用自己的心得写出来

9.service是否在main thread中执行, service里面是否能执行耗时的操作?

默认情况,如果没有显示的指定service所运行的进程, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面

10.两个Activity之间怎么传递数据?

基本数据类型可以通过.  Intent 传递数据

Application 全局里面存放 对象 , 每个activity都可以取到

让对象实现 implements  Serializable 接口把对象存放到文件上.

11.怎么让在启动一个Activity是就启动一个service?

在activity的onCreate()方法里面 startService();

12.同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?

比方说在激活一个新的activity时候, 给intent设置flag

Intent的flag添加FLAG_ACTIVITY_NEW_TASK

这个被激活的activity就会在新的task栈里面…

13. 什么样的任务堆栈接受要启动的activity。

在standard和singleTop模式,除非是使用FLAG_ACTIVITY_NEW_TASK标志位,否则要启动的activity总是在启动它们的堆栈中。singleTask和singleInstance模式一旦存在了一个堆栈中,就不再运行在其他堆栈。

2.是否可以有多个实例。

standard和singleTop模式,可以有多个实例,可以多个实例分属多个任务堆栈,也可以在一个任务堆栈中有多个实例。singleTask和singleInstance模式只有一个实例。

3)是否同意有其他的activity实例在他们的任务堆栈中

singleInstance模式一直保持只有自己一个activity在它的任务堆栈中。如果它启动了其他activity,那个activity在其

他的堆栈中,不管是否加了FLAG_ACTIVITY_NEW_TASK标志。其他方面singleInstance和singleTask相同。

其余的三种模式可以允许在自己的堆栈中有多个activity。singleTask模式一直保持着自己是这个任务堆栈的根activity(最底部,不过没有验证到它一直在最底部)。

4)当被Intent启动时,是否会生成一个新实例。

Standard模式会每次都生成一个新实例。每个实例对应一个Intent。

singleTop模式:如果要启动的activity在目标堆栈的顶部,就不新实例化使用现有的activity(但这个会触发onNewIntent(Intent intent)事件)。如果不在顶部,那么就新实例化一个放在堆栈顶部。

"singleTask" 和"singleInstance"模式,不生成新的实例来处理Intent。 "singleInstance"模式一直在它自己的Task堆栈中,所以它一直在堆栈的顶部,它一直能响应到新的Intent。但是 singleTask模式,允许别的activity在它的堆栈里,如果它在堆栈的顶部,他就可以响应新到的Intent。如果它不在堆栈的顶部,那么新

到的Intent会调用失败,虽然会调用失败但是singleTask模式所在得堆栈还是会被整体调到前台。

注意:1.当已存在的activity去响应新的Intent的时候,不实例化新的activity,但现有的activity的onNewIntent()方法会被调用。要找回最初启动它的Intent可以用getIntent()

方法。

2.如果没有实例化一个新的activity,点返回键,多个任务堆栈都会更改状态。比如A-B-C,C启动了D,在和另外一个堆栈E-F-D共享一个D,点返回键结束D,变成A-B-C和E-F。

Clearing the stack

如果用户离开一个任务堆栈很长时间,系统会自动清除所有的activity,除了根activity。当用户返回的时候,就像用户自己不用了该任务堆栈一

样,只有最开始的activity呈现出来。这样做的思想是:很长时间以后用户会忘记之前他打开这个任务堆栈做什么的了,再返回的时候,是去开始做其他事

情了。这是默认行为,但也有一些属性会改变默认行为。

alwaysRetainTaskState属性:

如果一个任务堆栈的跟activity设置这个属性是TRUE,那么在这个任务堆栈中的所有activity会被保留,不会在很长时间以后自动清除。

clearTaskOnLaunch属性:

和alwaysRetainTaskState属性相反,如果这个属性设置成TRUE,不保持任务堆栈的状态,每当用户点击程序运行,都会把任务堆栈全部清空再重新开始(经验证:跟activity也会被清空,清空后新运行的任务堆栈ID不变。)

finishOnTaskLaunch属性:

和clearTaskOnLaunch一样,不过这个属性是作用在单独的activity上不是整个任务堆栈上。

当这个任务堆栈再次运行的时候,finishOnTaskLaunch设置成TRUE的activity会被清除,其他activity保持不变。

另一种强行清除activity的方法是在Intent中加上FLAG_ACTIVITY_CLEAR_TOP标志,目标堆栈如果存在Intent将要启

动的activity,那么目标堆栈在这个activity之上的activity都会被清除。如果这个activity的运行模式是“standard”,它本身也会被清除,再重新构造一个这个activity的新实例来响应Intent。因为“standard”模式总是构造一个新

的实例来响应新的intent。

Starting tasks

一个activity使用android.intent.action.MAIN和android.intent.category.LAUNCHER的 IntentFilters来表示它是一个任务的入口。这样,在程序运行管理器会建立这个任务的图标。这代表了2点:1,用户可以通过它运行任务2,在一段时间以后,

用户可以返回它。

重要的是第2点。用户必须能够离开和返回任务。因此,singleInstance和singleTask应该和MAIN,LAUNCHER过滤器一起使用,因为这两种模式的activity总是初始化一个任务。假设,如果没有MAIN,LAUNCHER过滤器,还使用了singleTask模式的activity开始了一个新任务,用户在这个任务上操作了一些东西,然后点了home键,任务现在被调到了后台看不到了。但是它又不能在程序运行管理器中启动这个任务,用户没办法回到这任务了。

需要同样小心的是FLAG_ACTIVITY_NEW_TASK标志。使用这个标志开启了一个新任务用户点home离开的时候要保证有一种导向让用户可以

从新回到这个任务。一些实体总是开始新的任务比如notification manager。notification manager总是加带FLAG_ACTIVITY_NEW_TASK标志去启动activity。如果你有一个activity使用这个标志区调用一个

外部的任务,注意用户有一个独立的途径返回到这个任务。

你不想让用户启动一个程序的时候看到一个activity,可以使用finishOnTaskLaunch标志)

14.什么是Service以及描述下它的生命周期。Service有哪些启动方法,有什么区别,怎样停用Service?

在Service的生命周期中,被回调的方法比Activity少一些,只有onCreate, onStart, onDestroy,onBind和onUnbind。

通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1 通过startService

Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。

如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。

2 通过bindService

Service会运行onCreate,然后是调用onBind, 这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。

所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbindonUnbind->onDestroyed方法。

需要注意的是如果这几个方法交织在一起的话,会出现什么情况呢?

一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又bindService,Service只被创建一次。

如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。

如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就stop不掉了,只能先UnbindService, 再StopService。

如果一个service通过startService 被start之后,多次调用startService 的话,service会多次调用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。

如果一个service通过bindService被start之后,多次调用bindService的话,service只会调用一次onBind方法。多次调用unbindService的话会出异常。

15.不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?

这个问题问的很山寨.默认不做任何处理,B里面的音乐都能播放.

遇到问题, 可以随机应变,灵活发挥,多考虑些细节,比如说这个题就可以这样说,说说你对startActivityForResult的理解()

A开启B的时候,用startActivityForResult()方法, B返回的时候把播放的状态信息返回给A ,A继续播放音乐.

16.什么是IntentService?有何优点?

Sdk给我们提供的方便的,带有异步处理的service类,

OnHandleIntent() 处理耗时的操作

17.什么时候使用Service?

拥有service的进程具有较高的优先级

官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。

1. 如果service正在调用onCreate,onStartCommand或者onDestory方法,那么用于当前service的进程则变为前台进程以避免被killed。

2. 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.

3. 如果客户端已经连接到service (bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。

4. 如果service可以使用startForeground(int,Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。

如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。

1.Service的特点可以让他在后台一直运行,可以在service里面创建线程去完成耗时的操作.

2.Broadcast receiver捕获到一个事件之后,可以起一个service来完成一个耗时的操作.

3.远程的service如果被启动起来,可以被多次bind, 但不会重新create.  索爱手机X10i的人脸识别的service可以被图库使用,可以被摄像机,照相机等程序使用.

18.请描述一下Intent 和 Intent Filter。

Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封Email,其中不仅应该包含收件地址,还可以包含具体的内容。对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项。

通过Intent 可以实现各种系统组件的调用与激活.

Intent filter: 可以理解为邮局或者是一个信笺的分拣系统…

这个分拣系统通过3个参数来识别

Action: 动作

Data: 数据uri

Category : 数据类型

Action 匹配

Action 是一个用户定义的字符串,用于描述一个 Android 应用程序组件,一个 Intent Filter 可以包含多个 Action。在 AndroidManifest.xml 的 Activity 定义时可以在其 <intent-filter >节点指定一个 Action 列表用于标示 Activity 所能接受的“动作”,例如:

<intent-filter>

<actionandroid:name="android.intent.action.MAIN" />

<actionandroid:name="cn.itcast.action" />

……

</intent-filter>

如果我们在启动一个Activity 时使用这样的Intent 对象:

Intent intent =newIntent();

intent.setAction("cn.itcast");

那么所有的Action 列表中包含了“cn.itcast”的 Activity 都将会匹配成功。

Android 预定义了一系列的 Action 分别表示特定的系统动作。这些 Action 通过常量的方式定义在 android.content. Intent中,以“ACTION_”开头。我们可以在 Android 提供的文档中找到它们的详细说明。

URI 数据匹配

一个 Intent 可以通过 URI 携带外部数据给目标组件。在 <intent-filter >节点中,通过 <data/>节点匹配外部数据。

mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。如下:

<dataandroid:mimeType="mimeType" android:scheme="scheme"

android:host="host"android:port="port" android:path="path"/>

电话的uri  tel://12345

自己定义的uri itcast://cn.itcast/person/10

如果在 Intent Filter 中指定了这些属性,那么只有所有的属性都匹配成功时 URI 数据匹配才会成功。

Category 类别匹配

<intent-filter >节点中可以为组件定义一个 Category 类别列表,当 Intent 中包含这个列表的所有项目时 Category 类别匹配才会成功。

默认是DEFAULT

23.请介绍下ContentProvider是如何实现数据共享的。

把自己的数据通过uri的形式共享出去

需要去实现一个类去继承ContentProvider

public classPersonContentProvider extends ContentProvider{

public boolean onCreate(){

//..

}

query(Uri, String[], String, String[], String)

insert(Uri, ContentValues)

update(Uri, ContentValues, String, String[])

delete(Uri, String, String[])

}

24.请介绍下Android的数据存储方式。

文件

数据库

SharedPreference

网络

25.为什么要用ContentProvider?它和sql的实现上有什么差别?

屏蔽数据存储的细节,对用户透明,用户只需要关心操作数据的uri就可以了

不同app之间共享,操作数据

Sql也有增删改查的方法.

但是contentprovider还可以去增删改查本地文件.

26.请介绍下Android中常用的五种布局。

FrameLayout(框架布局),LinearLayout(线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)

27.谈谈UI中, Padding和Margin有什么区别?

Padding 文字对边框, margin是控件对父窗体.

28.widget相对位置的完成在antivity的哪个生命周期阶段实现。

这个题没看懂…widget可以理解成桌面小空间, 也可以理解成 某个button,imageview这样的控件…

29.请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。

用handler机制的原理来回答
 
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)Message:消息的类型 ,在Handler类中的HandlerMessage方法中得到单个的消息进行处理

5)线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。

30.AIDL的全称是什么?如何工作?

Android interface definition language (android接口定义语言) , 用来跨进程的访问方法,

31.请解释下Android程序运行时权限与文件系统权限的区别。

Android程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 打电话,访问网络,获取坐标,读写sd卡,读写联系人等..安装的时候会提示用户…

文件系统的权限是linux权限. 比如说sharedpreference里面的Context.Mode.private  Context.Mode.world_read_able  Context.Mode_world_writeable

32.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?

找到对应的浏览器的意图,传递数据URI , 激活这个意图

33.对android主线程的运用和理解。

主ui线程不能执行耗时的操作,

34.对android虚拟机的理解,包括内存管理机制垃圾回收机制。

虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M , 谈谈加载图片的时候怎么处理大图片的,

垃圾回收,没有引用的对象,在某个时刻会被系统gc掉.

35.Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。

可以讲下activity的源码,比如说每个activity里面都有window.callback和keyevent.callback,一些回调的接口或者函数吧. 框架把activity创建出来就会调用里面的这些回调方法,会调用activity生命周期相关的方法.

Activity创建一个view是通过 ondraw 画出来的,画这个view之前呢,还会调用onmeasure方法来计算显示的大小.

37.如何加载的音乐信息,如何改善其效率。

Android提供mediascanner,mediaStore等接口, 音乐文件的信息都会存放到系统的数据库表中,可以通过content provider获取,显示出来,改善效率,是个常见问题, 可以从以下几个方面作答,分批加载数据, 延时加载数据, 合理使用缓存等...

38.ListView如何提高其效率?

复用convertview, 异步加载数据,分页加载数据,使用静态的view对象 避免创建过多的view.

40.启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?

区别是根据activity在manifest里面的配置,这个activity可能会放在不同的task栈里面

41.Android程序与Java程序的区别?

Android程序用android sdk开发,java程序用javasdk开发.

Android SDK引用了大部分的Java SDK,少数部分被AndroidSDK抛弃,比如说界面部分,java.awt package除了java.awt.font被引用外,其他都被抛弃,在Android平台开发中不能使用。将Java 游戏或者j2me程序移植到Android平台的过程中,Android  SDK与Java SDK的区别是很需要注意的地方。

42.Android中Task任务栈的分配。

首先我们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences as an "application."It's a group of related activities, arranged in a stack. A task is a stack ofactivities, not a class or an element in the manifest file. 这意思就是说Task实际上是一个Activity栈,通常用户感受的一个Application就是一个Task。从这个定义来看,Task跟Service或者其他Components是没有任何联系的,它只是针对Activity而言的。

Activity有不同的启动模式, 可以影响到task的分配

Task,简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。它们有潜在的前后驱关联,新加入的Activity组件,位于栈顶,并仅有在栈顶的Activity,才会有机会与用户进行交互。而当栈顶的Activity完成使命退出的时候,Task会将其退栈,并让下一个将跑到栈顶的Activity来于用户面对面,直至栈中再无更多Activity,Task结束。

事件

Task栈(粗体为栈顶组件)

点开Email应用,进入收件箱(Activity A)

A

选中一封邮件,点击查看详情(Activity B)

AB

点击回复,开始写新邮件(Activity C)

ABC

写了几行字,点击选择联系人,进入选择联系人界面(Activity D)

ABCD

选择好了联系人,继续写邮件

ABC

写好邮件,发送完成,回到原始邮件

AB

点击返回,回到收件箱

A

退出Email程序

null

如上表所示,是一个实例。从用户从进入邮箱开始,到回复完成,退出应用整个过程的Task栈变化。这是一个标准的栈模式,对于大部分的状况,这样的Task模型,足以应付,但是,涉及到实际的性能、开销等问题,就会变得残酷许多。比如,启动一个浏览器,在Android中是一个比较沉重的过程,它需要做很多初始化的工作,并且会有不小的内存开销。但与此同时,用浏览器打开一些内容,又是一般应用都会有的一个需求。设想一下,如果同时有十个运行着的应用(就会对应着是多个Task),都需要启动浏览器,这将是一个多么残酷的场面,十个Task栈都堆积着很雷同的浏览器Activity,是多么华丽的一种浪费啊。于是你会有这样一种设想,浏览器Activity,可不可以作为一个单独的Task而存在,不管是来自那个Task的请求,浏览器的Task,都不会归并过去。这样,虽然浏览器Activity本身需要维系的状态更多了,但整体的开销将大大的减少,这种舍小家为大家的行为,还是很值得歌颂的

standard", "singleTop", "singleTask","singleInstance"。

standard模式,是默认的也是标准的Task模式,在没有其他因素的影响下,使用此模式的Activity,会构造一个Activity的实例,加入到调用者的Task栈中去,对于使用频度一般开销一般什么都一般的Activity而言,standard模式无疑是最合适的,因为它逻辑简单条理清晰,所以是默认的选择。

而singleTop模式,基本上于standard一致,仅在请求的Activity正好位于栈顶时,有所区别。此时,配置成singleTop的Activity,不再会构造新的实例加入到Task栈中,而是将新来的Intent发送到栈顶Activity中,栈顶的Activity可以通过重载onNewIntent来处理新的Intent(当然,也可以无视...)。这个模式,降低了位于栈顶时的一些重复开销,更避免了一些奇异的行为(想象一下,如果在栈顶连续几个都是同样的Activity,再一级级退出的时候,这是怎么样的用户体验...),很适合一些会有更新的列表Activity展示。一个活生生的实例是,在Android默认提供的应用中,浏览器(Browser)的书签Activity(BrowserBookmarkPage),就用的是singleTop。

singleTask,和singleInstance,则都采取的另辟Task的蹊径。标志为singleTask的Activity,最多仅有一个实例存在,并且,位于以它为根的Task中。所有对该Activity的请求,都会跳到该Activity的Task中展开进行。singleTask,很象概念中的单件模式,所有的修改都是基于一个实例,这通常用在构造成本很大,但切换成本较小的Activity中。最典型的例子,还是浏览器应用的主Activity(名为Browser...),它是展示当前tab,当前页面内容的窗口。它的构造成本大,但页面的切换还是较快的,于singleTask相配,还是挺天作之合的。

singleInstance显得更为极端一些。在大部分时候singleInstance与singleTask完全一致,唯一的不同在于,singleInstance的Activity,是它所在栈中仅有的一个Activity,如果涉及到的其他Activity,都移交到其他Task中进行。这使得singleInstance的Activity,像一座孤岛,彻底的黑盒,它不关注请求来自何方,也不计较后续由谁执行。在Android默认的各个应用中,很少有这样的Activity,在我个人的工程实践中,曾尝试在有道词典的快速取词Activity中采用过,是因为我觉得快速取词入口足够方便(从notification中点选进入),并且会在各个场合使用,应该做得完全独立。

43.在Android中,怎么节省内存的使用,怎么主动回收内存?

回收已经使用的资源,合理设置变量的作用范围…

System.gc();

44.不同工程中的方法是否可以相互调用?

可以,列举aidl访问远程服务的例子.

45.在Android中是如何实现判断区分通话记录中的电话状态,去电,来电、未接来电?

Day8 showAddressService.java

46.dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

Dvm是dalivk虚拟机,每个android程序都运行在自己的进程里面,每个android程序系统都会给他分配一个单独的uid, 每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.

48.如何判断是否有SD卡?

配置文件中有sd卡的权限, 通过environment的静态方法,

if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {

49.嵌入式操作系统内存管理有哪几种, 各有何特性。

页式,段式,段页,等…

50.什么是嵌入式实时操作系统, Android操作系统属于实时操作系统吗?

实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

51.一条最长的短信息约占多少byte?

中文70(包括标点),英文160,160个字节 这个说法不准确,要跟手机制式运营商等信息有关.

做实验,看源码

ArrayList<String> msgs =sms.divideMessage(message);

for(String msg : msgs) {

sms.sendTextMessage(phoneNumber, null, msg, pi, null);

}

52. Linux中跨进程通信的几种方式 。

# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

# 有名管道(named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。

# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

53.谈谈对Android NDK的理解。

1.什么时候用ndk,为什么用ndk,ndk的优点,缺点,我们项目中那些地方用到了ndk

54.谈谈Android的优点和不足之处。

1、开放性,开源

2、挣脱运营商束缚

3、丰富的硬件选择

4、不受任何限制的开发商

5、无缝结合的Google应用

缺点也有5处:

1、安全问题、隐私问题

2、卖手机的不是最大运营商

3、运营商对Android手机仍然有影响

4、山寨化严重

5、过分依赖开发商,缺乏标准配置

55.Android系统中GC什么情况下会出现内存泄露呢?

导致内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放。要确定对象所占内存将被回收,我们就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为null或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。

Java带垃圾回收的机制,为什么还会内存泄露呢?

Vector v = new Vector(10);

for (int i = 1; i < 100;i++)      {

 Object o = new Object();       

v.add(o);       

o = null;

}//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。

Java 内存泄露的根本原因就是保存了不可能再被访问的变量类型的引用

56.Android UI中的View如何刷新。

拿到view调用Invalide()方法,查看画画板里面更新imageview的方法

在子线程里面可以通过postInvalide()方法;

57.简单描述下Android 数字签名。

Android 数字签名

在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系

Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字证书并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。

同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。

(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。

(2)有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。

在签名时,需要考虑数字证书的有效期:

(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。

(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。

(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。

Android数字证书包含以下几个要点:

(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序

(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证

(3)如果要正式发布一个Android,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。

(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

58.什么是ANR 如何避免它?

在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。

59.android中的动画有哪几类,它们的特点和区别是什么?

两种,一种是Tween动画、还有一种是Frame动画。

Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;

可以通过布局文件,可以通过代码

1、   控制View的动画

a)  alpha(AlphaAnimation)

渐变透明

b)  scale(ScaleAnimation)

渐变尺寸伸缩

c)  translate(TranslateAnimation)

画面转换、位置移动

d)  rotate(RotateAnimation)

画面转移,旋转动画

2、 控制一个Layout里面子View的动画效果

a)  layoutAnimation(LayoutAnimationController)

b)  gridAnimation(GridLayoutAnimationController)

另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

62.说说mvc模式的原理,它在android中的运用。

MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。

Android中界面部分也采用了当前比较流行的MVC框架,在Android中M就是应用程序中二进制的数据,V就是用户的界面。Android的界面直接采用XML文件保存的,界面开发变的很方便。在Android中C也是很简单的,一个Activity可以有多个界面,只需要将视图的ID传递到setContentView(),就指定了以哪个视图模型显示数据。

在Android SDK中的数据绑定,也都是采用了与MVC框架类似的方法来显示数据。在控制层上将数据按照视图模型的要求(也就是Android SDK中的Adapter)封装就可以直接在视图模型上显示了,从而实现了数据绑定。比如显示Cursor中所有数据的ListActivity,其视图层就是一个ListView,将数据封装为ListAdapter,并传递给ListView,数据就在ListView中现实。

63.通过点击一个网页上的url 就可以完成程序的自动安装,描述下原理

64,Service和Activity在同一个线程吗

默认情况同一线程 main主线程 ui线程

65,java中的soft reference是个什么东西

StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收

SoftReference 会尽可能长的保留引用直到JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存

应用详细见豆瓣客户端图片的缓存

66,udp连接和TCP的不同之处

67,android开发中怎么去调试bug

逻辑错误

1.断点 debug

2. logcat ,

界面布局,显示 hierarchyviewer.bat,

68.service里面可以弹土司么

可以

69.写10个简单的linux命令

70JNI调用常用的两个参数

71.书写出android工程的目录结构

72.ddms 和traceview的区别.

73、简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver

  答:一个activity呈现了一个用户可以操作的可视化用户界面

  一个service不包含可见的用户界面,而是在后台无限地运行

  可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信

  一个broadcast receiver是一个接收广播消息并作出回应的component,broadcast receiver没有界面

  intent:content provider在接收到ContentResolver的请求时被激活。

  activity, service和broadcast receiver是被称为intents的异步消息激活的。

一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI

  Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。

  它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中声明的。

74、IntentService有何优点?

  答:IntentService 的好处

  * Acitivity的进程,当处理Intent的时候,会产生一个对应的Service

  * Android的进程处理器现在会尽可能的不kill掉你

  * 非常容易使用

android中跨进程通讯的4种方式

由于android系统中应用程序之间不能共享内存。因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些。在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操 作;Broadcast可以向android系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;Service和Content Provider类似,也可以访问其他应用程序中的数据,但不同的是,Content Provider返回的是Cursor对象,而Service返回的是Java对象,这种可以跨进程通讯的服务叫AIDL服务。

五、java虚拟机和android虚拟机的区别

Dalvik和标准Java虚拟机(JVM)之间的首要差别之一,就是Dalvik基于寄存器,而JVM基于栈。

Dalvik和Java之间的另外一大区别就是运行环境——Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。

总结:

关于项目

在就是你项目经验,一定要突出你遇到什么难点,然后是怎么解决的!把问题引导到你熟悉的领域,或者知识点上,尽量将每个技术点细节凸显出来,

Android Interview相关推荐

  1. 安卓面试题 Android interview questions

    安卓面试题 Android interview questions 作者:韩梦飞沙 ‎2017‎年‎7‎月‎3‎日,‏‎14:52:44 1.      要做一个尽可能流畅的ListView,你平时在 ...

  2. android interview 1

    1.    请描述下Activity的生命周期.       必调用的三个方法:onCreate() --> onStart() --> onResume(),用AAA表示 (1)父Act ...

  3. android interview 2

    1. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念 DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚 ...

  4. android系统面试问答_Android面试问答

    android系统面试问答 Android is the most popular operating system for mobile phone. Android apps are very p ...

  5. Android 简历+面试题 汇总

    1.教你写简历 1.1.你真的会写简历吗? 1.2.80%以上简历都是不合格的 1.3.推荐两个技术简历模板 1.4.关于程序员求职简历 1.5.程序员简历模板列表 2.面试题 2.1.国内一线互联网 ...

  6. Android面试必过——Android常见的问题

    Android常见的问题 标签(空格分隔): 移动开发 常见算法问题的 Java 实现 资料可见 算法介绍可见 算法是很多公司面试必须,国内 BAT 基本面试中都会有,尤以百度为盛. 常见设计模式的 ...

  7. Android常见的问题

    转载:http://stane.sinaapp.com/android面试必过-android常见的问题/ 水平有限,有错误请提出来. Android常见的问题 标签(空格分隔): 移动开发 常见算法 ...

  8. 超级准确的Android/JAVA面试题合集,背会你就10k!

    原文转自:点击打开链接 欢迎访问 我的个人博客 Android常见的问题 常见算法问题的 Java 实现 资料可见 算法介绍可见 算法是很多公司面试必须,国内 BAT 基本面试中都会有,尤以百度为盛. ...

  9. Android常用开源库整理汇总

    1.基本控件 1.1.TextView ScrollNumber ReadMoreTextView HtmlImage android-autofittextview html-textview Ba ...

最新文章

  1. 那些下载不了的视频,Python只用1行代码就能直接下载
  2. cve-2019-1821 思科 Cisco Prime 企业局域网管理器 远程代码执行 漏洞分析
  3. dac0832产生梯形波程序C语言,在8086系统中用DAC0832输出一个三角波,一个梯形波,和一个正弦波。...
  4. 在SAP Data Intelligence Modeler里创建新的pipeline
  5. 引用js_js值和引用
  6. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...
  7. office另存为pdf的加载项_pdf怎么转换成word?打工人必备的丛林法则
  8. postgres清理pg_xlog
  9. 【深入浅出etcd系列】3. 日志同步
  10. Java多线程系列---“JUC原子类”02之 框架
  11. 【wikioi】1014 装箱问题
  12. 计算机硬盘使用寿命,固态硬盘怎么测剩余寿命?SSD固态硬盘使用寿命检测方法...
  13. 计算机网络软件系统是什么结构,计算机软件系统的组成是什么?
  14. 又一家边缘计算公司融资啦!!!
  15. 博客平台遭虚假勒索攻击、新黑客组织称对以色列的攻击负责|11月16日全球网络安全热点
  16. 计算机的网络凭据,win10凭据密码是什么,网络凭据账户和密码是多少
  17. TCP/IP协议簇中的子网掩码有什么作用
  18. 参考文献为外文文献时应该采用什么格式啊?
  19. 微信小程序开发过程中出现的内存泄漏问题
  20. 编译原理复习(4)语法分析--自上而下分析

热门文章

  1. 哈啰出行Java开发面经
  2. IBM的人力资源管理
  3. 医院监护系统可行性分析
  4. 记一次靶场搭建与渗透测试
  5. 让程序员血液沸腾的10个瞬间!
  6. iOS 准确获取 iPhone 状态栏、导航栏、TabBar高度,看这篇就够了
  7. 【MPI并行计算】计算cosx在a~b的积分
  8. 手机照片删除了怎么恢复?解析恢复过程
  9. COMSOL有限元仿真深度指南:如何设置材料的各向异性属性?
  10. linux中nl命令的简介