android面试题汇总(一)

1. 什么是Activity
四大组件之一,通常一个用户交互界面对应一个activity
activity 是Context的子类,同时实现了window.callback和keyevent.callback, 能够处理与窗体用户交互的事件.  
开发经常使用的的有ListActivity  , PreferenceActivity ,TabAcitivty等,若是界面有共同的特色或者功能的时候,还会本身定义一个BaseActivity.  
 
2. 请描述一下Activity 生命周期
生命周期描述的是一个Activity从建立(new出来)到销毁的过程当中会执行的方法,在这个过程当中 会针对不一样的生命阶段会调用不一样的方法.
Activity从建立到销毁有多种状态,从一种状态到另外一种状态时会激发相应的回调方法.
这些回调方法包括:
  • oncreate
  • ondestroy
  • onstop
  • onstart
  • onresume
  • onpause  
其实这些方法都是两两对应的,onCreate建立与onDestroy销毁;onStart可见与onStop不可见;onResume可编辑(即焦点)与onPause;对话框的弹出, Activity.this  
这6个方法是相对应的,那么就只剩下一个onRestart方法了,这个方法在何时调用呢?
答案:在Activity被onStop后,可是没有被onDestroy,在再次启动此Activity时就调用onRestart(而再也不调用onCreate)方法.若是被onDestroy了,则是调用onCreate方法.
最后讲本身项目中的经验,好比说客户端每次进入某个界面的时候都要看到最新的数据,这个刷新列表的操做就放在onStart()的方法里面.fillData() 这样保证每次用户看到的数据都是最新的.多媒体播放, 有来电, 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是透明的,或者是对话框的样式, A就不会调用onStop()方法.
 
4. 横竖屏切换时候Activity的生命周期.
 这个生命周期跟清单文件里的配置有关系
①不设置Activity的android:configChanges时,切屏会从新调用各个生命周期,默认首先销毁当前activity,而后从新加载.
②设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会从新调用各个生命周期,只会执行onConfigurationChanged方法
通常游戏开发中, 屏幕的朝向都是写死的.  
 
5. 如何将一个Activity设置成窗口的样式.
能够自定义一个activity的样式,详细见手机卫士的程序详细信息,android:theme="@style/FloatActivity"
 
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()方法 .
①抛异常强制退出:
该方法经过抛异常,使程序Force Close.  
验证能够,可是,须要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口.
 
//安全结束进程     android.os.Process.killProcess(android.os.Process.myPid());
②记录打开的Activity:
每打开一个Activity,就记录下来.在须要退出时,关闭每个Activity便可.
            List<Activity> lists ; 在application 全集的环境里面  
        lists = new ArrayList<Activity>();
lists.add(activity);
for(Activity activity: lists)
{
    activity.finish();
}
③发送特定广播:
在须要结束应用时,发送一个特定的广播,每一个Activity收到广播后,关闭便可.
//给某个activity 注册接受接受广播的意图     
    registerReceiver(receiver, filter)
//若是过接受到的是关闭activity的广播  就调用finish()方法 把当前的activity finish()掉  
 
④递归退出:
在打开新的Activity时使用startActivityForResult,而后本身加标志,在onActivityResult中处理,递归关闭.
 
