(4.4.8)Android常见笔试面试题

一、Activity相关的

什么是Activity?

通俗一点说Activity就是一个界面,这个界面里面可以放置各种控件。Activity的界面也是
用xml文件表示的,放置在res->layout下面。每生成一个新的Activity后,我们需要在
AndroidManifest.xml中注册一下这个activity

请描述一下Activity生命周期。

onCreate(Bundle savedInstanceState):创建activity时调用。设置在该方法中,还以Bundle
的形式提供对以前储存的任何状态的访问!
onStart():activity变为在屏幕上对用户可见时调用。
onResume():activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法
总是被调用的)。
onPause():activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也
是保护现场,压栈吧!
onStop():activity被停止并转为不可见阶段及后续的生命周期事件时调用。
onRestart():重新启动activity时调用。该活动仍在栈中,而不是启动新的活动。
onDestroy():activity被完全从系统内存中移除时调用,该方法被调用

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

onCrante() //在Activity生命周期开始时调用
onRestoreInstanceState()//用来恢复UI状态
onReStart()//当Activity重新启动时调用
onStart()//Activity对用户即将可见时调用
onResume()//当Activity与用户交互时,绘制界面
onSaveInstanceState()//activity即将移出栈顶保留UI状态时调用
onPause()//暂停当前活动activity,提交持久数据的改变,停止动画和其他占用CPU资源的
东西,由于下一个activity在这个方法返回之前不会resume,所以这个方法的代码执行要快。
onStop()//activity不再可见时调用
onDestroy()//在Activity销毁钱被调用的最后一个方法。

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

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时
会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges=”orientation”时,切屏还是会重新调用各个生命
周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重
新调用各个生命周期,只会执行onConfigurationChanged方法

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

1、在你的styles.xml文件中可以新建一如下的类似Dialog的style


2、在AndroidManifest.xml中在你需要显示为窗口的activity中添加如下属性:
android:theme=”@style/Theme.FloatActivity” 即可
也可以直接添加您对应需要展示为 Dialog style的Activity的android:theme属性值为
android:theme=”@android:style/Theme.Dialog”。

对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行?onPause()

你后台的Activity被系统回收怎么办?

系统会帮我们记录下回收前Activity的状态,再次调用被回收的Activity就要重新调用
onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map
对象,我们使用savedInstanceState可以恢复到回收前的状态。

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

用finish()方法退出activity.
在2.1之前,可以使用ActivityManager的restartPackage方法。
它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。
在2.2,这个方法失效了,可使用以下几个人工的方法
1、记录打开的Activity:
每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。
2、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

被回收前调用onSaveInstanceState()方法保存当前状态。

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

在Intent的对象中增加要传递的参数既可。
在Intent的对象的请求中加入键值对,对象名字.putExtra (”键值对的名字”,”键值对的值”);
在另一个Activity中将Intent请求中的数据取出来:
Intent intent=getIntent();//
String value = intent.getStringExtra(“testIntent”);//将testIntent对应的值赋值给value

怎么在启动一个Activity时就启动一个service?

将启动Service的语句放在onCreate()方法中。

同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?

可以放在不同的Task中。需要为不同的activity设置不同的taskaffinity 属性,启动activity
的Intent需要包含FLAG_ACTIVITY_NEW_TASK标记。

启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么

区别?
从主界面启动一个应用程序是通过快捷方式直接调用mainActivity启动的,从其他应用程序
调用需要隐式的通过Action或者在Intent中需要使用setClass(),且要写明包路径。

Android中Task任务栈的分配。

如何判断进程是否被killed

1·.可以查看设置里面的正在运行的进程
2.会调用-onDestory(),就在里面Toast一下吧
3.应该可以查看linux里面的相关文件。就好比你可以查看linux文件查看谁连了你的wifi
4. RunningTaskInfo runningTaskInfo = getCurrentRunningTaskInfo();
5. 获取activitymanager,有一个getRunningActivity(具体名字记不清楚了)的方法,会返回一个正在运行的list,list(0)就是当前前台的activity,其他的是后台的activity

二、Service相关的

Activity怎么和service绑定,怎么在activity中启动自己对应的service?

