安卓面试题绝密宝典

1. 什么是Activity? css

四大组件之一,通常的,一个用户交互界面对应一个activityjava

setContentView() ,// 要显示的布局 linux

button.setOnclickLinstener{android

}web

, activity 是Context的子类,同时实现了window.callback和keyevent.callback, 能够处理与窗体用户交互的事件. 面试

 

我开发经常使用的的有FragmentActivitiy,ListActivity  , PreferenceActivity ,TabAcitivty等…sql

 

若是界面有共同的特色或者功能的时候,还会本身定义一个BaseActivity.数据库

进度对话框的显示与销毁 编程

 

2. 请描述一下Activity 生命周期。浏览器

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

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

 

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

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

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

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

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

 

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

 

最后讲本身项目中的经验,好比说手机卫士每次进入某个界面的时候都要看到最新的数据,这个刷新列表的操做 就放在onStart()的方法里面.这样保证每次用户看到的数据都是最新的.

 

多媒体播放, 播放来电话. onStop() 视频, 视频声音设置为0 , 记录视频播放的位置 mediaplayer.pause();

onStart() 根据保存的状态恢复现场.mediaplayer.start();

 

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

 

 

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

 

通常状况好比说有两个activity,分别叫A,B,当在A里面激活B组件的时候, A 会调用 onPause()方法,而后B 调用onCreate() ,onStart(), OnResume() ,

 

 这个时候B覆盖了窗体, A会调用onStop()方法.  若是B呢是个透明的,或者是对话框的样式, 就不会调用onStop()方法

 

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

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

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

默认首先销毁当前activity,而后从新加载

 

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

 

游戏开发中, 屏幕的朝向都是写死的.

 

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

  能够自定义一个activity的样式

 android:theme="@android:style/Theme.Dialog"

 

6. 你后台的Activity被系统 回收怎么办?若是后台的Activity因为某缘由被系统回收可了,如何在被系统回收以前保存当前状态?


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

protected void onSaveInstanceState(Bundle outState) {

    super.onSaveInstanceState(outState);

    outState.putLong("id",1234567890);

}

public void onCreate(Bundle savedInstanceState) {

//判断savedInstanceState是否是空.

//若是不为空就取出来

        super.onCreate(savedInstanceState);

}

 

 

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

退出activity 直接调用 finish () 方法 . //用户点击back键 就是退出一个activity

退出activity 会执行 onDestroy()方法 .

1、抛异常强制退出:

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

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

100/0

    //安全结束进程 android.os.Process.killProcess(android.os.Process.myPid());

2、记录打开的Activity

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

 

            List<Activity>lists ; 在application 全集的环境里面

        lists =new ArrayList<Activity>();

 

lists.add(this);

 

for(Activity activity: lists)

{

    activity.finish();

}

 

ondestory

lists.remove(this);

 

3、发送特定广播:

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

//给某个activity 注册接受接受广播的意图  

    registerReceiver(receiver,filter)

 

//若是过接受到的是 关闭activity的广播  就调用finish()方法把当前的activity finish()掉

 

4、递归退出

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

 

 

上面是网上的一些作法.

 

其实 能够经过 intent的flag 来实现.. intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity,而后在新的activity的oncreate方法里面 finish掉.

 

讲一讲你对activity的理解

把上面的几点用本身的心得写出来

 

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

 

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

service里面不能执行耗时的操做(网络请求,拷贝数据库,大文件 )

在子线程中执行 new Thread(){}.start();

Thread.currentThread().getName();

特殊状况 ,能够在清单文件配置 service 执行所在的进程 ,让service在另外的进程中执行

 

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

基本数据类型能够经过. Intent 传递数据 

extras.putDouble(key, value)

intent.putExtra(name,value) 

// 经过intentputExtra 方法基本数据类型都传递

intent.getStringExtra("key","value");

intent.getBooleanExtra("key","value")

    Bundlebundle = new  Bundle();

    bumdle.putShort(key,value);

    intent.putExtras(bumdle);

intent.putExtras(bundle)

 

Application 全局里面存放 对象 ,本身去实现本身的application的这个类,基础系统的application , 每一个activity均可以取到

 

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