上面是网上的一些作法.
其实能够经过 intent的flag来实现
intent.setFlag(FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity,而后在新的activity的oncreate方法里面 finish掉.
Intent intent = new Intent(this,B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
局限性 :全部的activity的启动模式都要是默认的启动模式  
 
8. service是否在main thread中执行, service里面是否能执行耗时的操做?
默认状况,若是没有显示的指定service所运行的进程, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面,service里面不能执行耗时的操做(网络请求,拷贝数据库,大文件 )
在子线程中执行 new Thread(){}.start();
特殊状况 ,能够在清单文件配置 service 执行所在的进程 ,让service在另外的进程中执行                     
<service  android:process="cn.itcast.xxx"></service>
 
9. 两个Activity之间怎么传递数据?
基本数据类型能够经过Intent传递数据   
extras.putDouble(key, value)
intent.putExtra(name, value)   
// 经过intent putExtra 方法基本数据类型都传递  
    Bundle bundle = new  Bundle();
        bumdle.putShort(key, value);
        intent.putExtras(bundle);
intent.putExtras(bundle)
 
获取到激活他的  getIntent();
        Intent intent = getIntent();
        Bundle bundle = intent.getExtras();
intent.getStringExtra("key","value");
intent.getBooleanExtra("key","value")
 
Application 全局里面存放对象,本身去实现本身的application的这个类,基础系统的application,每一个activity均可以取到,让对象实现 implements  Serializable 接口把对象存放到文件上.让类实现Serializable 接口,而后能够经过 ObjectOutputStream //对象输出流   
        File file = new File("c:\\1.obj");
        FileOutputStream fos  = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        
        Student stu = new Student();
        stu.setId("10001");
        stu.setName("zs");
        oos.writeObject(stu);
            
        FileInputStream fis = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(fis);
         Student stu1 = (Student) ois.readObject();
        System.out.println(stu1.getName());
Parcelable 和 Serializable  
Parcelable 把对象序列化到android操做系统的一块公用的内存空间  
文件/网络  
 
intent.setData(Uri)  
Uri.fromFile();  //大图片的传递
contentResolver.getInputStream(url);
 
10. 怎么让在启动一个Activity是就启动一个service?
在activity的onCreate()方法里面 startService();
 
11. 同一个程序,但不一样的Activity是否能够放在不一样的Task任务栈中?
比方说在激活一个新的activity时候, 给intent设置flag
Intent的flag添加FLAG_ACTIVITY_NEW_TASK
   这个被激活的activity就会在新的task栈里面
    Intent intent = 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对象,
Intent service = new Intent(this,MyService.class);
 经过bindService的方法去启动一个服务,
       bindService(intent, new MyConn(), BIND_AUTO_CREATE);
    ServiceConnection 对象(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.
    private class myconn implements ServiceConnection
    {
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            //能够经过IBinder的对象 去使用service里面的方法
        }
 
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub   
        }   
    }
 
13.什么是Service以及描述下它的生命周期.Service有哪些启动方法,有什么区别,怎样停用Service?
在Service的生命周期中,被回调的方法比Activity少一些,只有onCreate, onStart, onDestroy,onBind和onUnbind.
一般有两种方式启动一个Service,他们对Service生命周期的影响是不同的.
①经过startService
Service会经历 onCreate 到onStart,而后处于运行状态,stopService的时候调用onDestroy方法.若是是调用者本身直接退出而没有调用stopService的话,Service会一直在后台运行.
②经过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的话会抛出异常.
 
14. 不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?
这个问题问的很山寨.默认不作任何处理,B里面的音乐都能播放.  
遇到问题, 能够随机应变,灵活发挥,多考虑些细节,好比说这个题就能够这样说,说说你对startActivityForResult的理解()
A开启B的时候,用startActivityForResult()方法, B返回的时候把播放的状态信息返回给A ,A继续播放音乐.  
 
15. 什么是IntentService?有何优势?
普通的service ,默认运行在ui main 主线程,Sdk给咱们提供的方便的,带有异步处理的service类,异步处理的方法OnHandleIntent(),OnHandleIntent() 处理耗时的操做.
 
16. 何时使用Service?
拥有service的进程具备较高的优先级.
官方文档告诉咱们,Android系统会尽可能保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端链接(bindService)到它.当内存不足时,须要保持,拥有service的进程具备较高的优先级.
①若是service正在调用onCreate,  onStartCommand或者onDestory方法,那么用于当前service的进程至关于前台进程以免被killed.
②若是当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,可是比那些不可见的进程更重要,这就意味着service通常不会被killed.
③若是客户端已经链接到service (bindService),那么拥有Service的进程则拥有最高的优先级,能够认为service是可见的.
④若是service可使用startForeground(true)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed.
若是有其余的应用组件做为Service,Activity等运行在相同的进程中,那么将会增长该进程的重要性.
特色:
①Service的特色可让他在后台一直运行,能够在service里面建立线程去完成耗时的操做. 如天气预报 widget TimerTask Timer 按期执行timertask  
②Broadcast receiver捕获到一个事件以后,能够起一个service来完成一个耗时的操做. Broadcast receiver生命周期 和 响应时间很短   
③远程的service若是被启动起来,能够被屡次bind, 但不会从新create.  手机的人脸识别的service能够被图库使用,能够被摄像机,照相机等程序使用.
 
17. 请描述一下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 >  
 <action android:name="android.intent.action.MAIN" />  
 <action android: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 指定数据的位置、端口、和路径.以下:
 <data android: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.
 
18. Intent传递数据时,能够传递哪些类型数据?
①通常的基本数据类型  Intent .putextra() intent.getStringextra();
②数据的uri, intent.setData() intent.getData();
 
19. 说说Activity,Intent,Service是什么关系 .
这种问题,就讲下activity,讲一下service,说一下经过intent去激活组件,传递数据.说一下本身项目中有这样一个网络更新的功能,显示界面就用的activity, 后台有个service每隔半小时都去访问下服务器获取更新的数据.开启服务用的是intent来开启.
 
20. 请描述一下Broadcast Receiver.
有不少广播接收者 ,系统已经实现了.广播分两种  
有序广播
无序广播
指定接收者的广播,是不能够被拦截掉的   
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
onReceive() 方法. abortBroadcast();
有序广播有一个特例
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);
resultReceiver 广播接受者 若是咱们显示的指定了广播接收者  
不管如何 都会接受广播时间 abortBroadcast(); 的方法不会终止广播时间 
Sticky  
sendStickyBroadcast(intent)  // 阴魂不散的广播  
Wifi设置   
用于接收系统的广播通知, 系统会有不少sd卡挂载,手机重启,广播通知,低电量,来短信等,一个apk的安装成功.
 手机卫士中自定义一个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);
 