1、Activity能进行绑定得益于Service的接口。为了支持Service的绑定,实现onBind方法。
2、Service和Activity的连接可以用ServiceConnection来实现。你需要实现一个新的
ServiceConnection,重写onServiceConnected和onServiceDisconnected方法,一旦连接
建立,你就能得到Service实例的引用。
3、执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显式或
隐式)和一个你实现了的ServiceConnection实例

什么是Service以及描述下它的生命周期。

Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以
运行在其他应用程序进程的上下文里。需要通过某一个Activity或者其他Context对象来调
用, Context.startService() 和 Context.bindService()。 如果在Service执行耗时的操作
需要启动一个新线程来执行。
Android Service只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动
Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行
onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启Service时,
不会在执行onCreate()方法,而是直接执行onStart()方法。

Service有哪些启动方法,有什么区别,怎样停用Service?

两种启动Service的方式Context.startService() 和 Context.bindService()。 区别
为 Context.startService():Service会经历onCreate -> onStart(如果Service还没有运行,
则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),
所以一个Service的onStart方法可能会重复调用多次 );stopService的时候直接
onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后
台运行。该Service的调用者再启动起来后可以通过stopService关闭Service
Context.bindService():Service会经历onCreate() -> onBind(),onBind将返回给客户端
一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其
他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context
退出了,Srevice就会调用onUnbind -> onDestroyed相应退出,所谓绑定在一起就共存亡
了 。
停用service使用 context.stopService()

使用servcie如何播放音乐

Myservice oncreate中创建musicplayer onstart()和onBind中开始 onStop()中停止
onDestory()注销

不用service,B页面为音乐播放,从A跳转到B,再返回,如何使音乐继续播放?

a 使用startActivityForResult() 方法开启b,b类结束时调用finish();
a类的intent 有一个子activity结束事件onActivityResult(),在事件里继续播放音乐

什么是IntentService?有何优点?

IntentService也是一个Service,是Service的子类,
IntentService和Service有所不同,通过Looper和Thread来解决标准Service中处理逻辑
的阻塞问题。
IntentService是一个用于按需处理异步请求的Service基类,调用方通过 startService(Intent)启动服务,IntentService为每一个Intent开启一个单独的工作线程,并且在任务完成时自动终止服务
这种“工作队列处理器”模式通常用于某个程序主线程之外的后台任务。IntentService类简化了这种机制。要使用这种工作队列模式,只使用继承IntentService并实现onHandleIntent(Intent)方法。IntentService会接受Intents,启动工作线程,并在合适的时候终止服务。

什么时候使用Service?

比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测
SD卡上文件的变化,再或者在后台记 录你地理信息位置的改变等等,总之服务嘛,总是藏
在后头的。

请描述一下Intent 和 Intent Filter。

Intent在Android中被翻译为”意图”,熟语来讲就是目的,他们是三种应用程序基本组件
—activity,service和broadcast receiver之间互相激活的手段。 在调用Intent名称时使用
ComponentName也就是类的全名时为显示调用。这种方式一般用于应用程序的内部调用,
因为你不一定会知道别人写的类的全名。我们来看看隐式Intent怎么用? 首先我们先配置
我们的Activity的Intent Filter



这样在调用的时候指定Intent的action,系统就是自动的去对比是哪个intent-filter符合我
们的Activity,找到后就会启动Activity。
一个intent filter 是IntentFilter类的实例, 但是它一般不出现在代码中,而是出现在android
Manifest文件中, 以的形式. (有一个例外是broadcast receiver的intent filter
是使用Context.registerReceiver()来动态设定的, 其intent filter 也是在代码中创建的.)
一个filter有action, data, category等字段. 一个隐式intent 为了能被某个intent filter 接受,
必须通过3个测试. 一个intent 为了被某个组件接受, 则必须通过它所有的intent filter 中
的一个.

三、通信类:Intent、IPC、ASDL

Intent传递数据时,可以传递哪些类型数据?

Intent间传送数据一般有两种常用的办法:
1.extra
2.data.
extra可以用Intent.putExtra放入数据。新启动的Activity可用Intent.getExtras取出来
Bundle, 然后用Bundles.getLong, getInt, getBoolean, getString等函数来取放进入的值。
而data则是传输url。url可以是指我们熟悉的http, ftp 等网络地址, 也可以指content
来指向ContentProvider提供的资源。Intent.setData可以放入数据,Intent.getData可以取
出数据。

