Android 70道面试题汇总

  1. 下列哪些语句关于内存回收的说明是正确的? (b )
          A、 程序员必须建立一个线程来释放内存
      B、 内存回收程序负责释放无用内存
      C、 内存回收程序容许程序员直接释放内存
      D、 内存回收程序能够在指定的时间释放内存对象

  2. 下面异常是属于Runtime Exception 的是(abcd)(多选)
          A、ArithmeticException
      B、IllegalArgumentException
      C、NullPointerException
      D、BufferUnderflowException

  3. Math.round(11.5)等于多少(). Math.round(-11.5)等于多少(c). c
        A、11 ,-11
        B、11 ,-12
        C、12 ,-11
        D、12 ,-12

  4. 下列程序段的输出结果是:(b )java

  void complicatedexpression_r(){

       int x=20, y=30;

      boolean b;

      b=x>50&&y>60||x>50&&y<-60||x<-50&&y>60||x<-50&&y<-60;

      System.out.println(b);

  }

    A、true B、false C、1 D、011.activitylinux

 

  5. 对一些资源以及状态的操做保存,最好是保存在生命周期的哪一个函数中进行(d)android

    A、onPause()c++

    B、onCreate()程序员

    C、onResume()web

    D、onStart()面试

 

  6. Intent传递数据时,下列的数据类型哪些能够被传递(abcd)(多选)sql

    A、Serializable B、charsequence C、Parcelable D、Bundle数据库

 

  7. android 中下列属于Intent的做用的是(c)express

    A、实现应用程序间的数据共享

    B、是一段长的生命周期,没有用户界面的程序,能够保持应用在后台运行,而不会由于切换页面而消失

    C、能够实现界面间的切换,能够包含动做和动做数据,链接四大组件的纽带

    D、处理一个应用程序总体性的工做

 

  8. 下列属于SAX解析xml文件的优势的是(b)

    A、将整个文档树在内存中,便于操做,支持删除,修改,从新排列等多种功能

    B、不用事先调入整个文档,占用资源少

    C、整个文档调入内存,浪费时间和空间

    D、不是长久驻留在内存,数据不是持久的,事件事后,若没有保存数据,数据就会消失

 

  9. 下面的对自定style的方式正确的是A

    A、 <resources>
             <style name="myStyle">
                            <itemname="android:layout_width">fill_parent</item>
                      </style>
      </resources>
       B、 <style name="myStyle">
                            <itemname="android:layout_width">fill_parent</item>
         </style>
       C、 <resources>
                            <itemname="android:layout_width">fill_parent</item>
       </resources>
       D、 <resources>
                            <stylename="android:layout_width">fill_parent</style>
        </resources>

 

  10. 在android中使用Menu时可能须要重写的方法有(ac)。(多选)

    A、onCreateOptionsMenu()

    B、onCreateMenu()

    C、onOptionsItemSelected()

    D、onItemSelected()

 

  11. 在SQL Server Management Studio 中运行下列T-SQL语句,其输出值(c)。 SELECT @@IDENTITY

    A、 可能为0.1

    B、 可能为3

    C、 不可能为-100

    D、 确定为0


  12. 在SQL Server 2005中运行以下T-SQL语句,假定SALES表中有多行数据,执行查询之 后的结果是(d)。 


        BEGIN TRANSACTION A
    Update SALES Set qty=30 WHERE qty<30
    BEGIN TRANSACTION B
    Update SALES Set qty=40 WHEREqty<40
    Update SALES Set qty=50 WHEREqty<50
    Update SALES Set qty=60 WHEREqty<60
    COMMIT TRANSACTION B
    COMMIT TRANSACTION A

  A、SALES表中qty列最小值大于等于30

  B、SALES表中qty列最小值大于等于40

  C、SALES表中qty列的数据所有为50

  D、SALES表中qty列最小值大于等于60

 

  13. 在android中使用SQLiteOpenHelper这个辅助类时,能够生成一个数据库,并能够对数据库版本进行管理的方法能够是(ab)

    A、getWriteableDatabase()

    B、getReadableDatabase()

    C、getDatabase()

    D、getAbleDatabase()


  14. android 关于service生命周期的onCreate()和onStart()说法正确的是(ad)(多选题)

    A、当第一次启动的时候前后调用onCreate()和onStart()方法

    B、当第一次启动的时候只会调用onCreate()方法

    C、若是service已经启动,将前后调用onCreate()和onStart()方法

    D、若是service已经启动,只会执行onStart()方法,不在执行onCreate()方法

 

  15. 下面是属于GLSurFaceView特性的是(abc)(多选)

    A、管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。

    B、管理一个EGL display,它能让opengl把内容渲染到上述的surface上。

    C、让渲染器在独立的线程里运做,和UI线程分离。

    D、能够直接从内存或者DMA等硬件接口取得图像数据

 

  16. 下面在AndroidManifest.xml文件中注册BroadcastReceiver方式正确 A

    A、<receiver android:name="NewBroad">
                     <intent-filter>
                            <action android:name="android.provider.action.NewBroad"/><action>
                     </intent-filter>
               </receiver>
       B、<receiver android:name="NewBroad">
                     <intent-filter>
                     android:name="android.provider.action.NewBroad"/>
                     </intent-filter>
               </receiver>
       C、<receiver android:name="NewBroad">
                     <action android:name="android.provider.action.NewBroad"/><action>
               </receiver>
       D、<intent-filter>
             <receiver android:name="NewBroad">
                           <action>
                       android:name="android.provider.action.NewBroad"/>
                     <action>
                     </receiver>
      </intent-filter> 

 

  17. 关于ContenValues类说法正确的是(a)

    A、他和Hashtable比较相似,也是负责存储一些名值对,可是他存储的名值对当中的名是String类型,而值都是基本类型

    B、他和Hashtable比较相似,也是负责存储一些名值对,可是他存储的名值对当中的名是任意类型,而值都是基本类型

    C、他和Hashtable比较相似,也是负责存储一些名值对,可是他存储的名值对当中的名,能够为空,而值都是String类型

    D、他和Hashtable比较相似,也是负责存储一些名值对,可是他存储的名值对当中的名是String类型,而值也是String类型

 

   18. 咱们都知道Hanlder是线程与Activity通讯的桥梁,若是线程处理不当,你的机器就会变得越慢,那么线程销毁的方法是(a)

    A、onDestroy()

    B、onClear()

    C、onFinish()

    D、onStop()

 

  19. 下面退出Activity错误的方法是(c)

    A、finish()

    B、抛异常强制退出

    C、System.exit()

    D、onStop()

 

  20. 下面属于android的动画分类的有(ab)(多项)

    A、Tween

    B、Frame

    C、Draw

    D、Animation

  21. 下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是(d)

    A、DVM指dalivk的虚拟机.每个Android应用程序都在它本身的进程中运行,

      不必定拥有一个独立的Dalvik虚拟机实例.而每个DVM都是在Linux中的一个进程,因此说能够认为是同一个概念.

    B、DVM指dalivk的虚拟机.每个Android应用程序都在它本身的进程中运行,

      不必定拥有一个独立的Dalvik虚拟机实例.而每个DVM不必定都是在Linux中的一个进程,因此说不是一个概念.

    C、DVM指dalivk的虚拟机.每个Android应用程序都在它本身的进程中运行,都拥有一个独立的Dalvik虚拟机实例.

      而每个DVM不必定都是在Linux中的一个进程,因此说不是一个概念.

    D、DVM指dalivk的虚拟机.每个Android应用程序都在它本身的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.

      而每个DVM都是在Linux中的一个进程,因此说能够认为是同一个概念.

  22. Android项目工程下面的assets目录的做用是什么b

    A、放置应用到的图片资源。

    B、主要放置多媒体等数据文件

    C、放置字符串,颜色,数组等常量数据

    D、放置一些与UI相应的布局文件,都是xml文件

 


  23. 关于res/raw目录说法正确的是(a)

    A、 这里的文件是原封不动的存储到设备上不会转换为二进制的格式

    B、这里的文件是原封不动的存储到设备上会转换为二进制的格式

    C、 这里的文件最终以二进制的格式存储到指定的包中

    D、这里的文件最终不会以二进制的格式存储到指定的包中

 

  24. 下列对android NDK的理解正确的是(abcd )

    A、 NDK是一系列工具的集合

    B、 NDK 提供了一份稳定、功能有限的 API 头文件声明。

    C、 使 “Java+C” 的开发方式终于转正,成为官方支持的开发方式

    D、 NDK 将是 Android 平台支持 C 开发的开端

 

  2、Android面试填空题

  25. android中经常使用的四个布局是framlayout,linenarlayout,relativelayout和tablelayout。

  26. android 的四大组件是activiey,service,broadcast和contentprovide。

  27. java.io包中的objectinputstream和objectoutputstream类主要用于对对象(Object)的读写。

  28. android 中service的实现方法是:startservice和bindservice。

  29. activity通常会重载7个方法用来维护其生命周期,除了onCreate(),onStart(),onDestory() 外还有onrestart,onresume,onpause,onstop。

  30. android的数据存储的方式sharedpreference,文件,SQlite,contentprovider,网络。

  31. 当启动一个Activity而且新的Activity执行完后须要返回到启动它的Activity来执行 的回调函数是startActivityResult()。

  32. 请使用命令行的方式建立一个名字为myAvd,sdk版本为2.2,sd卡是在d盘的根目录下,名字为scard.img,

    并指定屏幕大小HVGA.____________________________________。

  33. 程序运行的结果是:_____good and gbc__________。

