Android常见面试题1

87654321 贡献于2016-06-30

作者 admin  创建于2015-06-10 01:05:00   修改者admin  修改于2015-07-11 10:16:00字数16201

文档摘要:1. android中常用的四个布局是framlayout,linenarlayout,relativelayout和tablelayout。 2. android 的四大组件是activity,service,broadcast和contentprovider。 3. java.io包中的ObjectInputStream和ObjectOutpuStream类主要用于对对象(Object)的读写。 4. android 中service的实现方法是:startservice和bindservice。
关键词:

二.填空题 1.      android中常用的四个布局是framlayout,linenarlayout,relativelayout和tablelayout。2.      android 的四大组件是activity,service,broadcast和contentprovider。 3.      java.io包中的ObjectInputStream和ObjectOutpuStream类主要用于对对象(Object)的读写。4.      android 中service的实现方法是:startservice和bindservice。 5.      activity一般会重载7个方法用来维护其生命周期, onCreate(),onStart(),onDestory(),onrestart,onresume,onpause,onstop。 6.      android的数据存储的方式sharedpreferences,文件,SQlite,contentprovider,网络。 7.     当启动一个Activity并且新的Activity执行完后需要返回到启动它的Activity来执行的回调函数是startActivityResult()。 8.     请继承SQLiteOpenHelper实现:(10分)   1).创建一个版本为1的“diaryOpenHelper.db”的数据库,    2).同时创建一个 “diary” 表(包含一个_id主键并自增长,topic字符型100        长度, content字符型1000长度)    3).在数据库版本变化时请删除diary表,并重新创建出diary表。 publicclass DBHelper  extends SQLiteOpenHelper{        public final static String DATABASENAME ="diaryOpenHelper.db";        public final static int DATABASEVERSION =1;        //创建数据库        public DBHelper(Context context,Stringname,CursorFactory factory,int version)        {               super(context, name, factory,version);        }        //创建表等机构性文件        public void onCreate(SQLiteDatabase db)        {               String sql ="create tablediary"+                                    "("+                                    "_idinteger primary key autoincrement,"+                                    "topicvarchar(100),"+                                    "contentvarchar(1000)"+                                    ")";               db.execSQL(sql);        }        //若数据库版本有更新,则调用此方法        public void onUpgrade(SQLiteDatabasedb,int oldVersion,int newVersion)        {                              String sql = "drop table ifexists diary";               db.execSQL(sql);               this.onCreate(db);        } } 9.     页面上现有ProgressBar控件progressBar,请用书写线程以10秒的的时间完成其进度显示工作。(10分)答案 publicclass ProgressBarStu extends Activity {        private ProgressBar progressBar = null;        protected void onCreate(BundlesavedInstanceState) {               super.onCreate(savedInstanceState);               setContentView(R.layout.progressbar);               //从这到下是关键               progressBar = (ProgressBar)findViewById(R.id.progressBar);                              Thread thread = new Thread(newRunnable() {                                            @Override                      public void run() {                             int progressBarMax =progressBar.getMax();                             try {                                    while(progressBarMax!=progressBar.getProgress())                                    {                                                                                      intstepProgress = progressBarMax/10;                                           intcurrentprogress = progressBar.getProgress();                                           progressBar.setProgress(currentprogress+stepProgress);                                           Thread.sleep(1000);                                    }                                                                 } catch(InterruptedException e) {                                    // TODO Auto-generatedcatch block                                    e.printStackTrace();                             }                                                   }               });                              thread.start();               //关键结束        }         } 10.   请描述下Activity的生命周期。      必调用的三个方法:onCreate() --> onStart() --> onResume(),用AAA表示 (1)父Activity启动子Activity,子Actvity退出,父Activity调用顺序如下 AAA --> onFreeze() --> onPause() --> onStop() --> onRestart()--> onStart(),onResume() … (2)用户点击Home,Actvity调用顺序如下 AAA --> onFreeze() --> onPause() --> onStop() -- Maybe -->onDestroy() – Maybe (3)调用finish(), Activity调用顺序如下 AAA --> onPause() --> onStop() --> onDestroy() (4)在Activity上显示dialog,Activity调用顺序如下AAA (5)在父Activity上显示透明的或非全屏的activity,Activity调用顺序如下 AAA --> onFreeze() --> onPause() (6)设备进入睡眠状态,Activity调用顺序如下 AAA --> onFreeze() --> onPause() 覆写onFreeze 方法(与onCreate 方法的作用类似) 来保存冻结前的状态 11.      如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?      onSaveInstanceState()       当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回 收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被 收回的就直接执行onResume(),跳过onCreate()了。 12.       如何将一个Activity设置成窗口的样式。       在AndroidManifest.xml 中定义Activity的地方一句话android:theme="@android:style/Theme.Dialog"或 android:theme="@android:style/Theme.Translucent"就变成半透明的 13.     如何退出Activity?如何安全退出已调用多个Activity的Application? 对于单一Activity的应用来说,退出很简单,直接finish()即可。 当然,也可以用killProcess()和System.exit()这样的方法。 14.    请介绍下Android中常用的五种布局。 FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局) 15.    请介绍下Android的数据存储方式。 一.SharedPreferences方式 二.文件存储方式 三.SQLite数据库方式 四.内容提供器(Content provider)方式 五. 网络存储方式 16.     请介绍下ContentProvider是如何实现数据共享的。 创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Contentprovider中, 前提是有相同数据类型并且有写入Content provider的权限。 17.    如何启用Service,如何停用Service。 Android中的service类似于windows中的service,service一般没有用户操作界面,它运行于系统中不容易被用户发觉, 可以使用它开发如监控之类的程序。 一。步骤 第一步:继承Service类 public class SMSService extends Service { } 第二步:在AndroidManifest.xml文件中的节点里对服务进行配置: 二。Context.startService()和Context.bindService 服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可 以启动Service,但是它们的使用场合有所不同。 1.使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止。 2.采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法, 接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并 不会导致多次创建服务,但会导致多次调用onStart()方法。 采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用 onDestroy()方法。 3.采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法, 接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法, 。接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会 导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务 解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。 三。Service的生命周期 1.Service常用生命周期回调方法如下: onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法, 服务也只被创建一次。 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);//解除绑定 18.    注册广播有几种方式,这些方式有何优缺点?请谈谈Android引入广播机制的用意。   Android广播机制(两种注册方法) 在android下,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承BroadcastReceiver,就可以有一个广播接 受器了。有个接受器还不够,我们还得重写BroadcastReceiver里面的onReceiver方法,当来广播的时候我们要干什么,如下代码是短消息防火墙 public class SmsBroadCastReceiverextends BroadcastReceiver    {      @Override      public void onReceive(Context context, Intent intent)       {           Bundle bundle = intent.getExtras();          Object[] object = (Object[])bundle.get("pdus");           SmsMessage sms[]=new SmsMessage[object.length];           for(int i=0;i                                                                                                                                                                                                                                                         两种注册类型的区别是:     1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。     2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。 19.    请解释下在单线程模型中Message、Handler、MessageQueue、Looper之间的关系。 Handler简介: 一个Handler允许你发送和处理Message和Runable对象,这些对象和一个线程的MessageQueue相关联。每一个线程实例和一个单独的线程以及该线程的MessageQueue相关联。当你创建一个新的Handler时,它就和创建它的线程绑定在一起了。这里,线程我们也可以理解为线程的MessageQueue。从这一点上来看,Handler把Message和Runable对象传递给MessageQueue,而且在这些对象离开MessageQueue时,Handler负责执行他们。 Handler有两个主要的用途:(1)确定在将来的某个时间点执行一个或者一些Message和Runnable对象。(2)在其他线程(不是Handler绑定线程)中排入一些要执行的动作。 Scheduling Message,即(1),可以通过以下方法完成: 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 voidhandleMessage(Message msg) {                   // process incomingmessages here               }           };                      Looper.loop();       }   } 20.       AIDL的全称是什么?如何工作?能处理哪些类型的数据? AIDL的英文全称是Android Interface Define Language 当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的 A工程: 首先我们在net.blogjava.mobile.aidlservice包中创建一个RemoteService.aidl文件,在里面我们自定义一个接口,含有方法get。ADT插件会在gen目录下自动生成一个RemoteService.java文件,该类中含有一个名为RemoteService.stub的内部类,该内部类中含有aidl文件接口的get方法。 说明一:aidl文件的位置不固定,可以任意 然后定义自己的MyService类,在MyService类中自定义一个内部类去继承RemoteService.stub这个内部类,实现get方法。在onBind方法中返回这个内部类的对象,系统会自动将这个对象封装成IBinder对象,传递给他的调用者。 其次需要在AndroidManifest.xml文件中配置MyService类,代码如下:                          为什么要指定调用AIDL服务的ID,就是要告诉外界MyService这个类能够被别的进程访问,只要别的进程知道这个ID,正是有了这个ID,B工程才能找到A工程实现通信。 说明:AIDL并不需要权限 B工程:       首先我们要将A工程中生成的RemoteService.java文件拷贝到B工程中,在bindService方法中绑定aidl服务       绑定AIDL服务就是将RemoteService的ID作为intent的action参数。       说明:如果我们单独将RemoteService.aidl文件放在一个包里,那个在我们将gen目录下的该包拷贝到B工程中。如果我们将RemoteService.aidl文件和我们的其他类存放在一起,那么我们在B工程中就要建立相应的包,以保证RmoteService.java文件的报名正确,我们不能修改RemoteService.java文件           bindService(newInten("net.blogjava.mobile.aidlservice.RemoteService"),serviceConnection, Context.BIND_AUTO_CREATE);       ServiceConnection的onServiceConnected(ComponentName name, IBinderservice)方法中的service参数就是A工程中MyService类中继承了RemoteService.stub类的内部类的对象。 21.    你如何评价Android系统?优缺点。答:Android平台手机 5大优势:  一、开放性  在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。显著的开放性可以使其拥有更多的开发 者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而 对于消费者来讲,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。 二、挣脱运营商的束缚  在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市,用户可以更加方便地连接网络,运营商的制约减少。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商 口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头Google推动的 Android终端天生就有网络特色,将让用户离互联网更近。 三、丰富的硬件选择  这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。功能上的差异和特色,却 不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢? 四、不受任何限制的开发商  Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给 Android难题之一。 五、无缝结合的Google应用  如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。 再说Android的5大不足: 一、安全和隐私  由于手机与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。 二、首先开卖Android手机的不是最大运营商  众所周知,T-Mobile在23日,于美国纽约发布了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和 Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服 务则要另当别论了! 三、运营商仍然能够影响到Android手机  在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。 四、同类机型用户减少  在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这 样使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群 组,除了哪些功能异常抢眼、颇受追捧的机型以外。 五、过分依赖开发商缺少标准配置  在使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在 Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐播放器,全部依赖第三方开发,缺少了产品 的统一性。 22.  什么是ANR 如何避免它?    答:ANR:Application NotResponding,五秒  在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当出现下列情况时,Android就会显示ANR对话框了:    对输入事件(如按键、触摸屏事件)的响应超过5秒    意向接受器(intentReceiver)超过10秒钟仍未执行完毕    Android应用程序完全运行在一个独立的线程中(例如main)。这就意味着,任何在主线程中运行的,需要消耗大量时间的操作都会引发ANR。因为此时,你的应用程序已经没有机会去响应输入事件和意向广播(Intentbroadcast)。   因此,任何运行在主线程中的方法,都要尽可能的只做少量的工作。特别是活动生命周期中的重要方法如 onCreate()和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据库;或者是开销很大的计算,比如改变位图的大小,需要在一个单独的子线程中完成 (或者是使用异步请求,如数据库操作)。但这并不意味着你的主线程需要进入阻塞状态已等待子线程结束 -- 也不需要调用Therad.wait()或者Thread.sleep()方法。取而代之的是,主线程为子线程提供一个句柄(Handler),让子线程 在即将结束的时候调用它(xing:可以参看Snake的例子,这种方法与以前我们所接触的有所不同)。使用这种方法涉及你的应用程序,能够保证你的程序 对输入保持良好的响应,从而避免因为输入事件超过5秒钟不被处理而产生的ANR。这种实践需要应用到所有显示用户界面的线程,因为他们都面临着同样的超时 问题。 23.     什么情况会导致Force Close ?如何避免?能否捕获导致其的异常?    答:一般像空指针啊,可以看起logcat,然后对应到程序中 来解决错误  24.     简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver   答:一个activity呈现了一个用户可以操作的可视化用户界面    一个service不包含可见的用户界面,而是在后台无限地运行    可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的借口与其进行通信    一个broadcast receiver是一个接收广播消息并作出回应的component,broadcastreceiver没有界面    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文件中声明的。 25.      IntentService有何优点?    答:IntentService 的好处    * Acitivity的进程,当处理Intent的时候,会产生一个对应的Service    * Android的进程处理器现在会尽可能的不kill掉你    * 非常容易使用  26.     横竖屏切换时候activity的生命周期?    1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次    2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次    3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法    如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?    解答:可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res aw目录中 27.     如何将打开res raw目录中的数据库文件?    解答:在Android中不能直接打开res raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用 getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase 方法来打开任意目录中的SQLite数据库文件。 28.     Android引入广播机制的用意?    答:a:从MVC的角度考虑(应用程序内)   其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了 点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充 关系,引入广播机制可以方便几大组件的信息和数据交互。   b:程序间互通消息(例如在自己的应用程序内监听系统来电)    c:效率上(参考UDP的广播协议在局域网的方便性)    d:设计模式上(反转控制的一种应用,类似监听者模式) 29.     Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念    DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。 30.     一条最长的短信息约占多少byte?    中文70(包括标点),英文160,160个字节。  31.     android中的动画有哪几类,它们的特点和区别是什么?    两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。 32.     handler机制的原理    andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。   1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。    2)Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。   3) Message Queue(消息队列):用来存放线程放入的消息。    4)线程:UIthread 通常就是main thread,而Android启动程序时会替它建立一个MessageQueue。   33.     说说mvc模式的原理,它在android中的运用   MVC(Model_view_contraller)”模型_视图_控制器”。 MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要 Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。 34.    DDMS和TraceView的区别?  DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器。 35.    java中如何引用本地语言  可以用JNI(java nativeinterface  java 本地接口)接口。 36.    谈谈Android的IPC(进程间通信) 机制 IPC是内部进程通信 的简称,是共享"命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android 中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接 口。Servier端实现IPC接口,Client端调用IPC接口本地代理。 37.    NDK是什么? NDK是一些列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。 NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档