让类实现Serializable接口,而后能够经过 ObjectOutputStream       //对象输出流 

       Filefile = new File("c:\1.obj");

       FileOutputStreamfos  = new FileOutputStream(file);

       ObjectOutputStreamoos = new ObjectOutputStream(fos);

      

       Studentstu = new Student();

       oos.writeObject(stu);

      

      

       //从文件中把对象读出来 

       ObjectInputStreamois = new ObjectInputStream(arg0);

        Student stu1 = (Student) ois.readObject();

 

文件/网络

 

intent.setData(Uri)

Uri.fromFile();  //大图片的传递

 

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

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

 

11. 同一个程序,但不一样的Activity是否能够放在不一样的Task任务栈中?

Singleinstance  运行在另外的单独的任务栈里面

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

Intent的flag添加FLAG_ACTIVITY_NEW_TASK

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

    Intentintent = new Intent(A.this,B.class);

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    startActivity(intent);

 

12. Activity怎么和service绑定,怎么在activity中启动本身对应的service?

startService() 一旦被建立  调用着无关   无法使用service里面的方法

bindService () 把service 与调用者绑定 ,若是调用者被销毁, service会销毁

bindService() 咱们可使用service 里面的方法

    bindService().  让activity可以访问到 service里面的方法

    构建一个intent对象,

Intentservice = new Intent(this,MyService.class);

 经过bindService的方法去启动一个服务,

     bindService(intent,new MyConn(), BIND_AUTO_CREATE);

    ServiceConnection对象(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.

    privateclass myconn implements ServiceConnection

 

    {

 

        publicvoid onServiceConnected(ComponentName name, IBinder service) {

            //TODO Auto-generated method stub

            //能够经过IBinder的对象 去使用service里面的方法

        }

 

        publicvoid onServiceDisconnected(ComponentName name) {

            //TODO Auto-generated method stub

           

        }

       

    }

 

13. 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就会调用onUnbind->onDestroyed方法。

须要注意的是若是这几个方法交织在一块儿的话,会出现什么状况呢?

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

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

 

若是service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就stop不掉了,只能调用UnbindService, service就会被销毁

 

 

若是一个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?有何优势?

    普通的service ,默认运行在ui main 主线程

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

    OnHandleIntent()处理耗时的操做

 

 

17. 何时使用Service?

startForeground(id, notification)

messenger

    拥有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.Broadcastreceiver捕获到一个事件以后,能够起一个service来完成一个耗时的操做.

    3.远程的service若是被启动起来,能够被屡次bind,但不会从新create.  索爱手机X10i的人脸识别的service能够被图库使用,能够被摄像机,照相机等程序使用.

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

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

经过Intent 能够实现各类系统组件的调用与激活. 

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

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

Action: 动做    view

Data: 数据uri   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 =new Intent();

 intent.setAction("cn.itcast.action");

 

那么全部的 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

           http://www.baidu.com

本身定义的uri itcast://cn.itcast/person/10

 

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

Category 类别匹配

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

默认是DEFAULT

 

19. Intent传递数据时,能够传递哪些类型数据?

    1.通常的基本数据类型  Intent .putextra()intent.getextra();

 

    2.数据的uri, intent.setData() intent.getData();

 

20. 说说Activity,Intent,Service是什么关系 。

    麦当劳和麦当娜的关系是什么关系?

    这种问题,就讲下activity,讲一下service,说一下经过intent去激活组件,传递数据.

    说本身项目中有这样一个网络更新的功能,显示界面就用的activity, 后台有个service每隔半小时都去访问下服务器获取更新的数据…

开启服务用的是intent来开启

21. 请描述一下Broadcast Receiver。

有不少广播接收者 ,系统已经实现了.

广播分两种 有序广播

无序广播

指定接收者的广播 .  是不能够被拦截掉的 

<intent-filterandroid:priority="1000">

<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>

</intent-filter>

abortBroadcast();

 用于接收系统的广播通知, 系统会有不少sd卡挂载,手机重启,广播通知,低电量,来电,来短信等….

 手机卫士中自定义一个broadcast receiver

<intent-filter android:> <action> sms_received </action>  </intent-filter>

 

来获取短信到来的广播, 根据黑名单来判断是否拦截该短信.

 画画板生成图片后,发送一个sd挂载的通知,通知系统的gallery去获取到新的图片.

Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED,Uri.parse("file://"+Environment.getExternalStorageDirectory()));