package com.test;

public class Test {

    String str = new String("good");

    char[] ch = { 'a', 'b', 'c' };

    public static void main(String args[]) {
        Test ex = new Test();
        ex.change(ex.str, ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }

    public void change(String str, char ch[]) {
        str = "test ok";
        ch[0] = 'g';
    }
}

 

    34. 在android中,请简述jni的调用过程。(8分)

    1)安装和下载Cygwin,下载 Android NDK

    2)在ndk项目中JNI接口的设计

    3)使用C/C++实现本地方法

    4)JNI生成动态连接库.so文件

    5)将动态连接库复制到java工程,在java工程中调用,运行java工程便可


  35. 简述Android应用程序结构是哪些?(7分)

    Android应用程序结构是:

    Linux Kernel(Linux内核)、

    Libraries(系统运行库或者是c/c++核心库)、

    Application Framework(开发框架包)、

    Applications (核心应用程序)

 

  36. 请继承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);   }
}

   37. 页面上现有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();   //关键结束   } }

 38. 请描述下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()

 

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

    onSaveInstanceState()

    当你的程序中某一个Activity A在运行时,主动或被动地运行另外一个新的Activity B,

    这个时候A会执行onSaveInstanceState()。B完成之后又会来找A,这个时候就有两种状况:

    一是A被回收,二是A没有被回收,被回收的A就要从新调用onCreate()方法,不一样于直接启动的

    是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。

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

     在AndroidManifest.xml 中定义Activity的地方一句话

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

    或android:theme="@android:style/Theme.Translucent"就变成半透明的

 

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

    对于单一Activity的应用来讲,退出很简单,直接finish()便可。

    固然,也能够用killProcess()和System.exit()这样的方法。

    可是,对于多Activity的应用来讲,在打开多个Activity后,若是想在最后打开的Activity直接退出,

    上边的方法都是没有用的,由于上边的方法都是结束一个Activity而已。

    固然,网上也有人说能够。

    就好像有人问,在应用里如何捕获Home键,有人就会说用keyCode比较KEYCODE_HOME便可,

    而事实上若是不修改framework,根本不可能作到这一点同样。

    因此,最好仍是本身亲自试一下。

    那么,有没有办法直接退出整个应用呢?

    在2.1以前,可使用ActivityManager的restartPackage方法。

    它能够直接结束整个应用。在使用时须要权限android.permission.RESTART_PACKAGES。

    注意不要被它的名字迷惑。

    但是,在2.2,这个方法失效了。

    在2.2添加了一个新的方法,killBackgroundProcesses(),须要权限android.permission.KILL_BACKGROUND_PROCESSES。

    惋惜的是,它和2.2的restartPackage同样,根本起不到应有的效果。

    另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。

    它须要权限android.permission.FORCE_STOP_PACKAGES。

    而且须要添加android:sharedUserId="android.uid.system"属性

    一样惋惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序没法调用。

    由于须要在Android.mk中添加LOCAL_CERTIFICATE := platform。

    而Android.mk是用于在Android源码下编译程序用的。

    从以上能够看出,在2.2,没有办法直接结束一个应用,而只能用本身的办法间接办到。

    现提供几个方法,供参考:

    一、抛异常强制退出:

      该方法经过抛异常,使程序ForceClose。

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

    二、记录打开的Activity:

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

    三、发送特定广播:

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

    四、递归退出

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

      除了第一个,都是想办法把每个Activity都结束掉,间接达到目的。

      可是这样作一样不完美。

      你会发现,若是本身的应用程序对每个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。

      但至少,咱们的目的达到了,并且没有影响用户使用。

      为了编程方便,最好定义一个Activity基类,处理这些共通问题。

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

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

  43. 请介绍下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?。

 