21. 在manifest和代码中如何注册和使 用 broadcast receiver .
设置广播接收者的优先级,设置广播接受者的action名字等
静态注册:详细见工程代码.
         <intent-filter android:priority="1000">
           <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>          
         </intent-filter>
        </receiver>
        <receiver android:name=".SmsReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
        <receiver android:name=".BootCompleteReceiver">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"    />        
                </intent-filter>
        </receiver>
动态注册:代码中注册,若是代码没有执行,就接受不到广播事件  
        registerReceiver(receiver, filter)
 
22. 请介绍下ContentProvider是如何实现数据共享的.
把本身的数据经过uri的形式共享出去,android系统下不一样程序数据默认是不能共享访问  
    须要去实现一个类去继承ContentProvider
    public class PersonContentProvider extends ContentProvider{
    public boolean onCreate(){
        //..
    }
query(Uri, String[], String, String[], String)
insert(Uri, ContentValues)
update(Uri, ContentValues, String, String[])
delete(Uri, String, String[])
}
content:// 表明contentprovider  
技巧:
①看urlmarcher.  
②根据匹配码,查看增删改查的具体实现  
 
23. 请介绍下Android的数据存储方式.
①文件  访问权限.  sdcard :<data>/<data>      context.openFileInput(name) 默认是私有的访问权限     
②数据库 sqlite  
③SharedPreference  <data>/<data>/shared_preps   Context.modeprivate
④网络  socket tcp udp ,http httpurlconnection,ftp的网络  
 
24. 为何要用ContentProvider?它和sql的实现上有什么差异?
屏蔽数据存储的细节,对用户透明,用户只须要关心操做数据的uri就能够了,对应的参数.不一样app之间共享,操做数据,可是contentprovider 还能够去增删改查本地文件. xml文件的读取,更改,网络数据读取更改,Sql也有增删改查的方法.   
 
25. 请介绍下Android中经常使用的五种布局.
  • FrameLayout(帧布局)
  • LinearLayout (线性布局)
  • AbsoluteLayout(绝对布局)
  • RelativeLayout(相对布局)
  • TableLayout(表格布局)
帧布局: 从屏幕的左上角开始布局,叠加显示, 实际应用 播放器的暂停按钮.
线性布局:从外框上能够理解为一个div,他首先是一个一个从上往下罗列在屏幕上.每个LinearLayout里面又可分为垂直布局
(android:orientation="vertical")和水平布局(android:orientation="horizontal"  
).当垂直布局时,每一行就只有一个元素,多个元素依次垂直往下;水平布局时,只有一行,每个元素依次向右排列.
绝对布局:犹如div指定了absolute属性,用X,Y坐标来指定元素的位置android:layout_x="20px" android:layout_y="12px"  
表格布局:相似Html里面的Table.每个TableLayout里面有表格行TableRow,TableRow里面能够具体定义每个元素,设定他的对齐方式 android:gravity="" .
每个布局都有本身适合的方式,另外,这五个布局元素能够相互嵌套应用,作出美观的界面.
 