sendBroadcast(intent);

22. 在manifest和代码中如何注册和使 用 broadcastreceiver 。

    设置广播接收者的优先级,设置广播接受者的action名字 等…

详细见工程代码.

        <intent-filter android:priority="1000">

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

        </intent-filter>

       </receiver>

        <receiverandroid:name=".SmsReceiver">

            <intent-filterandroid:priority="1000">

                <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>

            </intent-filter>

        </receiver>

        <receiverandroid:name=".BootCompleteReceiver">

            <intent-filter>

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

                </intent-filter>

        </receiver>

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

    把本身的数据经过uri的形式共享出去

android  系统下 不一样程序 数据默认是不能共享访问

   

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

    publicclass PersonContentProvider extends ContentProvider{

    publicboolean onCreate(){

        //..

    }

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

insert(Uri, ContentValues)

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

delete(Uri, String, String[])

}

 

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

    文件  访问权限.  sdcard <data>/<data>

    数据库 sqlite

    SharedPreference  <data>/<data>/shared_preps

    网络  socket tcp udp , http httpurlconnection

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

    屏蔽数据存储的细节,对用户透明,用户只须要关心操做数据的uri就能够了

    不一样app之间共享,操做数据

 

    Sql也有增删改查的方法. 

    可是contentprovider还能够去增删改查本地文件. xml文件的读取,更改,

网络数据读取更改

 

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

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

   FrameLayout

    从屏幕的左上角开始布局,叠加显示, 实际应用 播放器的暂停按钮.   

  LinearLayout

线性布局,这个东西,从外框上能够理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每个LinearLayout里面又可分为垂直布局

(android:orientation="vertical")和水平布局(android:orientation="horizontal"

)。当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每个元素依次向右排列。

AbsoluteLayout

绝对布局犹如div指定了absolute属性,用X,Y坐标来指定元素的位置android:layout_x="20px"

android:layout_y="12px"

qq斗地主 qq游戏大厅800*480 800*480.apk  fwvga  854*480

指定平板机型的游戏开发中常常用到绝对布局  widget 绝对布局

指定机型的平板游戏开发机顶盒开发。. 2.3 3.0

1.  界面布局  任务管理器 gridview

2.  手机 任务管理 listview

 

lephone 

lepad

 RelativeLayout

    相对布局能够理解为某一个元素为参照物,来定位的布局方式。主要属性有:

        相对于某一个元素

   android:layout_below="@id/aaa" 该元素在 id为aaa的下面

   android:layout_toLeftOf="@id/bbb" 改元素的左边是bbb

        相对于父元素的地方

    android:layout_alignParentLeft="true"  在父元素左对齐

android:layout_alignParentRight="true"在父元素右对齐

 

TableLayout <table>

表格布局相似Html里面的Table。每个TableLayout里面有表格行TableRow,TableRow里面能够具体定义每个元素,设定他的对齐方式android:gravity="" 。

每个布局都有本身适合的方式,另外,这五个布局元素能够相互嵌套应用,作出美观的界面。

oa  自动化 生成报表 ,图标 表示 

css div

webview

 

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

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

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

 这个题没看懂…

widget能够理解成桌面小控件,

也能够理解成 某个button, imageview这样的控件…

onmeasure() // 计算 控件在屏幕上的位子

某个view 要显示在界面  ondraw 被显示到界面上的 .

 

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

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

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

访问远程的服务的方法. 如何工做 day7queryStudent . 

手机卫士 Itelephony 接口挂断电话.

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

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

drwx

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

777本身 同组 其余

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

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

       Intent intent = new Intent();

      intent.setClassName(packageName, className);

      intent.seturi()

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

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


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

虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制 16M ,

谈谈加载图片的时候怎么处理大图片的,d

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

 

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

反射 , 配置文件

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

 

 

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

 

 

 

36.  android自己的一些限制,好比apk包大小限制,读取大文件时的时间限。

 这个问题问的有问题, apk包大小限制很差说,