四: ContentProvider

一、ContentProvider简介
当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就能够向其余应用共享其数据。虽然使用其余方法也能够对外共享数 据,但数据访问方式会因数据存储的方式而不一样,如:采用文件方式对外共享数据,须要进行文件操做读写数据;采用sharedpreferences共享数 据,须要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。?

二、Uri类简介
Uri表明了要操做的数据,Uri主要包含了两部分信息:1.须要操做的ContentProvider ,2.对ContentProvider中的什么数据进行操做,一个Uri由如下几部分组成:
1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content://。
2.主机名(或Authority):用于惟一标识这个ContentProvider,外部调用者能够根据这个标识来找到它。
3.路径(path):能够用来表示咱们要操做的数据,路径的构建应根据业务而定,以下:
 要操做contact表中id为10的记录,能够构建这样的路径:/contact/10
 要操做contact表中id为10的记录的name字段, contact/10/name
要操做contact表中的全部记录,能够构建这样的路径:/contact?
要操做的数据不必定来自数据库,也能够是文件等他存储方式,以下:
要操做xml文件中contact节点下的name节点,能够构建这样的路径:/contact/name
若是要把一个字符串转换成Uri,可使用Uri类中的parse()方法,以下:
Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")

三、UriMatcher、ContentUrist和ContentResolver简介
由于Uri表明了要操做的数据,因此咱们很常常须要解析Uri,并从 Uri中获取数据。Android系统提供了两个用于操做Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于咱们的开发工做。
 UriMatcher:用于匹配Uri,它的用法以下:
1.首先把你须要匹配Uri路径所有给注册上,以下:
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//若是match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路径,返回匹配码为1
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact”, 1);//添加须要匹配uri,若是匹配就会返回匹配码
//若是match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路径,返 回匹配码为2
uriMatcher.addURI(“com.changcheng.sqlite.provider.contactprovider”, “contact/#”, 2);//#号为通配符

2.注册完须要匹配的Uri后,就可使用uriMatcher.match(uri)方法对输入的Uri进行匹配,若是匹配就返回匹配码,匹配码是调用 addURI()方法传入的第三个参数,假设匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路径,返回的匹配 码为1。
ContentUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:
 withAppendedId(uri, id)用于为路径加上ID部分
parseId(uri)方法用于从路径中获取ID部分
 ContentResolver:当外部应用须要对ContentProvider中的数据进行添加、删除、修改和查询操做时,可使用 ContentResolver 类来完成,要获取ContentResolver 对象,可使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操做数据。

 

五: 总结说明
以上5中存储方式,在之后的开发过程当中,根据设计目标、性能需求、空间需求等找到 合适的数据存储方式。Android 中的数据存储都是私有的,其余应用程序都是没法访问的,除非经过ContentResolver获取其余程序共享的数据。采用文件方式对外共享数据,须要 进行文件操做读写数据;采用sharedpreferences共享数据,须要使用sharedpreferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。


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

  建立一个属于你本身的Content provider或者将你的数据添加到一个已经存在的Contentprovider中,前提是有相同数据类型而且有写入Content provider的权限。


  45. 如何启用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);//解除绑定

 

  46. 注册广播有几种方式,这些方式有何优缺点?请谈谈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{
      sms[0] =SmsMessage.createFromPdu((byte[])object);
      Toast.makeText(context,
"来自"+sms.getDisplayOriginatingAddress()+"的消息是:"+sms.getDisplayMessageBody(),Toast.LENGTH_SHORT).show();     }     //终止广播,在这里咱们能够稍微处理,根据用户输入的号码能够实现短信防火墙。     abortBroadcast();   } }

  当实现了广播接收器,还要设置广播接收器接收广播信息的类型,这里是信息:android.provider.Telephony.SMS_RECEIVED

  咱们就能够把广播接收器注册到系统里面,可让系统知道咱们有个广播接收器。这里有两种,一种是代码动态注册:

  //生成广播处理

  smsBroadCastReceiver = newSmsBroadCastReceiver();

  //实例化过滤器并设置要过滤的广播

  IntentFilter intentFilter = newIntentFilter("android.provider.Telephony.SMS_RECEIVED");

  //注册广播

  BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,intentFilter);

  一种是在AndroidManifest.xml中配置广播

  package="spl.broadCastReceiver"

  android:versionCode="1"

  android:versionName="1.0">

  android:label="@string/app_name">

  两种注册类型的区别是:

  1)第一种不是常驻型广播,也就是说广播跟随程序的生命周期。

  2)第二种是常驻型,也就是说当应用程序关闭后,若是有信息广播来,程序也会被系统调用自动运行。 

 

  47. 请解释下在单线程模型中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。