26. 谈谈UI中, Padding和Margin有什么区别?
Padding 至关于内边距,如文字对边框, margin至关于外边局,如控件与控件之间的距离.
 
27. widget相对位置的完成在activity的哪一个生命周期阶段实现.
待补充...
widget能够理解成桌面小控件,也能够理解成某个button, imageview这样的控件.
onmeasure() // 计算控件在屏幕上的位子
ondraw()  //被显示到界面上的
 
28. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系.
Handler简介:
一个Handler容许你发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联.每个线程实例和一个单独的线程以及该线程的MessageQueue相关联.当你建立一个新的Handler时,它就和建立它的线程绑定在一块儿了.这里,线程咱们也能够理解为线程的MessageQueue.从这一点上来看,Handler把Message和Runable对象传递给MessageQueue,并且在这些对象离开MessageQueue时,Handler负责执行他们.
Handler有两个主要的用途:
①肯定在未来的某个时间点执行一个或者一些Message和Runnable对象.
②在其余线程(不是Handler绑定线程)中排入一些要执行的动做.
Scheduling Message,即①,能够经过如下方法完成:
post(Runnable):Runnable在handler绑定的线程上执行,也就是说不建立新线程.
postAtTime(Runnable,long):
postDelayed(Runnable,long):
sendEmptyMessage(int):
sendMessage(Message):
sendMessageAtTime(Message,long):
sendMessageDelayed(Message,long):
post这个动做让你把Runnable对象排入MessageQueue,MessageQueue收到这些消息的时候执行他们,固然以必定的排序.sendMessage这个动做容许你把Message对象排成队列,这些Message对象包含一些信息,Handler的hanlerMessage(Message)会处理这些Message.固然,handlerMessage(Message)必须由Handler的子类来重写.这是编程人员须要作的事.
当posting或者sending到一个Hanler时,你能够有三种行为:当MessageQueue准备好就处理,定义一个延迟时间,定义一个精确的时间去处理.后二者容许你实现timeout,tick,和基于时间的行为.
当你的应用建立一个新的进程时,主线程(也就是UI线程)自带一个MessageQueue,这个MessageQueue管理顶层的应用对象(像activities,broadcast receivers等)和主线程建立的窗体.你能够建立本身的线程,并经过一个Handler和主线程进行通讯.这和以前同样,经过post和sendmessage来完成,差异在于在哪个线程中执行这方法.在恰当的时候,给定的Runnable和Message将在Handler的MessageQueue中被Scheduled.
 
Message简介:
Message类就是定义了一个信息,这个信息中包含一个描述符和任意的数据对象,这个信息被用来传递给Handler.Message对象提供额外的两个int域和一个Object域,这可让你在大多数状况下不用做分配的动做.尽管Message的构造函数是public的,可是获取Message实例的最好方法是调用Message.obtain(),或者Handler.obtainMessage()方法,这些方法会从回收对象池中获取一个.
 
MessageQueue简介:
这是一个包含message列表的底层类.Looper负责分发这些message.Messages并非直接加到一个MessageQueue中,而是经过MessageQueue.IdleHandler关联到Looper.
你能够经过Looper.myQueue()从当前线程中获取MessageQueue.
 
Looper简介:
Looper类被用来执行一个线程中的message循环.默认状况,没有一个消息循环关联到线程.在线程中调用prepare()建立一个Looper,而后用loop()来处理messages,直到循环终止.大多数和message loop的交互是经过Handler.
下面是一个典型的带有Looper的线程实现.
 
class LooperThread extends Thread {
      public Handler mHandler;
      public void run() {
          Looper.prepare();
           
          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };
           
          Looper.loop();
      }
  }
 
29. AIDL的全称是什么?如何工做?
Android interface definition language (android接口定义语言) ,  
用来跨进程的访问方法, 访问远程的服务的方法.
 
30. 请解释下Android程序运行时权限与文件系统权限的区别.
Android程序执行须要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 打电话,访问网络,获取坐标,读写sd卡,读写联系人等..安装的时候会提示用户.
文件系统的权限是linux权限. 好比说sharedpreference里面的Context.Mode.private  Context.Mode.world_read_able   Context.Mode_world_writeable 777本身 同组 其余.
 