Linux中跨进程通信的几种方式 。

  1. 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
  2. 有名管道 (named pipe) :有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
  3. 信号量( semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
  4. 消息队列( message queue ):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  5. 信号 ( sinal ) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  6. 共享内存( shared memory ):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
  7. 套接字( socket ) :套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

谈谈Android的IPC机制:

答:IPC是内部进程通信的简称,是共享”命名管道”的资源。Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。

AIDL的全称是什么?如何工作?能处理哪些类型的数据?

AIDL是一种接口定义语言,用于约束两个进程间的通信规则,供编译器生成代码,实现
Android设备上的进程间通信。
进程之间的通信信息首先会被转换成AIDL协议消息,然后发送给对方,对方受到AIDL协
议消息后再转换成相应的对象。
AIDL支持的类型包括Java基础类型和String,List,Map,CharSequence,如果使用自定
义类型,必须实现Parcelable接口。

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

一个Activity通常是一个单独的屏幕,每一个Activity都被实现为一个单独的类,这些类都
是从Activity基类中继承来的,Activity类会显示由视图控件组成的用户接口,并对视图控
件的事件做出响应。
Intent的调用是用来进行架构屏幕之间的切换的。Intent是描述应用想要做什么。Intent数
据结构中两个最重要的部分是动作和动作对应的数据,一个动作对应一个动作数据。
Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以
运行在其他应用程序进程的上下文里。需要通过某一个Activity或者其他Context对象来调
用。
Activity跳转到Activity,Activity启动Service,Service打开Activity都需要Intent表明跳转
的意图,以及传递参数,Intent是这些组件间信号传递的承载者。

四、组件类

请描述一下Broadcast Receiver。

Broadcast Receiver用于接收并处理广播通知(broadcast announcements)。多数的广播是
系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有
任意数量的 broadcast receivers来响应它觉得重要的通知。broadcast receiver可以通过多
种方式通知用户:启动activity、使用NotificationManager、开启背景灯、振动设备、播放
声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。通常我
们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个Intent
出去,我们可以利用注册一个Broadcast Receiver来监听到这些Intent并获取Intent中的
数据。

在manifest和代码中如何注册和使 用 broadcast receiver 。

1)在AndroidManifest.xml中注册






2)在代码中注册
1. IntentFilter filter = new IntentFilter(“com.forrest.action.mybroadcast”); // 和广播
中Intent的action对应
2. MyBroadcastReceiver br = new MyBroadcastReceiver();
3. registerReceiver(new MyBroadcastReceiver(), filter);

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

toast的显示时长只有两种

Alterdialog的构造方法为protected的,因此只能通过bulider()定义

AlertDialog.Builder db= new Builder(this);
                    db.create().show();
//Alterdialog show()   有返回值    显示
//Alterdialog create()有返回值   创建但不显示

progressDialog 使用new(context)方式创建

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

在action 赋值为”android.intent.action.VIEW“ 时可接收如下scheme 为”http” 等等类型的
data 。所以突发奇想,启动该程序后,指定action 及Uri ,即访问指定网页。

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

Android系统提供了MediaScanner,MediaProvider,MediaStore等接口,并且提供了一套
数据库表格,通过Content Provider的方式提供给用户。当手机开机或者有SD卡插拔等事
件发生时,系统将会自动扫描SD卡和手机内存上的媒体文件,如audio,video,图片等,
将相应的信息放到定义好的数据库表格中。
改善效率可以从界面需要查询必备数据,不需要的不进行查询。

sim卡的EF 文件有何作用

SIM卡的文件系统有自己规范,主要是为了和手机通讯,SIM卡本身可以有自己的操作系
统,EF就是作存储并和手机通讯用的。

如何判断是否有SD卡?

在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中加入访问SDCard的权限如下:

android中的动画有哪几类,它们的特点和区别是什么?

两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视
图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,
通过顺序的播放排列好的图片来实现,类似电影。