class LooperThread extends Thread {

  public Handler mHandler;

  public void run() {

    Looper.prepare();

    mHandler = new Handler() {

      public voidhandleMessage(Message msg) {

      // process incomingmessages here

      }

    };

    Looper.loop();

  }

} 

  Looper简介:

  Looper类被用来执行一个线程中的message循环。默认状况,没有一个消息循环关联到线程。在线程中调用prepare()建立一个Looper,而后用loop()来处理messages,直到循环终止。

  大多数和message loop的交互是经过Handler。

  下面是一个典型的带有Looper的线程实现。



  48. 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类的内部类的对象。


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

    运行时权限Dalvik( android受权)文件系统 linux 内核受权

 

  50. 系统上安装了多种浏览器,可否指定某浏览器访问指定页面?请说明起因。经过直接发送Uri把参数带过去,或者经过manifest里的intentfilter里的data属性

 

  51. 你如何评价Android系统?优缺点。答:Android平台手机 5大优点:

  1、开放性

  在优点方面,Android平台首先就是其开发性,开发的平台容许任何移动终端厂商加入到Android联盟中来。显著的开放性可使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来说,随大的受益正是丰富的软件资源。开放的平台也会带来更大竞争,如此一来,消费者将能够用更低的价位购得心仪的手机。

  2、挣脱运营商的束缚

  在过去很长的一段时间,特别是在欧美地区,手机应用每每受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。从去年iPhone 上市 ,用户能够更加方便地链接网络,运营商的制约减小。随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提高,手机随意接入网络已不是运营商口中的笑谈,当你能够经过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是否是像噩梦同样?互联网巨头Google推进的Android终端天生就有网络特点,将让用户离互联网更近。

  3、丰富的硬件选择

  这一点仍是与Android平台的开放性相关,因为Android的开放性,众多的厂商会推出千奇百怪,功能特点各具的多种产品。功能上的差别和特点,却不会影响到数据同步、甚至软件的兼容,比如你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是能够方便地转移,是否是很是方便呢?

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

  Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各类条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。

  5、无缝结合的Google应用

  现在叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为链接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。

  再说Android的5大不足:

  1、安全和隐私

  因为手机与互联网的紧密联系,我的隐私很可贵到保守。除了上网过程当中经意或不经意留下的我的足迹,Google这个巨人也时时站在你的身后,洞穿一切,所以,互联网的深刻将会带来新一轮的隐私危机。

  2、首先开卖Android手机的不是最大运营商

  众所周知,T-Mobile在23日,于美国纽约发布 了Android首款手机G1。可是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其余三家也要逊色很多,所以,用户能够买帐购买G1,可否体验到最佳的3G网络服务则要另当别论了!

  3、运营商仍然可以影响到Android手机

  在国内市场,很多用户对购得移动定制机不满,感受所购的手机被人涂画了广告通常。这样的状况在国外市场一样出现。Android手机的另外一发售运营商Sprint就将在其机型中内置其手机商店程序。

  4、同类机型用户减小

  在很多手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,因为厂商丰富,产品类型多样,这样使用同一款机型的用户愈来愈少,缺乏统一机型的程序强化。举个稍显不当的例子,如今山寨机泛滥,品种各异,就不多有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型之外。

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

  在使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户能够选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序一样能够应付多样的须要。在Android平台中,因为其开放性,软件更多依赖第三方厂商,好比Android系统的SDK中就没有内置音乐 播放器,所有依赖第三方开发,缺乏了产品的统一性。

  52. 什么是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。这种实践须要应用到全部显示用户界面的线程,由于他们都面临着一样的超时问题。

  53. 什么状况会致使Force Close ?如何避免?可否捕获致使其的异常?

  答:通常像空指针啊,能够看起logcat,而后对应到程序中 来解决错误

 