极品飞车有100M 仍是能装到手机上,

世面google market 上大程序  主程序 很小 5~10M    下载sdcard

15分钟以内 申请退款 

apk包,精简包, 素材存放在服务器. 游戏程序.

 

读大文件的时间限制应该是main线程里面的时间限制吧.

Activity 不要超过5秒.

Service 不要超过20

 

 

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

Android提供mediascanner,mediaStore等接口, 音乐文件的信息都会存放到系统的数据库表中,能够经过content provider获取,

 

显示出来,改善效率,是个常见问题, 能够从如下几个方面做答,

分批加载数据, 延时加载数据, 合理使用缓存等...

 

 

38. ListView如何提升其效率?

 

 复用convertview, 历史的view对象

减小子孩子查询的次数 viewholder

异步加载数据, 分页加载数据,

使用静态的view对象 避免建立过多的view.

39. 启动应用后,改变系统语言,应用的语言会改变么?

 

 

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

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

intent设置的flag  flag_new_task

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

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

Android SDK引用了大部分的Java SDK,少数部分被Android SDK抛弃,好比说界面部分,java.awt  swing package除了java.awt.font被引用外,其余都被抛弃,在Android平台开发中不能使用。 android sdk 添加工具jar httpclient , pull  opengl

 

将Java 游戏或者j2me程序移植到Android平台的过程当中,

Android  SDK 与JavaSDK的区别是很须要注意的地方。

sampledataadpter()

 

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

首先咱们来看下Task的定义,Google是这样定义Task的:a task is what the user experiences asan "application." It's a group of related activities, arranged in astack. A task is a stack of activities, not a class or an element in themanifest 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中点选进入),而且会在各个场合使用,应该作得彻底独立。

 

大的apk 拆成 不少小的apk 

  ●Activityandroid:affinity属性

1.配置后当启动这个activity时就先去找有没有activity的亲和力属性相同有就加入这个

    activity所在的任务中没有就新开任务

2.affinity起做用须要的条件两者具有一个:

        1.intent包含FLAG_ACTIVITY_NEW_TASK标记

        2.activity元素启用了allowTaskReparenting属性.

 

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

  回收已经使用的资源, 

  合理的使用缓存

合理设置变量的做用范围…  application 对象

//将来的某一段时间执行 

System.gc();

 

44. 不一样工程中的方法是否能够相互调用?

  能够,列举aidl访问远程服务的例子.

 

 

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

Day8 showAddressService.java

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

Dvm的进程是dalivk虚拟机进程,每一个android程序都运行在本身的进程里面,

每一个android程序系统都会给他分配一个单独的liunx  uid(user id),

每一个dvm都是linux里面的一个进程.因此说这两个进程是一个进程.

 

47. sim卡的EF 文件有何做用

  Sim卡相关的东西,没接触过

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中跨进程通讯的几种方式 。

linux编程

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

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

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

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

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

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

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

53. 谈谈对Android NDK的理解。

native develop kit   只是一个交叉编译的工具  .so

    1.何时用ndk,  实时性要求高,游戏,图形渲染, opencv (人脸识别) , ffmpeg , rmvb  mp5 avi 高清解码. ffmpeg,opencore.

 

2.为何用ndk,ndk的优势 ,缺点 ,

 

咱们项目中那些地方用到了ndk, 

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

1、开放性,开源ophone  阿里云( 彻底兼容android)

2、挣脱运营商束缚

3、丰富的硬件选择 mtk android

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

5、无缝结合的Google应用

 

缺点也有5处:

1、安全问题、隐私问题

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

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

4、山寨化严重

5、过度依赖开发商,缺少标准配置

 

 

55. Android系统中GC什么状况下会出现内存泄露呢?  视频编解码/内存泄露

检测内存泄露   工具 

mat

C:\Users\lenovo\Desktop\prof>hprof-convcom.example.testmat.hprof convert-com.ex

ample.testmat.hprof

致使内存泄漏主要的缘由是,先前申请了内存空间而忘记了释放。若是程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,由于没法让垃圾回收器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()方法;

View view;

view.invalidate();//主线程