31. 系统上安装了多种浏览器,可否指定某浏览器访问指定页面?
找到对应的浏览器的意图,传递数据URI, 激活这个意图
       Intent intent = new Intent();
       intent.setClassName(packageName, className);
       Intent.setdata(uri);
 
32. 对android主线程的运用和理解.
主ui线程不能执行耗时的操做
 
33. 对android虚拟机的理解,包括内存管理机制垃圾回收机制.
虚拟机很小,空间很小,谈谈移动设备的虚拟机的大小限制16M,谈谈加载图片的时候怎么处理大图片的,
垃圾回收,没有引用的对象,在某个时刻会被系统gc掉.
System.gc(); 不是马上去执行垃圾回收.
 
34. Framework工做方式及原理,Activity是如何生成一个view的,机制是什么.
反射,配置文件.能够讲下activity的源码,好比说 每一个activity里面都有window.callback和keyevent.callback,一些回调的接口或者函数. 框架把activity建立出来就会调用里面的这些回调方法,会调用activity生命周期相关的方法.
setContentView();
普通的状况:
Activity建立一个view是经过 ondraw 画出来的, 画这个view以前呢,还会调用onmeasure方法来计算显示的大小.
 
35.android自己的一些限制,好比apk包大小限制,读取大文件时的时间限.
这个问题问的有问题, apk包大小限制很差说,读大文件的时间限制应该是main线程里面的时间限制:5秒.
 
36. 如何加载的音乐信息,如何改善其效率.
Android提供mediascanner,mediaStore等接口, 音乐文件的信息都会存放到系统的数据库表中,能够经过content provider获取,
显示出来,改善效率,是个常见问题, 能够从如下几个方面做答,
分批加载数据, 延时加载数据, 合理使用缓存等.  
 
37. ListView如何提升其效率?
复用convertview , 历史的view对象.异步加载数据,分页加载数据, onscallLinster();
Static class ViewHolder //使用静态的view对象 避免建立过多的view.
把下载后的数据缓存到数据库里.
 
38. 启动应用后,改变系统语言,应用的语言会改变么?
通常系统应用会改变,由于应用中作了对应的语言包能够实现匹配,好比android原生的自带的应用源码都有语言匹配values-en,values-it等,这个加载机制是android自带的.若是一个应用中没有作对应的语言包翻译,则会自动加载values文件夹下的翻译.因此这个问题和具体的应用有关,不能一律而论.
 
39. 启动一个程序,能够主界面点击图标进入,也能够从一个程序中跳转过去,两者有什么区别?  
区别是根据activity在manifest里面的配置,这个activity可能会放在不一样的task栈里面
intent设置的flag  flag_new_task  
 
40. 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等.
 
41. Android中Task任务栈的分配.
假若有三个Activity A B C,A跳到B,而后B跳到C,如今须要从C跳到A如何传递数据并且使效率最高呢?
首先咱们来看下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 of activities, 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中点选进入),而且会在各个场合使用,应该作得彻底独立.
大的apk 拆成不少小的apk   
  ●Activity的 android:taskAffinity=""属性 姻缘关系  
①配置后 当启动这个activity时就先去找有没有activity的亲和力属性相同 有就加入这个
    activity所在的任务中没有就新开任务
②affinity起做用须要的条件而者具有一个:
        1.intent包含FLAG_ACTIVITY_NEW_TASK标记
        2.activity元素启用了allowTaskReparenting属性.
 
42. 在Android中,怎么节省内存的使用,怎么主动回收内存?
回收已经使用的资源,合理的使用缓存,合理设置变量的做用范围, application 对象  
//将来的某一段时间执行.gc();
 
43. 不一样工程中的方法是否能够相互调用?
能够,列举aidl访问远程服务的例子.
 
44. 在Android中是如何实现判断区分电话的状态,去电,来电、未接来电?
待补充...
 
45. dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
Dvm的进程是dalivk虚拟机进程,每一个android程序都运行在本身的进程里面,每一个android程序系统都会给他分配一个单独的liunx  uid(user id), 每一个dvm都是linux里面的一个进程.因此说这两个进程是一个进程.
 
46. sim卡的EF 文件有何做用
待补充...
 
47. 如何判断是否有SD卡?
配置文件中有sd卡的权限, 经过environment的静态方法,
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {...}
 