NotifactionManager使用原理

  1. 通过getSystemService方法获得一个NotificationManager对象。
    1. 创建一个Notification对象。每一个Notification对应一个Notification对象。在这
      一步需要设置显示在屏幕上方状态栏的通知消息、通知消息前方的图像资源ID和发出通知
      的时间。一般为当前时间。
    2. 由于Notification可以与应用程序脱离。也就是说,即使应用程序被关闭,
      Notification仍然会显示在状态栏 中。当应用程序再次启动后,又可以重新控制这些
      Notification。如清除或替换它们。因此,需要创建一个PendingIntent对象。该对象由Android
      系统负责维护,因此,在应用程序关闭后,该对象仍然不会被释放。
    3. 使用Notification类的setLatestEventInfo方法设置Notification的详细信息。
    4. 使用NotificationManager类的notify方法显示Notification消息。在这一步需要指
      定标识Notification的唯一ID。这个ID必须相对于同一个NotificationManager对象是唯一
      的,否则就会覆盖相同ID的Notificaiton。

28.android view,surfaceview,glsurfaceview的区别:

答:SurfaceView是从View基类中派生出来的显示类,直接子类有GLSurfaceView和VideoView,可以看出GL和视频播放以及Camera摄像头一般均使用SurfaceView
SurfaceView和View最本质的区别在于,surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。
那么在UI的主线程中更新画面 可能会引发问题,比如你更新画面的时间过长,那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键,触屏等消息。
当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题,就是事件同步。比如你触屏了一下,你需要surfaceView中thread处理,一般就需要有一个event queue的设计来保存touch event,这会稍稍复杂一点,因为涉及到线程同步。

所以基于以上,根据游戏特点,一般分成两类。

1)被动更新画面的。比如棋类,这种用view就好了。因为画面的更新是依赖于 onTouch 来更新,可以直接使用 invalidate。 因为这种情况下,这一次Touch和下一次的Touch需要的时间比较长些,不会产生影响。

2)主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态,避免阻塞main UI thread。所以显然view不合适,需要surfaceView来控制。

GLSurfaceView是一个视图,继承至SurfaceView,它内嵌的surface专门负责OpenGL渲染。

    GLSurfaceView提供了下列特性:
            1> 管理一个surface,这个surface就是一块特殊的内存,能直接排版到android的视图view上。
            2> 管理一个EGL display,它能让opengl把内容渲染到上述的surface上。
            3> 用户自定义渲染器(render)。
            4> 让渲染器在独立的线程里运作,和UI线程分离。
            5> 支持按需渲染(on-demand)和连续渲染(continuous)。
            6> 一些可选工具,如调试。

五、布局类

请介绍下Android中常用的五种布局。

最常用的布局方式为LinearLayout、RelativeLayout、FrameLayout、TableLayout
AbsoluteLayout。其中LinearLayout和RelativeLayout是最常用的方式,他们可以通过在xml
配置文件或者代码中进行布局。
FrameLayout 最简单的布局方式,放置的控件都只能罗列到左上角,控件会有重叠,不能
进行复杂的布局。
LinearLayou可以通过orientation属性设置线性排列的方向是垂直(vertical)还是纵向
(horizontal).每行或每列只有一个元素,可以进行复杂的布局。
AbsoluteLayout 可以让子元素指定准确的x/y坐标值,并显示在屏幕上。AbsoluteLayout 没
有页边框,允许元素之间互相重叠(尽管不推荐)。他是绝对坐标,所以在实际中不提倡使
用。
RelativeLayout 允许子元素指定他们相对于其它元素或父元素的位置(通过ID 指定)。因
此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列,
因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位
置来排列。这个是相对于 AbsoluteLayout 的,采用的相对坐标,所以在实际中比较常用。
TableLayout 将子元素的位置分配到行或列中。一个TableLayout 由许多的TableRow 组成,
每个TableRow 都会定义一个 row 。TableLayout 容器不会显示row 、column或cell 的
边框线。每个 row 拥有0个或多个的cell ;和html中的table差不多。在实际中也经常使
用。
有的时候我们也会用到GridView,就像我们手机屏幕上摆放的各个图标应该就是用
GridView排版的。 Padding是文字相对于边框,而Margin是边框相对于父窗体。

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

Padding是文字相对于边框,而Margin是边框相对于父窗体。

在 Android 中, 1pt=desinty/72;

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

Android UI中的View如何刷新。

一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对
象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。