view.postInvalidate();//子线

 

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

Android 数字签名

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

Android系统要求每个安装进系统的应用程序都是通过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的做者和在应用程序之间创建信任关系,不是用来决定最终用户能够安装哪些应用程序。

这个数字证书并不须要权威的数字证书签名机构认证(CA),它只是用来让应用程序包自我认证的。

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

(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给用户。

Activity 5秒  broadcast10

 

耗时的操做 worker thread里面完成,handler message…AsynTask , intentservice.等…

 

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动画,传统的动画方法,经过顺序的播放排列好的图片来实现,相似电影。

 

属性动画 ObjectAnimator

 

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 就能够完成程序的自动安装,描述下原理

  Day11 AddJavascriptInterface

new Object{

    callphone();

    installapk();

}

 

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

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

 

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

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

 

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

 

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

66,udp链接和TCP的不一样之处

 tcp/滑动窗口协议. 拥塞控制.   面向链接 流

  udp 不关心数据是否达到,是否阻塞   面向无链接

 

画面优先. tcp 

流畅优先  udp

 

 

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

逻辑错误

1.断点 debug 

2. logcat , traceview

界面布局,显示 hierarchyviewer.bat

68.service里面能够弹土司么

能够

69.写10个简单的linux命令

cat ls ps psw wc mv rm cd ping tracert find grep tail vi gccmake ifconfig

startup dhcp

70 JNI调用经常使用的两个参数

 JNIEnv *env,jobject javaThis

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

  src

 android. jar

  asset

  res

  gen

  manifest

 

72. ddms 和traceview的区别.

   daivilk debug managersystem

1.在应用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字");

2.一样在主activity的onStop方法中加入Debug.stopMethodTracing();

3.同时要在AndroidManifest.xml文件中配置权限

   <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

3.从新编译,安装,启动服务,测试完成取对应的traceview文件(adb pull /sdcard/xxxx.trace)。

4.直接在命令行输入traceview xxxxtrace,弹出traceview窗口,分析对应的应用便可。

 

traceview 分析程序执行时间和效率

 

KPI :key performance information : 关键性能指标:

 splash界面不能超过5秒

 从splash 界面加载mainactivity不能超过0.7秒

 

对于Android 1.5及如下的版本:不支持

对于Android 1.5以上2.1下(含2.1)的版本:受限支持trace文件只能生成到SD,且必须在程序中加入代码。

对于Android 2.2上(含2.2)的版本:全支持。能够不用SD,不用在程序中加代码,直接本身用DDMS就能够进程Traceview

 

73. 利用mvc的模式重构代码

1) 重构前的代码Bmi.java:

packagecom.demo.android.bmi;

 

import java.text.DecimalFormat;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

importandroid.widget.EditText;

importandroid.widget.TextView;

 

public class Bmi extends Activity {

   /** Called when the activity is firstcreated. */

   @Override

   public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);

 

      // Listen for button clicks

      Button button= (Button) findViewById(R.id.submit);

      button.setOnClickListener(calcBMI);

   }

 

   private OnClickListener calcBMI = new OnClickListener() {

      @Override

      public void onClick(View v) {

          DecimalFormatnf = new DecimalFormat("0.00");

          EditTextfieldheight = (EditText) findViewById(R.id.height);

          EditTextfieldweight = (EditText) findViewById(R.id.weight);

 

          double height = Double.parseDouble(fieldheight.getText().toString())/ 100;

          double weight = Double.parseDouble(fieldweight.getText().toString());

          double BMI = weight / (height * height);

 

          TextViewresult = (TextView) findViewById(R.id.result);

          result.setText("Your BMI is " + nf.format(BMI));

 

          // Give health advice

          TextViewfieldsuggest = (TextView) findViewById(R.id.suggest);

          if (BMI > 25) {

             fieldsuggest.setText(R.string.advice_heavy);

          } else if (BMI < 20) {

             fieldsuggest.setText(R.string.advice_light);

          } else {

             fieldsuggest.setText(R.string.advice_average);

          }

      }

   };

}

 

 

 

 

Step1:抽取全部界面元件的声明和定义,整合到单独一个函数findViews()中;

// 声明 view

private Button button_calc;