54. Android自己的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?诺有的话会致使什么问题?如何解决?  55. 简要解释一下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文件中声明的。  56.  IntentService有何优势?  答:IntentService 的好处  * Acitivity的进程,当处理Intent的时候,会产生一个对应的Service  * Android的进程处理器如今会尽量的不kill掉你  * 很是容易使用  57. 横竖屏切换时候activity的生命周期?  一、不设置Activity的android:configChanges时,切屏会从新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次  二、设置Activity的android:configChanges="orientation"时,切屏仍是会从新调用各个生命周期,切横、竖屏时只会执行一次  三、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会从新调用各个生命周期,只会执行onConfigurationChanged方法  如何将SQLite数据库(dictionary.db文件)与apk文件一块儿发布?  解答:能够将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。全部在res aw目录中的文件不会被压缩,这样能够直接提取该目录中的文件。能够将dictionary.db文件复制到res aw目录中  58. 如何将打开res aw目录中的数据库文件?  解答:在Android中不能直接打开res aw目录中的数据库文件,而须要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,而后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法得到res aw目录中资源的 InputStream对象,而后将该InputStream对象中的数据写入其余的目录中相应文件中。在Android SDK中可使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。  59. Android引入广播机制的用意?  答:a:从MVC的角度考虑(应用程序内)  其实回答这个问题的时候还能够这样问,android为何要有那4大组件,如今的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制能够方便几大组件的信息和数据交互。  b:程序间互通消息(例如在本身的应用程序内监听系统来电)  c:效率上(参考UDP的广播协议在局域网的方便性)  d:设计模式上(反转控制的一种应用,相似监听者模式)  60. Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念  DVM指dalivk的虚拟机。每个Android应用程序都在它本身的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每个DVM都是在Linux 中的一个进程,因此说能够认为是同一个概念。  61. sim卡的EF 文件有何做用  sim卡的文件系统有本身规范,主要是为了和手机通信,sim本 身能够有本身的操做系统,EF就是做存储并和手机通信用的  62. 嵌入式操做系统内存管理有哪几种, 各有何特性  页式,段式,段页,用到了MMU,虚拟空间等技术  63. 什么是嵌入式实时操做系统, Android 操做系统属于实时操做系统吗?  嵌入式实时操做系统是指当外界事件或数据产生时,可以接受并以足够快的速度予以处理,其处理的结果又能在规定的时间以内来控制生产过程或对处理系统做出快速响应,并控制全部实时任务协调一致运行的嵌入式操做系统。主要用于工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就须要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,所以属于软实时。  64. 一条最长的短信息约占多少byte?  中文70(包括标点),英文160,160个字节。  65. android中的动画有哪几类,它们的特色和区别是什么?  两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可使视图组件移动、放大、缩小以及产生透明度的变化;另外一种Frame动画,传统的动画方法,经过顺序的播放排列好的图片来实现,相似电影。  66. 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。  67. 说说mvc模式的原理,它在android中的运用  MVC(Model_view_contraller)”模型_视图_控制器”。 MVC应用程序老是由这三个部分组成。Event(事件)致使Controller改变Model或View,或者同时改变二者。只要Controller改变了Models的数据或者属性,全部依赖的View都会自动更新。相似的,只要Contro  68. DDMS和TraceView的区别? DDMS是一个程序执行查看器,在里面能够看见线程和堆栈等信息,TraceView是程序性能分析器 。  69. java中如何引用本地语言 能够用JNI(java nativeinterface java 本地接口)接口。  70. 谈谈Android的IPC(进程间通讯)机制 IPC是内部进程通讯的简称, 是共享"命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间能够随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通讯,相似于远程方法调用,相似于C/S模式的访问。经过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。  71. NDK是什么NDK是一些列工具的集合,NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。  NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差别,开发人员只需简单的修改mk文件就能够建立出so  

相关文章
相关标签/搜索