48. 嵌入式操做系统内存管理有哪几种, 各有何特性.
页式,段式,段页,等
待补充...
 
49. 什么是嵌入式实时操做系统, Android 操做系统属于实时操做系统吗?
实时操做系统是指当外界事件或数据产生时,可以接受并以足够快的速度予以处理,其处理的结果又能在规定的时间以内来控制生产过程或对处理系统做出快速响应,并控制全部实时任务协调一致运行的嵌入式操做系统.主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就须要使用实时系统.又可分为软实时和硬实时两种,而android是基于linux内核的,所以属于软实时. 硬实时. 火星探测车.  
 
50. 一条最长的短信息约占多少byte?  
中文70(包括标点),英文160,160个字节 这个说法不许确,
要跟手机制式运营商等信息有关.  
作实验,看源码
ArrayList<String> msgs = sms.divideMessage(message);  
         for (String msg : msgs) {   
            sms.sendTextMessage(phoneNumber, null, msg, pi, null);        
}
 
51. Linux中跨进程通讯的几种方式 .
linux编程  
# 管道( pipe ):管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用.进程的亲缘关系一般是指父子进程关系.
# 有名管道 (named pipe) : 有名管道也是半双工的通讯方式,可是它容许无亲缘关系进程间的通讯.
# 信号量( semophore ) : 信号量是一个计数器,能够用来控制多个进程对共享资源的访问.它常做为一种锁机制,防止某进程正在访问共享资源时,其余进程也访问该资源.所以,主要做为进程间以及同一进程内不一样线程之间的同步手段.
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点.
# 信号 ( sinal ) : 信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生.
# 共享内存( shared memory ) :共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问.共享内存是最快的 IPC 方式,它是针对其余进程间通讯方式运行效率低而专门设计的.它每每与其余通讯机制,如信号两,配合使用,来实现进程间的同步和通讯.
# 套接字( socket ) : 套解口也是一种进程间通讯机制,与其余通讯机制不一样的是,它可用于不一样及其间的进程通讯.
 
52. 谈谈对Android NDK的理解.
native develop kit   只是一个交叉编译的工具  .so  
①何时用ndk,  实时性要求高,游戏,图形渲染, opencv (人脸识别) , ffmpeg , rmvb  mp5 avi 高清解码. ffmpeg, opencore.  
②为何用ndk,ndk的优势 ,缺点,咱们项目中那些地方用到了ndk

53. 谈谈Android的优势和不足之处.
①开放性,开源
②挣脱运营商束缚
③丰富的硬件选择
④不受任何限制的开发商
⑤无缝结合的Google应用
 
缺点:
①安全问题、隐私问题  
②卖手机的不是最大运营商
③运营商对Android手机仍然有影响
④山寨化严重
⑤过度依赖开发商,缺少标准配置 版本过多
 
54. 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 内存泄露的根本缘由就是保存了不可能再被访问的变量类型的引用,这样会致使内存资源使用不断累计从而出现异常.
 
55. Android UI中的View如何刷新.
在主线程中,拿到view调用Invalide()方法,查看画画板里面更新imageview的方法,在子线程里面能够经过postInvalide()方法;
 
56. 简单描述下Android 数字签名.
Android 数字签名:
在Android系统中,全部安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的做者和在应用程序之间创建信任关系  
Android系统要求每个安装进系统的应用程序都是通过数字证书签名的,数字证书的私钥则保存在程序开发者的手中.Android将数字证书用来标识应用程序的做者和在应用程序之间创建信任关系,不是用来决定最终用户能够安装哪些应用程序.
这个数字证书并不须要权威的数字证书签名机构认证(CA),它只是用来让应用程序包自我认证的.
同一个开发者的多个程序尽量使用同一个数字证书,这能够带来如下好处.
①有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不一样版本.若是新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不一样的程序,并产生冲突,会要求新程序更改包名.
②有利于程序的模块化设计和开发.Android系统容许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序.因此开发者能够将本身的程序分模块开发,而用户只须要在须要的时候下载适当的模块.
在签名时,须要考虑数字证书的有效期:
①数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级.
②若是多个程序使用同一个数字证书,则该数字证书的有效期要包含全部程序的预计生命周期.
③Android Market强制要求全部应用程序数字证书的有效期要持续到2033年10月22日之后.  
Android数字证书包含如下几个要点:
①全部的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
②Android程序包使用的数字证书能够是自签名的,不须要一个权威的数字证书机构签名认证
③若是要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布.
④数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期.若是程序已经安装在系统中,即便证书过时也不会影响程序的正常功能.
 