private EditText field_height;

private EditText field_weight;

private TextView view_result;

private TextView view_suggest;

 

// 定义

private void findViews() {

   button_calc = (Button) findViewById(R.id.submit);

   field_height = (EditText) findViewById(R.id.height);

   field_weight = (EditText) findViewById(R.id.weight);

   view_result = (TextView) findViewById(R.id.result);

   view_suggest = (TextView) findViewById(R.id.suggest);

}

此部分便是MVC中的V:View视图。

Step2:抽取程序的逻辑(即界面元件的处理逻辑),整合到函数setListensers()中;

//Listen for button clicks

private void setListensers() {

    button_calc.setOnClickListener(calcBMI);

}

此部分便是MVC中的C:Controller控制器。

接着,onCreate()就显得很是简洁、明了了:

public void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.main);

 

   findViews();

   setListensers();

}

Step3:修改按钮监听器calcBMI中相应的部分(主要是变量已经在视图部分定义了);

private OnClickListenercalcBMI = new OnClickListener() {

   @Override

   public void onClick(View v) {

      DecimalFormatnf = new DecimalFormat("0.00");

 

      double height =Double.parseDouble(field_height.getText().toString()) / 100;

      double weight =Double.parseDouble(field_weight.getText().toString());

      double BMI = weight / (height * height);

 

      // Present result

      view_result.setText("Your BMI is " + nf.format(BMI));

 

      // Give health advice

      if (BMI > 25) {

          view_suggest.setText(R.string.advice_heavy);

      } else if (BMI < 20) {

          view_suggest.setText(R.string.advice_light);

      } else {

          view_suggest.setText(R.string.advice_average);

      }

   }

};

 

总之,此重构的目的无非是使程序的脉络更加清晰,即让人一眼望去,就能很容易地分辨出界面(View)应该写在哪里,程序逻辑(Controller)应该写在哪里,最终使维护和扩展代码变得更加容易!

其实,重构很简单,通读代码,感受哪边不太爽,就改那边吧!(我目前的感觉)

一个良好的代码应该是能让人感到舒服的!

 

2)     重构后的代码Bmi.java:

packagecom.demo.android.bmi;

 

importjava.text.DecimalFormat;

 

importandroid.app.Activity;

importandroid.os.Bundle;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.EditText;

importandroid.widget.TextView;

 

public class Bmi extends Activity {

 

   private Button button_calc;

   private EditText field_height;

   private EditText field_weight;

   private TextView view_result;

   private TextView view_suggest;

 

   /** Called when the activity is firstcreated. */

   @Override

   public void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);

 

      findViews();

      setListensers();

   }

 

   // 定义

   private void findViews() {

      button_calc = (Button) findViewById(R.id.submit);

      field_height = (EditText) findViewById(R.id.height);

      field_weight = (EditText) findViewById(R.id.weight);

      view_result = (TextView) findViewById(R.id.result);

      view_suggest = (TextView) findViewById(R.id.suggest);

   }

 

   // Listen for button clicks

   private void setListeners() {

      calcbutton.setOnClickListener(calcBMI);

   }

 

   private Button.OnClickListener calcBMI = new Button.OnClickListener() {

      public void onClick(View v) {

          DecimalFormatnf = new DecimalFormat("0.0");

          double height = Double.parseDouble(field_height.getText().toString()) / 100;

          double weight = Double.parseDouble(field_weight.getText().toString());

          double BMI = weight / (height * height);

 

          // Present result

          view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));

 

          // Give health advice

          if (BMI > 25) {

             view_suggest.setText(R.string.advice_heavy);

          } else if (BMI < 20) {

             view_suggest.setText(R.string.advice_light);

          } else {

             view_suggest.setText(R.string.advice_average);

          }

      }

   };

}

 

 

 

总结:

关于项目

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

 

 

心态:

什么样的面试官都有,去面试的时候要作好一切心理准备,无论是技术仍是基础都得扎实。一我的的交谈能力也很重要,总之不是很是标准的普通话,最起码你说的得让别人听得懂,并且得把面试官讲得很是完全,这样你得到offer的机会更大,谈工资也有优点~~

相关文章
相关标签/搜索