darling_shadow吧 关注:26贴子:1,642

【Android】找找找啊。android常见的面试题(重复)....

只看楼主收藏回复




1楼2012-06-11 13:25回复
    3. 如何将一个Activity设置成窗口的样式
    简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的
    地方一句话:
    Xml代码
    android :theme="@android:style/Theme.Dialog"
    android:theme="@android:style/Theme.Dialog"
    这就使你的应用程序变成对话框的形式弹出来了,或者
    Xml代码
    android:theme="@android:style/Theme.Translucent"
    android:theme="@android:style/Theme.Translucent"
    就变成半透明的,[友情提示-.-]类似的这种activity的属性可以在android.R.styleable 类的AndroidManifestActivity 方法中看到,AndroidManifest.xml中所有元素的属性的介绍都可以参考这个类android.R.styleable
    上面说的是属性名称,具体有什么值是在android.R.style中 可以看到,比如这个"@android:style/Theme.Dialog" 就对应于android.R.style.Theme_Dialog ,('_'换成'.' <--注意:这个是文章内容不是笑脸)就可以用在描述文件 中了,找找类定义和描述文件中的对应关系就都明白了。


    4楼2012-06-11 13:28
    回复
      4. 如何退出Activity
      对于单一Activity的应用来说,退出很简单,直接finish()即可。
      当然,也可以用killProcess()和System.exit()这样的方法。
      现提供几个方法,供参考:
      1、抛异常强制退出:
      该方法通过抛异常,使程序Force Close。
      验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。
      2、记录打开的Activity:
      每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
      3、发送特定广播:
      在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
      4、递归退出
      在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
      除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。
      但是这样做同样不完美。
      你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。
      但至少,我们的目的达到了,而且没有影响用户使用。
      为了编程方便,最好定义一个Activity基类,处理这些共通问题。


      5楼2012-06-11 13:29
      回复
        6. 请介绍下Android的数据存储方式
        Android 提供了5种方式存储数据:
        --使用SharedPreferences存储数据;
        --文件存储数据;
        --SQLite数据库存储数据;
        --使用ContentProvider存储数据;
        --网络存储数据;先 说下,Preference,File, DataBase这三种方式分别对应的目录是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。在Android中通常使用File存储方式是用 Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName)。
        Context.openFileOutput(String fileName, int mode)生成的文件自动存储在/data/data/Package Name/files目录下,其全路径是/data/data/Package Name/files/fileName 。注意下,这里的参数fileName不可以包含路径分割符(如"/")。
        通常来说,这种方式生成的文件只能在这个apk内访问。但这个结论是指使用Context.openFileInput(String fileName)的方式。使用这种方式,每个apk只可以访问自己的/data/data/Package Name/files目录下的文件,原因很简单,参数fileName中不可以包含路径分割符,Android会自动在/data/data /Package Name/files目录下寻找文件名为fileName的文件。一:使用SharedPreferences存储数据
        首先说明SharedPreferences存储方式,它是 Android提供的用来存储一些简单配置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简 单的读取与写入,具体实例如下:
        void ReadSharedPreferences(){
        String strName,strPassword;
        SharedPreferences user = getSharedPreferences(“user_info”,0);
        strName = user.getString(“NAME”,””);
        strPassword = user getString(“PASSWORD”,””);
        }
        void WriteSharedPreferences(String strName,String strPassword){
        SharedPreferences user = getSharedPreferences(“user_info”,0);
        uer.edit();
        user.putString(“NAME”, strName);
        user.putString(“PASSWORD” ,strPassword);
        user.commit();
        }
        数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改 的数据。实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。以上面的数据存储结果为例,打开后可以看到一个user_info.xml的文件,打开后可以看到:
        <?xml version=”1.0〃 encoding=”UTF-8〃?>
        <map>
        <string name=”NAME”>moandroid</string>
        <string name=” PASSWORD”>SharedPreferences</string>
        </map>
        使用SharedPreferences是有些限制的:只能在同一个包内使用,不能在不同的包之间使用。二:文件存 储数据
        文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与 Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。 FilterInputStream, FilterOutputStream等可以到Java io package说明中去详细学习,不再此详细说明,具体实例如下:
        String fn = “moandroid.log”;
        FileInputStream fis = openFileInput(fn);
        FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);
        除此之外,Android还提供了其他函数来操作文件,详细说明请阅读Android SDK。
        三:网络存储数据
        网络存储方式,需要与Android 网络数据包打交道,关于Android 网络数据包的详细说明,请阅读Android SDK引用了Java SDK的哪些package?。


        7楼2012-06-11 13:32
        回复
          Android广播机制(两种注册方法) 在android下,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承BroadcastReceiver,就可以有一个广播接受器了。有个接受器还不够,我们还得重写BroadcastReceiver里面的onReceiver方法,当来广播的时候我们要干什么,这就要我们自己 来实现,不过我们可以搞一个信息防火墙。两种注册类型的区别是:
          1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
          2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。
          当实现了广播接收器,还要设置广播接收器接收广播信息的类型,这里是信息:android.provider.Telephony.SMS_RECEIVED
          我们就可以把广播接收器注册到系统里面,可以让系统知道我们有个广播接收器。这里有两种,一种是代码动态注册://生成广播处理
          smsBroadCastReceiver = new SmsBroadCastReceiver();
          //实例化过滤器并设置要过滤的广播
          IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
          BroadcastReceiver用于监听被广播的事件
          必须被注册,有两种方法:
          1、在应用程序的代码中注册
          注册BroadcastReceiver:
          registerReceiver(receiver,filter);
          取消注册BroadcastReceiver:
          unregisterReceiver(receiver);
          当BroadcastReceiver更新UI,通常会使用这样的方法注册。启动Activity时候注册 BroadcastReceiver,Activity不可见时候,取消注册。
          2、在androidmanifest.xml当中注册
          <receiver>
          <intent-filter>
          <action android:name = "android.intent.action.PICK"/>
          </intent-filter>
          </receiver>
          使用这样的方法注册弊端:它会始终处于活动状态,毕竟是手机开发,cpu和电源资源比较少,一直处于活动耗费大,不利。


          10楼2012-06-11 13:35
          回复
            10. 请解释下在单线程模型中Message、Handler、Message Queue、Looper之间的关系。
            1. Android进程
            在了解Android线程之前得先了解一下Android的进程。当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默 认的情况下,所有该程序的组件都将在该进程和线程中运行。
            同 时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android 会尝试停止一些进程从而释放足够的资源给其他新的进程使用, 也能保证用户正在访问的当前进程有足够的资源去及时地响应用户的事件。Android会根据进程中运行的组件类别以及组件的状态来判断该进程的重要 性,Android会首先停止那些不重要的进程。按照重要性从高到低一共有五个级别:
            前台进程
            前台进程是用户当前正在使用的进程。只有一些前台进程可以在任何时候都存在。他们是最后一个被结束的,当内存低到根本连他们都不能运行的时候。一般来说, 在这种情况下,设备会进行内存调度,中止一些前台进程来保持对用户交互的响应。
            可见进程
            可见进程不包含前台的组件但是会在屏幕上显示一个可见的进程是的重要程度很高,除非前台进程需要获取它的资源,不然不会被中止。
            服务进程
            运 行着一个通过startService() 方法启动的service,这个service不属于上面提到的2种更高重要性的。service所在的进程虽然对用户不是直接可见的,但是他们执行了用 户非常关注的任务(比如播放mp3,从网络下载数据)。只要前台进程和可见进程有足够的内存,系统不会回收他们。
            后台进程
            运 行着一个对用户不可见的activity(调用过 onStop() 方法).这些进程对用户体验没有直接的影响,可以在服务进程、可见进程、前台进 程需要内存的时候回收。通常,系统中会有很多不可见进程在运行,他们被保存在LRU (least recently used) 列表中,以便内存不足的时候被第一时间回收。如果一个activity正 确的执行了它的生命周期,关闭这个进程对于用户体验没有太大的影响。
            空进程
            未运行任何程序组件。运行这些进程的唯一原因是作为一个缓存,缩短下次程序需要重新使用的启动时间。系统经常中止这些进程,这样可以调节程序缓存和系统缓 存的平衡。
            Android 对进程的重要性评级的时候,选取它最高的级别。另外,当被另外的一个进程依赖的时候,某个进程的级别可能会增高。一个为其他进程服务的进程永远不会比被服 务的进程重要级低。因为服务进程比后台activity进程重要级高,因此一个要进行耗时工作的activity最好启动一个service来做这个工 作,而不是开启一个子进程――特别是这个操作需要的时间比activity存在的时间还要长的时候。例如,在后台播放音乐,向网上上传摄像头拍到的图片, 使用service可以使进程最少获取到“服务进程”级别的重要级,而不用考虑activity目前是什么状态。broadcast receivers做费时的工作的时候,也应该启用一个服务而不是开一个线程。
            2. 单线程模型
            当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处 理。所以主线程通常又被叫做UI线程。在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。
            2.1 子线程更新UI
            Android的UI是单线程(Single-threaded)的。为了避免拖住GUI,一些较费时的对象应该交给独立的线程去执行。如果幕后的线程来 执行UI对象,Android就会发出错误讯息
            CalledFromWrongThreadException。以后遇到这样的异常抛出时就要知道怎么回 事了!
            2.2 Message Queue
            在单线程模型下,为了解决类似的问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换。下面将对它们进行分别介绍:
            


            11楼2012-06-11 13:36
            回复
              1. Message
              Message消息,理解为线程间交流的信息,处理数据后台线程需要更新UI,则发送Message内含一些数据给UI线程。
              2. Handler
              Handler处理者,是Message的主要处理者,负责Message的发送,Message内容的执行处理。后台线程就是通过传进来的 Handler对象引用来sendMessage(Message)。而使用Handler,需要implement 该类的 handleMessage(Message)
              方法,它是处理这些Message的操作内容,例如Update UI。通常需要子类化Handler来实现handleMessage方法。
              3. Message Queue
              Message Queue消息队列,用来存放通过Handler发布的消息,按照先进先出执行。
              每个message queue都会有一个对应的Handler。Handler会向message queue通过两种方法发送消息:sendMessage或post。这两种消息都会插在message queue队尾并按先进先出执行。但通过这两种方法发送的消息执行的方式略有不同:通过sendMessage发送的是一个message对象,会被 Handler的handleMessage()函数处理;而通过post方法发送的是一个runnable对象,则会自己执行。
              4. Looper
              Looper是每条线程里的Message Queue的管家。Android没有Global的Message Queue,而Android会自动替主线程(UI线程)建立Message Queue,但在子线程里并没有建立Message Queue。所以调用Looper.getMainLooper()得到的主线程的Looper不为NULL,但调用Looper.myLooper() 得到当前线程的Looper就有可能为NULL。
              对于子线程使用Looper,API Doc提供了正确的使用方法:
              这个Message机制的大概流程:
              1. 在Looper.loop()方法运行开始后,循环地按照接收顺序取出Message Queue里面的非NULL的Message。
              2. 一开始Message Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message Queue,该函数里面设置了那个Message对象的target属性是当前的Handler对象。随后Looper取出了那个Message,则调用 该Message的target指向的Hander的dispatchMessage函数对Message进行处理。
              在dispatchMessage方法里,如何处理Message则由用户指定,三个判断,优先级从高到低:
              1) Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;
              2) Handler里面的mCallback指向的一个实现了Callback接口的对象,由其handleMessage进行处理;
              3) 处理消息Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息。
              由此可见,我们实现的handleMessage方法是优先级最低的!
              3. Handler处理完该Message (update UI) 后,Looper则设置该Message为NULL,以便回收!
              在网上有很多文章讲述主线程和其他子线程如何交互,传送信息,最终谁来执行处理信息之类的,个人理解是最简单的方法——判断Handler对象里面的 Looper对象是属于哪条线程的,则由该线程来执行!
              1. 当Handler对象的构造函数的参数为空,则为当前所在线程的Looper;
              2. Looper.getMainLooper()得到的是主线程的Looper对象,Looper.myLooper()得到的是当前线程的Looper对 象。
              现在来看一个例子,模拟从网络获取数据,加载到ListView的过程:
              这个例子,我自己写完后觉得还是有点乱,要稍微整理才能看明白线程间交互的过程以及数据的前后变化。随后了解到AsyncTask类,相应修改后就很容易 明白了!


              12楼2012-06-11 13:36
              回复
                11. AIDL的全称是什么?如何工作?能处理哪些类型的数据
                部分概念:
                在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.
                AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文 件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如 果需要在一个Activity中, 访问另一个Service中的某个对象, 需 要先将对象转化成AIDL可识别的参数(可能是多个参数), 然后使用AIDL来 传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
                AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件 事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.
                AIDL的 创建方法:
                AIDL语 法很简单,可以用来声明一个带一个或多个方法的接口,也可以传 递参数和返回值。 由于远程调用的需要, 这些参数和返回值并不是任何 类型.下面是些AIDL支持的数据类型:
                1. 不 需要import声明的简单Java编程语言类型(int,boolean等)
                2. String, CharSequence不需要特殊声明
                3. List, Map和Parcelables类 型, 这些类型内所包含的数据成员也只能是简单数据类型, String等其他比支持的类型.


                13楼2012-06-11 13:36
                回复
                  2. Activity和Task的启动模式有哪些? 每种含义是什么?
                  有关在AndroidManifest.xml中的android:launchMode定义,主要有standard、singleTop、singleTask和singleInstance,同时对于android:taskAffinity这些问题大家也要了解,Android开发网在以前的文章中讲过,不过很多开发者仍然不是很清楚,这些基础问题我们以后仍然会再次总结。


                  14楼2012-06-11 13:39
                  回复
                    1. Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗?
                    这里Android123提示大家,Intent的一些标记有FLAG_ACTIVITY_BROUGHT_TO_FRONT 、FLAG_ACTIVITY_CLEAR_TOP、FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、FLAG_ACTIVITY_MULTIPLE_TASK和FLAG_ACTIVITY_NEW_TASK 等。每种含义大家看SDK文档和具体跑下这样你的记忆会更深刻些。


                    15楼2012-06-11 13:39
                    回复
                      3. 通过Intent传递一些二进制数据的方法有哪些? 1). 使用Serializable接口实现序列化,这是Java常用的方法。 2). 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。
                      4. 能说下Android应用的入口点吗? 真正的Android入口点是application的main,你可以看下androidmanifest.xml的包含关系就清楚了。 可以没有Activity但是必须有Application
                      5. Android都有哪些XML解析器,都熟练掌握吗? 这里XmlPull、SAX和DOM相信做过Web开发的都已经滚瓜烂熟了。
                      6. SQLite支持事务吗? 添加删除如何提高性能? SQLite作为轻量级的数据库,比MySQL还小,但支持SQL语句查询,提高性能可以考虑通过原始经过优化的SQL查询语句方式处理。
                      7. Android Service和Binder、AIDL你都熟练吗? 作为Android重要的后台服务,这些每个Android开发者都应该掌握,这也算是和Java SE最大的不同了,具体的实例大家可以查看Android音乐播放器的源代码Music.git中的,这里不再赘述。


                      16楼2012-06-11 13:41
                      回复
                        返回键与Home键区别?
                        back键默认行为是finish处于前台的Activity的即Activity的状态为Destroy状态为止,再次启动该Activity是从onCreate开始的(不会调用onSaveInstanceState方法)。Home键默认是stop前台的Activity即状态为onStop为止而不是Destroy,若再次启动它,会调用onSaveInstanceState方法,保持上次Activity的状态则是从OnRestart开始的---->onStart()--->onResume()。


                        17楼2012-06-11 13:42
                        回复
                          5.java线程的sleep(),wait(),notify(),yield()方法的区别?
                          1.sleep()使线程休眠一段时间,一段时间结束后,线程进入可执行状态,但并不是立即执行,只是在被排程器调用的时候才执行。在休眠期间,并不释放所持有的“锁”;
                          2.wait()使线程休眠一段时间,若设置参数,时间到时,线程就自动进入可执行状态。若没有,则需要notify()方法去调用。注意:wait()方法和notify()方法都时针对this对象的,调用wait()方法后,会释放加在对象上的“锁”。
                          3.yield()使线程放弃执行的权利,进入可执行状态,也就意味着线程在yield()方法后,有可能又执行。使用yield()方法,线程并不释放自己锁持有的“锁”。


                          18楼2012-06-11 13:43
                          回复
                            IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作,如保存设定或注册一个Notification。和在主线程里调用的其它方法一样,应用程序应该避免在BroadcastReceiver里做耗时的操作或计算,但也不是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。顺便提及一句,你也应该避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。
                            一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值,下面总结了一些技巧来避免ANR,并有助于让你的应用程序看起来有响应性。
                            如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度(ProgressBar和ProgressDialog对这种情况来说很有用)。特别是游戏,在子线程里做移动的计算。如果你的程序有一个耗时的初始化过程的话,考虑可以显示一个Splash Screen或者快速显示主画面并异步来填充这些信息。在这两种情况下,你都应该显示正在进行的进度,以免用户认为程序被冻结了。
                            14.什么情况会导致Force Close?如何避免?能否捕获导致其的异常?
                            答:如空指针等可以导致ForceClose;可以看Logcat,然后找到对应的程序代码来解决错误。
                            15.横竖屏切换时候的activity的生命周期:
                            答:
                            1) 新建一个activity,并把各个生命周期打印出来
                            2) 运行activity,得到如下信息:
                            onCreate()à
                            onStart()à
                            onResume()à
                            3) 按ctrl+F12切换成横屏时
                            onSaveInstanceState()à
                            onPause()à
                            onStop()à
                            onDestroy()à
                            onCreate()à
                            onStart()à
                            onRestoreInstanceState()à
                            onResume()à
                            4) 再按ctrl+f12切换成竖屏时,发现打印了两次相同的Log
                            onSaveInstanceState()à
                            onPause()à
                            onStop()à
                            onDestroyà
                            onCreate()à
                            onStart()à
                            onRestoreInstanceState()à
                            onResume()à
                            onSaveInstanceState()à
                            onPause()à
                            onStop()à
                            onDestroyà
                            onCreate()à
                            onStart()à
                            onRestoreInstanceState()à
                            onResume()à
                            5) 修改AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,执行步骤3
                            onSaveInstanceState()à
                            onPause()à
                            onStop()à
                            onDestroy()à
                            onCreate()à
                            onStart()à
                            onRestoreInstanceState()à
                            onResume()à
                            6) 修改AndroidManifest.xml,把该Activity添加android:configChanges=“orientation”,执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged
                            onSaveInstanceState()à
                            onPause()à
                            onStop()à
                            onDestroy()à
                            onCreate()à
                            onStart()à
                            onRestoreInstanceState()à
                            onResume()à
                            onConfigurationChanged()à
                            7) 把步骤5的android:configChanges=“orientation”改成
                            android:configChanges=“orientation|keyboradHidden”,执行步骤3,就只打印onConfigChanged
                            onConfigurationChanged()à
                            


                            21楼2012-06-11 13:46
                            回复
                              运行库和androidruntion:运行库:即c/c++函数库部分,大多数都是开放源代码的函数库,例如webkit,该函数库负责android网页浏览器的运行;例如标准的c函数库libc、openssl、sqlite等,当然也包括支持游戏开发的2dsgl和3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,如mpeg4、h.264、mp3、aac、amr、jpg和png等众多的多媒体文件格式。Androidruntion负责解释和执行生成的dalvik格式的字节码
                              应用软件架构:java应用程序开发人员主要是使用该层封装好的api进行快速开发的。
                              应用程序层:该层是java的应用程序层,android内置的googlemaps、email、IM、浏览器等,都处于该层,java开发人员工发的程序也处于该层,而且和内置的应用程序具有平等的地位,可以调用内置的应用程序,也可以替换内置的应用程序
                              23.Activity 与 Task的启动模式有哪些,它们含义具体是什么?
                              答:在一个activity中,有多次调用startActivity来启动另一个activity,要想只生成一个activity实例,可以设置启动模式。
                              一个activity有四种启动模式:standed,signleTop,singleTask,singleInstance
                              Standed:标准模式,一调用startActivity()方法就会产生一个新的实例。
                              SingleTop:如果已经有一个实例位于activity栈顶,就不产生新的实例,而只是调用activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。
                              singleTask:会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。
                              SingleInstance:这个和singleTask基本一样,只有一个区别:在这个模式下的activity实例所处的task中,只能有这个activity实例,不能有其他实例
                              24.Application类的作用:
                              答:API里的第一句是:
                              Base class for those who need to maintain global application state
                              如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型;而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就是使用Application context。
                              首先需要重写Application,主要重写里面的onCreate方法,就是创建的时候,初始化变量的值。然后在整个应用中的各个文件中就可以对该变量进行操作了。
                              启动Application时,系统会创建一个PID,即进程ID,所有的Activity就会在此进程上运行。那么我们在Application创建的时候初始化全局变量,同一个应用的所有Activity都可以取到这些全局变量的值,换句话说,我们在某一个Activity中改变了这些全局变量的值,那么在同一个应用的其他Activity中值就会改变
                              25.说明onSaveInstanceState() 和 onRestoreInstanceState()在什么时候被调用:
                              答:Activity的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,它们不同于 onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)由系统销毁一个Activity时,onSaveInstanceState()才会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
                              另外,当屏幕的方向发生了改变, Activity会被摧毁并且被重新创建,如果你想在Activity被摧毁前缓存一些数据,并且在Activity被重新创建后恢复缓存的数据。可以重写Activity的 onSaveInstanceState() 和 onRestoreInstanceState()方法。
                              26.android的service的生命周期?哪个方法可以多次被调用:
                              答:1)与采用Context.startService()方法启动服务有关的生命周期方法
                              


                              23楼2012-06-11 13:46
                              回复