57. 什么是ANR 如何避免它?
在Android上,若是你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称做应用程序无响应(ANR:Application Not Responding)对话框.用户能够选择让程序继续运行,可是,他们在使用你的应用程序时,并不但愿每次都要处理这个对话框.所以,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户.Activity 5秒  broadcast10秒
耗时的操做 worker thread里面完成, handler message AsynTask , intentservice.等
 
58. android中的动画有哪几类,它们的特色和区别是什么?
两种,一种是Tween动画、还有一种是Frame动画.
Tween动画,这种实现方式可使视图组件移动、放大、缩小以及产生透明度的变化;
能够经过布局文件,能够经过代码.
 
59. 说说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中显示.
 
60. 经过点击一个网页上的url 就能够完成程序的自动安装,描述下原理
待补充...
 
61,Service和Activity在同一个线程吗  
默认状况同一线程 main主线程 ui线程
 
62,java中的soft reference是个什么东西
StrongReference 是 Java 的默认引用实现, 它会尽量长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收
SoftReference 会尽量长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 很是适合缓存
 
63,udp链接和TCP的不一样之处
tcp/滑动窗口协议. 拥塞控制.  
udp 不关心数据是否达到,是否阻塞  
画面优先:tcp   
流畅优先:udp
 
64, android开发中怎么去调试bug
逻辑错误  
①断点 debug   
②logcat
 
65.service里面能够弹Toast么
能够
 
66.写10个简单的linux命令
cat ls ps psw wc mv rm cd ping tracert find grep tail vi gcc make ifconfig startup dhcp
 
67 JNI调用经常使用的两个参数
 JNIEnv *env, jobject javaThis
 
68. 书写出android工程的目录结构  
  src  
  android. jar  
  asset
  res
  gen  
  manifest
 
69. ddms 和traceview的区别.
   daivilk debug manager system  
①在应用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字");
②一样在主activity的onStop方法中加入Debug.stopMethodTracing();
③同时要在AndroidManifest.xml文件中配置权限
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
④从新编译,安装,启动服务,测试完成取对应的traceview文件(adb pull /sdcard/xxxx.trace).
⑤直接在命令行输入traceview xxxxtrace,弹出traceview窗口,分析对应的应用便可.
traceview 分析程序执行时间和效率
KPI : key performance information : 关键性能指标:
splash界面不能超过5秒
从splash 界面加载mainactivity 不能超过0.7秒  
 
70, 同步异步的理解,什么是同步,什么是异步,屡次调用异步方法会出现什么问题.
待补充...
 
71. 利用mvc的模式重构代码
重构前的代码Bmi.java:
package com.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;
import android.widget.EditText;
import android.widget.TextView;
 
public class Bmi extends Activity {
    /** Called when the activity is first created. */
    @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) {
            DecimalFormat nf = new DecimalFormat("0.00");
            EditText fieldheight = (EditText) findViewById(R.id.height);
            EditText fieldweight = (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);
 
            TextView result = (TextView) findViewById(R.id.result);
            result.setText("Your BMI is " + nf.format(BMI));
 
            // Give health advice
            TextView fieldsuggest = (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()中; java

// 声明 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 OnClickListener calcBMI = new OnClickListener() {
    @Override
    public void onClick(View v) {
        DecimalFormat nf = 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)应该写在哪里,最终使维护和扩展代码变得更加容易!
其实,重构很简单,通读代码,感受哪边不太爽,就改那边吧!(我目前的感觉)
一个良好的代码应该是能让人感到舒服的!
 
重构后的代码Bmi.java:
package com.demo.android.bmi;
 
import java.text.DecimalFormat;
 
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.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 first created. */
    @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) {
            DecimalFormat nf = 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的机会更大,谈工资也有优点.

 

整理自:百度文库 linux


20150428 android


ANDROID面试笔记系列 面试

-------------------------------------------- sql

                    联系方式 数据库

-------------------------------------------- 编程

        Weibo: ARESXIONG 浏览器

        E-Mail: aresxdy@gmail.com 缓存

------------------------------------------------
相关文章
相关标签/搜索