res目录有默认几项resource。

6项,drawable-hdpi,drawable-ldpi,drawable-mdpi,layout,values。

SimpleAdapter作为 ListView的适配器,行布局中支持

  • 继承Checkable接口:CompoundButton 等
  • TextView
  • ImageView

Android中的R.java不可以手动修改

style和theme

  • 都可以减少重复属性设置
  • 都是由< style />节点进行定义的。但应用在和则为theme,应用在则为style.
  • style不可以作用在Activity上,theme可以
  • 自定义的style必须parent为某theme,即style可以继承,但是theme不可以

六、异步线程类

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

对多线程的运用和理解,及多线程之间handle的传值。

handler机制的原理。

Andriod提供了Handler和Looper来满足线程间的通信.Handler先进先出原则.Looper 类用
来管理特定线程内对象之间的消息交换(Message Exchange).
1)Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message
Queue(消息队列).
2)Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message
Queue里;或者接收Looper从Message Queue取出)所送来的消息.

android中线程与线程,进程与进程之间如何通信。

线程通信使用Handler,

不同工程中的方法是否可以相互调用?

可以,列举aidl访问远程服务的例子.

什么是ANR 如何避免它?

在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR:
1.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
2.BroadcastReceiver在10秒内没有执行完毕
造成以上两点的原因有很多,比如在主线程中做了非常耗时的操作,比如说是下载,io异常等。

七、存储类

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

ContentProvider是通过提供Uri来实现数据共享

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

Android提供了5种方式存储数据:
使用SharedPreferences存储数据;
文件存储数据;
SQLite数据库存储数据;
使用ContentProvider存储数据;
网络存储数据;

android中使用SQLiteOpenHelper这个辅助类时,可以生成一个数据库,并可以对数据库版本进行管理的方法

getWriteableDatabase() //可更新
getReadableDatabase() //可读

为什么要用ContentProvider?它和sql的实现上有什么差别?

使用ContentProvider 可以将数据共享给其他应用,让除本应用之外的应用也可以访问本应
用的数据。它的底层是用SQLite数据库实现的,所以其对数据做的各种操作都是以Sql实
现,只是在上层提供的是Uri。

如何将SQLite数据库(.db文件)与apk文件一起发布?

答:可以将.db文件复制到Eclipse Android工程中的res Raw目录中。所有在res Raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将.db文件复制到res aw目录中

如何将打开res raw目录中的数据库文件?

答:在Android中不能直接打开res raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

八、内存类

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

ListView如何提高其效率?

使用分页加载,不要一次性加载所有数据。 convertview

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

回收已经使用的资源,
合理的使用缓存
合理设置变量的作用范围… application 对象
//未来的某一段时间执行
System.gc();

Android系统中GC什么情况下会出现内存泄露呢?

出现情况:
1. 数据库的cursor没有关闭
2.构造adapter时,没有使用缓存contentview
衍生listview 的优化问题—–减少创建view的对象,充分使用contentview,可以使用一静
态类来优化处理getview的过程/
3.Bitmap对象不使用时采用recycle()释放内存
4.activity中的对象的生命周期大于activity
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]

九、系统类

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

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

android本身的一些限制,比如apk包大小限制,读取大文件时的时间限。

Android中可以使用System.out.println(“”);在logcat中显示你想要显示的字符,并不是控制台

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

不会

Android程序与Java程序的区别?

android程序是Java编写的,但程序使用的android开发的API,就是andriod的库。

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

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

Dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,
每个android程序系统都会给他分配一个单独的liunx uid(user id),
每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.
DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立
的 Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个
概念.

嵌入式操作系统内存管理有哪几种, 各有何特性。

页式,段式,段页,等…

什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

一条最长的短信息约占多少byte?

中文70(包括标点),英文160,160个字节这个说法不准确,
要跟手机制式运营商等信息有关.

谈谈对Android NDK的理解。

Android NDK是一套工具,允许Android应用开发者嵌入从C、C++源代码文件编译来的本
地机器代码到各自的应用软件包中。
native develop kit 只是一个交叉编译的工具 .so
1.什么时候用ndk, 实时性要求高,游戏,图形渲染,
opencv (人脸识别) , ffmpeg ,rmvb mp5 avi 高清解码. ffmpeg,opencore.

谈谈Android的优点和不足之处。

1、开放性,开源ophone 阿里云( 完全兼容android)
2、挣脱运营商束缚
3、丰富的硬件选择 mtk android
4、不受任何限制的开发商
5、无缝结合的Google应用
缺点也有5处:
1、安全问题、隐私问题
2、卖手机的不是最大运营商
3、运营商对Android手机仍然有影响
4、山寨化严重
5、过分依赖开发商,缺乏标准配置版本过多

简单描述下Android 数字签名。

在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系
Android系统要求每一个安装进系统的应用程序都是经过数字证书签名的,数字证书的私钥则保存在程序开发者的手中。Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。
这个数字证书并不需要权威的数字证书签名机构认证(CA),它只是用来让应用程序包自我认证的。
同一个开发者的多个程序尽可能使用同一个数字证书,这可以带来以下好处。
(1)有利于程序升级,当新版程序和旧版程序的数字证书相同时,Android系统才会认为这两个程序是同一个程序的不同版本。如果新版程序和旧版程序的数字证书不相同,则Android系统认为他们是不同的程序,并产生冲突,会要求新程序更改包名。

(2)有利于程序的模块化设计和开发。Android系统允许拥有同一个数字签名的程序运行在一个进程中,Android程序会将他们视为同一个程序。所以开发者可以将自己的程序分模块开发,而用户只需要在需要的时候下载适当的模块。
在签名时,需要考虑数字证书的有效期:
(1)数字证书的有效期要包含程序的预计生命周期,一旦数字证书失效,持有改数字证书的程序将不能正常升级。
(2)如果多个程序使用同一个数字证书,则该数字证书的有效期要包含所有程序的预计生命周期。
(3)Android Market强制要求所有应用程序数字证书的有效期要持续到2033年10月22日以后。
Android数字证书包含以下几个要点:
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。

说说mvc模式的原理,它在android中的运用。

MVC(Model_view_contraller)”模型视图控制器”。 MVC应用程序总是由这三个部分组成。
Event(事件)导致Controller改变Model或View,或者同时改变两者。只要 Controller改变
了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Contro
Android中各种界面的监听操作就是MVC的应用。

android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别。

DOM解析
优点:
XML树在内存中完整存储,因此可以直接修改其数据和结构。 2.可以通过该解析器随时
访问XML树中的任何一个节点。 3.DOM解析器的API在使用上也相对比较简单。
缺点:
如果XML文档体积比较大时,将文档读入内存是非常消耗系统资源的。
使用场景:
DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准。DOM 是以层次
结构组织的节点的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构
通常需要加载整个文档和构造层次结构,然后才能进行任何工作。DOM是基于对象层次
结构的。
SAX解析
优点:
SAX 对内存的要求比较低,因为它让开发人员自己来决定所要处理的标签。特别是当开
发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。
缺点:
用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据。
此外,在基于该方式的解析编码过程也相对复杂。
使用场景:
对于含有数据量十分巨大,而又不用对文档的所有数据进行遍历或者分析的时候,使用
该方法十分有效。该方法不用将整个文档读入内存,而只需读取到程序所需的文档标签
处即可。
Xmlpull解析
android SDK提供了xmlpull api,xmlpull和sax类似,是基于流(stream)操作文件,
然后根据节点事件回调开发者编写的处理程序。因为是基于流的处理,因此xmlpull和
sax都比较节约内存资源,不会象dom那样要把所有节点以对橡树的形式展现在内存中。
xmlpull比sax更简明,而且不需要扫描完整个流。

DDMS与TraceView的区别?

DDMS是一个程序执行查看器,在里面可以看见线程和堆栈等信息,TraceView是程序性能分析器
Traceview是android平台配备一个很好的性能分析的工具。它可以通过图形化的方式让我
们了解我们要跟踪的程序的性能,并且能具体到method。
http://wbdban.iteye.com/blog/564309
DDMS为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、

android的哪个版本是一次重大的升级?

1、6版本。
系统新功能
快速搜索框(全局搜索)
新的摄像机和照相机
电池用量指示
Android Market(菜场)升级
新平台的新技术
Android 1.6 升级Linux内核从2.6.27 到 2.6.29.

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值