java与Android知识点

Java基础

  1. 什么是重载,什么是重写?有什么区别?
    重载(Overload):
    (1)Overloading是一个类中多态性的一种表现,让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。
    (2)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同,也可以不相同。无法以返回型别作为重载函数的区分标准。
    重写(Override):
    (1) 父类与子类之间的多态性,对父类的函数进行重新定义。即在子类中定义某方法与其父类有相同的名称和参数。
    (2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。
  2. 泛型T和?有什么区别?
    a)先看个方法的代码
    public T getT(T arg){
    return arg;
    }
    public List getT(List arg){
    return new ArrayList();
    }
    b) 通过两个方法可以看到,T和?都可以用于声明泛型, 但是T可以用来约束函数的返回值类型,而?不会约束返回值类型。在工作里面使用T是更安全的。
  3. 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
    使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
    例如,对于如下语句:
    final StringBuffer a=new StringBuffer("immutable");
    执行如下语句将报告编译期错误:
    a=new StringBuffer("");
    但是,执行如下语句则可以通过编译:
    a.append(" broken!");
  4. String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
    没有。
    因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
  5. "=="和equals方法究竟有什么区别?
    ==:操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
    equals:方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
    例如,对于下面的代码:
    String a=new String("foo");
    String b=new String("foo");
    两条new语句创建了两个对象,然后用a/b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
    在实际开发中,我们经常要比较传递进行来的字符串内容是否等,字符串的比较基本上都是使用equals方法。
  6. 什么是Activity?
    四大组件之一,用于显示和用户交互的界面
    setContentView() ,// 要显示的布局
    findViewById(R.id.textview);// 查找界面上的控件
    button.setOnclickLinstener{
    }

我开发常用的的有 FragmentActivitiy,ListActivity , PreferenceActivity 等…
如果多个界面有共同的特点或者功能的时候,还会自己定义一个BaseActivity.

  1. 请描述一下Activity 生命周期。
    a、生命周期描述的是一个类 从创建(new出来)到死亡(垃圾回收)的过程中会执行的方法.在这个过程中 会针对不同的生命阶段会调用不同的方法
    b、Activity从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括:onCreate onDestroy onStart onStop onResume onPause
    c、其实这些方法都是两两对应的,onCreate创建与onDestroy销毁;
    onStart可见与onStop不可见;onResume可编辑(即获取焦点)与onPause;
    d、另外还有一个onRestart方法,在Activity被onStop后,但是没有被onDestroy,在再次启动此Activity时就调用onRestart(而不再调用onCreate)方法;
    e、最后讲在项目中的使用。比如说每次进入某个界面的时候都要看到最新的数据,这个刷新列表的操作 就放在onStart()的方法里面.这样保证每次用户看到的数据都是最新的.
    多媒体播放, 播放的时候来电话.在 onStop() 时停止视频, 将视频声音设置为0 , 记录视频播放的位置;在 onStart() 时根据保存的状态恢复现场.
  2. 两个Activity之间跳转时必然会执行的是哪几个方法。
    a、一般情况比如说有两个activity,分别叫A,B ,当在A里面激活B组件的时候, A 会调用 onPause()方法,然后B 调用onCreate() ,onStart(), OnResume() ,这个时候B覆盖了窗体, A会调用onStop()方法.
    b、如果B是个透明的界面,或者是对话框的样式, 就不会调用onStop()方法。
  3. 横竖屏切换时候Activity的生命周期。
    这个生命周期跟清单文件里的配置有关系
    不设置Activity的android:configChanges时,切屏会销毁当前Activity,然后重新加载,重新调用各个生命周期。
    设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法

(横竖屏切换的时候,如果有弹窗会被销毁。-- 如果要在旋转屏幕后保留对话框应该怎么办?)

  1. 如何将一个Activity设置成窗口的样式。
    可以设置activity的样式为对话框
    android:theme="@android:style/Theme.Dialog"
  2. 如果后台的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);
}
protected void onRestoreInstanceState(Bundle savedInstanceState) {
}

备用方案:切换到后台的时候就先把数据保存,在切换到前台的时候重新获取数据恢复界面

  1. 两个Activity之间传递数据,除了intent,广播接收者,content provider还有啥?
    1)利用static静态数据,public static成员变量
    2)利用外部存储的传输,
    例如 File 文件存储
    SharedPreferences首选项
    Sqlite 数据库
    (Activity间哪些方式传递数据?)
  2. 如何退出Activity?如何安全退出已调用多个Activity的Application
    a、通常情况用户退出一个Activity只需按返回键,我们写代码想退出activity直接调用finish()方法就行。
    b、记录打开的Activity:
    每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

c、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
d、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
e、通过 intent的flag 来实现intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的activity。此时如果该任务栈中已经有该Activity,那么系统会把这个Activity上面的所有Activity干掉。其实相当于给Activity配置的启动模式为SingleTop。

  1. service是否在main thread中执行, service里面是否能执行耗时的操作?
    a、默认情况, Service和activity是运行在当前app所在进程的main thread(UI主线程)里面,service里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 ) . 如果要执行耗时操作,需要开启子线程执行
    Thread.currentThread().getName();
    b、特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让service在另外的进程中执行。独立进程和当前应用主线程无关,可以做任意的耗时操作。

  2. 怎么在启动一个Activity时就启动一个service?
    在activity的onCreate()方法里面 startService();

  3. 同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
    a、Singleinstance 运行在另外的单独的任务栈里面
    b、在激活一个新的activity时候, 给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);

  4. 怎么在activity中启动service?
    启动service有两种方式
    a、startService() 一旦被创建 调用着无关 没法使用service里面的方法
    b、bindService () 把service 与调用者绑定 ,如果调用者被销毁, service会销毁。bindService()方式启动服务让activity能够访问到 service里面的方法

  5. 描述下Service的生命周期。
    Service有绑定模式和非绑定模式,以及这两种模式的混合使用方式。不同的使用方法生命周期方法也不同。
    a、非绑定模式:当第一次调用startService的时候执行的方法依次为onCreate()、onStartCommand(),当Service关闭的时候调用onDestory方法。
    b、绑定模式:第一次bindService()的时候,执行的方法为onCreate()、onBind()解除绑定的时候会执行onUnbind()、onDestory()。
    上面的两种生命周期是在相对单纯的模式下的情形。我们在开发的过程中还必须注意Service实例只会有一个,也就是说如果当前要启动的Service已经存在了那么就不会再次创建该Service,当然也不会调用onCreate()方法。
    c、一个Service可以被多个客户进行绑定,只有所有的绑定对象都执行了onBind()方法后该Service才会销毁,不过如果有一个客户执行了onStart()方法,那么这个时候如果所有的bind客户都执行了unBind()该Service也不会销毁。(播放音乐时,播放界面要控制Service的音乐播放--bindService特性,退出音乐界面后音乐还要继续播放--startService特性)

  6. 子线程不能代替service吗?
    a、不能替代
    b、 首先要确认一件事,Service作为四大组件之一,是运行在主线程的,可以直接显示吐司,修改View等。如果要运行耗时操作,服务需要自己开启子线程。
    c、 只作为后台来理解的话,相比于线程,服务具备完善的生命周期,更方便随时释放资源。
    d、 服务自己就有上下文(Context)对象,可以保证上下文是正常可用的。线程需要从外部获取上下文对象,在运行时无法保证该对象没有被系统销毁。
    e、在没有界面存在的时候;只有子线程运行的进程是空进程,随时可能被回收;只有服务运行的进程是服务进程,比较难被回收。

  7. 什么是IntentService?有何优点?
    a、普通的service,默认运行在ui main 主线程
    b、IntentService是Sdk给我们提供的方便的,带有异步处理的service类, 它的OnHandleIntent() 方法在子线程运行,方便处理耗时的操作

  8. 什么时候使用Service?
    a、Service的特点可以让他在后台一直运行,可以创建线程去完成耗时的操作.
    b、Broadcast receiver生命周期较短,捕获到一个事件之后,可以起一个service来完成一个耗时的操作.
    c、Service如果被启动起来,可以被多次bind, 但不会重新create.在多个应用间共用一段代码,节约系统资源。比如索爱手机X10i的人脸识别的service可以被图库使用,可以被摄像机,照相机等程序使用.
    d、所有界面都已经关闭,需要在后台监控数据的时候。
    e、拥有service的进程具有较高的优先级,可以保护应用资源不会被回收。
    官方文档告诉我们,Android系统会尽量保持拥有service的进程运行,只要在该service已经被启动(start)或者客户端连接(bindService)到它。当内存不足时,需要保持,拥有service的进程具有较高的优先级。
    1. 如果service正在调用onCreate, onStartCommand或者onDestory方法,那么用于当前service的进程相当于前台进程以避免被killed。
    2. 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.
    3. 如果客户端已经连接到service (bindService),那么拥有Service的进程则拥有最高的优先级,可以认为service是可见的。
    4. 如果service可以使用startForeground(int, Notification)方法来将service设置为前台状态,那么系统就认为是对用户可见的,并不会在内存不足时killed。
    如果有其他的应用组件作为Service,Activity等运行在相同的进程中,那么将会增加该进程的重要性。

  9. 请描述一下Intent 和 Intent Filter。
    Android 中通过Intent 和IntentFilter可以实现四大组件的调用与激活。
    Intent可以比作一封邮件,包含收件地址和具体的内容。其中消息“目的地”是必须的,而内容则是可选项。
    Intent filter: 可以理解为邮箱…

这个分拣系统通过3个参数来识别
Action: 动作 view
Category :额外的附加信息
Data: 数据uri或mimetyppe uri

如果我们在启动一个 Activity 时使用这样的 Intent 对象:
Intent intent =new Intent();
intent.setAction("cn.itcast.action");
那么所有的 Action 列表中包含了“cn.itcast.action”的 Activity 都将会匹配成功。
一个 Intent 可以通过 URI 携带外部数据给目标组件。在 节点中,通过 节点匹配外部数据。mimeType 属性指定携带外部数据的数据类型,scheme 指定协议,host、port、path 指定数据的位置、端口、和路径。
如果在 Intent Filter 中指定了这些属性,那么只有所有的属性都匹配成功时 URI 数据匹配才会成功。比如注册了 http协议的 Audio/Mp3 类型文件,那就不会有其他的调用唤起当前Activity。

  1. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?
    启动一个界面有隐式意图和显式意图两种方式。
    隐式意图可以启动一个类型的界面,显示意图可以启动指定应用的指定界面。
    这里使用显示意图就可以。
    Intent intent = new Intent();
    intent.setClassName(packageName, className);
    intent.seturi()
  2. Intent传递数据时,可以传递哪些类型数据?
    a、 数据的uri, intent.setData() intent.getData();
    数据的type,intent.setType(), intent.getType();
    b、八大基本数据类型 Intent .putextra() intent.getextra();
    c、可序列化对象。
    (传递序列化对象时要生成新的对象,传递图片的时候应该传递uri,不要直接传递bitmap对象。)
  3. Serializable和Parcelable的区别
    性能:
    a、Serializable在序列化的时候需要把对象先写到磁盘上,导致性能较低。Parcelable序列化在内存里处理,性能较高。谷歌推荐使用Parcelable类。
    b、Parcelable不能使用在要将数据存储在磁盘上的情况。尽管Serializable效率低点,但在这种情况下,只能使用Serializable 。

实现:
a、Serializable 的实现,只需要继承Serializable 即可。这只是给对象打了一个标记,系统会自动将其序列化。
b、Parcelabel 的实现,需要在类中添加一个静态成员变量 CREATOR,这个变量需要继承 Parcelable.Creator 接口。

  1. 请描述一下Broadcast Receiver。
    a、手机使用时有很多事件无法确定什么时候会发生,比如电量变化,收到短信等,这个时候可以通过注册一个广播接收者,等待系统发送广播就可以。
    b、广播分两种 有序广播 无序广播



    abortBroadcast();
    c、具体使用有:
    接收系统的广播通知, 系统自带了很多广播,sd卡挂载,手机重启,低电量,来电,来短信等….
    关闭所有的Activity
    画画板生成图片后,发送一个sd挂载的通知,通知系统的gallery去获取到新的图片.
    Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory()));
    sendBroadcast(intent);

  2. BroadCastReceiver的生命周期
    a、 广播接收者的生命周期非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁;
    b、广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框;
    c、最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉;
    d、耗时的较长的工作最好放在服务中完成;

  3. 请介绍下Android的数据存储方式。
    a、文件 访问权限. sdcard /。存储图片、序列化对象等
    b、SharedPreference //shared_preps 。存储设置信息。
    c、数据库 sqlite 。存储大量的结构化数据。
    d、网络 socket tcp udp , http httpurlconnection。

  4. 为什么要用ContentProvider?它和sql的实现上有什么差别?
    a、android 系统下 不同程序 数据 在data目录的不同子文件下,默认是不能共享访问
    b、ContentProvider 是Android 提供的一个共享数据的类,而Sql 是一种操作数据库的语言。
    c、仅针对操作数据而言,ContentProvider屏蔽数据存储的细节,对用户透明,用户只需要关心操作数据的uri就可以了
    d、ContentProvider可以实现不同app之间共享,操作数据
    e、Sql也有增删改查的方法. 但是sql只能查询本应用下的数据库。而contentprovider 还可以去增删改查本地文件. xml文件、网络数据读取更改

  5. 请介绍下ContentProvider是如何实现数据共享的。
    a、创建一个MyProvider类继承ContentProvider,并实现增删改查方法
    b、在清单文件里注册MyProvider类,注册能够响应的Uri
    android:authorities="com.itheima.newlist"
    android:name=".MyProvider"/>
    c、调用者获取ContentResolver,并使用约定的uri执行增删改查操作
    ContentResolver resolver = getContentResolver();
    resolver.query(uri, projection, selection, selectionArgs, sortOrder);}
    d、系统会自动找到MyProvider,并调用它的增删改查方法

  6. 说说ContentProvider ContentResolver ContentObserver之间的关系
    a、ContentProvider 内容提供者,用于封装数据操作
    b、ContentResolver 内容解析者,用于调用ContentProvider 处理数据
    c、ContentObserver 内容监听器,可以监听数据的状态改变
    d、可以通过ContentResolver.registerContentObserver(uri,observer)监听指定uri的消息。
    e、使用ContentResolver.notifyChange(uri)发出消息,则正在监听该uri的observer的onchange方法会被调用。

  7. 描述一下Fragment的生命周期

  8. Fragment和Activity之间的交互, Fragment和Fragment之间的交互
    a、强耦合的方式:Activity本身就持有Fragment对象,可以直接调用Fragment的函数。Fragment调用Activity的函数则麻烦一些,谷歌官方推荐在Fragment里定义一个接口,然后Activity实现该接口。那么在Fragment里获取到的Activity可以强转为接口对象,Fragment调用接口里的函数则可以和Activity的交互。
    b、弱耦合的方式:使用广播接收者,在Activity和Fragment里分别注册广播接收者,互相发送消息即可,这种方式不需要Activity和Fragment互相持有引用。
    c、弱耦合的方式2:使用EventBus可以达到和广播相同的效果,同时由于广播的响应范围是整个系统,而EventBus的作用范围是应用内,所以效能更高。注意:回答这种方式的话需要了解EventBus的使用。

  9. 请介绍下Android中常用的五种布局。
    a、五大布局是:FrameLayout(帧布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局)
    b、FrameLayout
    从屏幕的左上角开始布局,叠加显示, 实际应用 播放器的暂停按钮.
    c、LinearLayout
    线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下罗列在屏幕上。每一个LinearLayout里面又可分为垂直布局和水平布局)。
    d、AbsoluteLayout
    绝对布局用X,Y坐标来指定元素的位置
    android:layout_x="20px" android:layout_y="12px"
    指定平板机型的游戏开发、机顶盒开发中经常用到绝对布局。
    e、RelativeLayout
    相对布局可以使用另一个控件或者父窗体为参照物,来确定控件在界面上的位置。这种布局可以处理复杂的界面,比线性布局的嵌套结构更节约内存和CPU。
    f、TableLayout
    表格布局类似Html里面的Table。每一个TableLayout里面有表格行TableRow,TableRow里面可以具体定义每一个元素,设定他的对齐方式 android:gravity="" 。可以用于oa 自动化 生成报表。目前基本被废弃了。

  10. 谈谈UI中, Padding和Margin有什么区别?
    Padding 是对控件的内容, margin是控件对父窗体.

  11. 描述JSON数据的Header和Body功能
    a、JSON本身只是规定了数据格式,并没有Header和Body的约定。此题考察的是面试者是否有工作经验。
    b、在正式的项目中,传输的JSON字符串会约定好传递一个header代表请求的异常状态,此时body存放才是正真的bean数据。类似下面的格式:

  1. 说明JSON和XML两者的特性
    a、都是传递数据使用的格式化字符串
    b、Json的格式比较精简,XML的格式比较复杂,在移动领域里为了节约流量,大多是使用json
    c、Xml有更强的扩展性,在一些特殊需求里只能使用xml

  2. 请解析下面的JSON数组

a、 字符串可以乱写,json数组不能乱拼。这个数组的格式是错误的,item的数据格式不一致,根本就不是一个数组。
b、 工作里遇到这种情况时,应该要求服务端返回的数组内容格式统一,所有的item都包含name、uid、age。同时title应该是和数组平级的数据。

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

  2. 对android主线程的运用和理解。
    主线程,也就是UI线程,不能执行耗时的操作。四大组件都是在主线程运行。

  3. AIDL的全称是什么?如何工作?
    Android interface definition language (android接口定义语言) , 用来跨进程的访问方法,
    手机卫士 Itelephony 接口挂断电话.

  4. 请解释下Android程序运行时权限与文件系统权限的区别。
    a、Android程序执行需要读取到安全敏感项,比如耗电或者花钱。必需在androidmanifest.xml中声明相关权限请求, 打电话,访问网络,获取坐标,读写sd卡,读写联系人等..安装的时候会提示用户。主要是给用户看的。
    b、文件系统的权限是linux权限. 也就是文件的可读可写可执行权限。主要是给程序员看的。(如果理解比较多,可以拓展说一下:777自己 同组 其他)

  5. Framework工作方式及原理,Activity是如何生成一个view的,机制是什么。
    a、 使用反射, 解析配置文件来获取要使用的类和初始化属性
    b、 四大组件都有自己的生命周期,Framework通过调用不同的生命周期方法,管理四大组件的资源。
    c、Activity创建一个view是通过 ondraw 画出来的, 画这个view之前,调用onmeasure方法来计算显示的大小.

  6. 如何加载音乐、图片、视频信息,如何改善其效率。
    a、Android提供mediascanner,mediaStore等类,扫描储存卡里的数据, 音乐文件的信息都会存放到系统的数据库表中,可以通过MediaProvider获取,
    b、改善显示效率是个常见问题, 可以从以下几个方面作答,
    分批加载数据, 延时加载数据, 合理使用缓存等.

  7. 要做一个尽可能流畅的ListView,你平时在工作中如何进行优化的?
    a、复用convertView ,节约内存
    b、使用ViewHolder ,节约cpu
    c、Item布局最好使用相对布局,层级越少越好,节约内存和Cpu。(使用hierarchyview工具查看优化。 )
    d、item中有图片时,异步加载 。避免阻塞主线程。
    e、快速滑动时,不加载图片。避免解析出来Bitmap却不使用,浪费内存和CPU资源。
    f、item中有图片时,应对图片进行适当压缩 。节约内存。
    g、实现数据的分页加载。降低CPU和内存负载峰值。

  8. 如何在ScrollView中如何嵌入ListView
    比如微博详情界面,微博正文+评论列表。
    a、通常情况下我们不会在ScrollView中嵌套ListView,但是如果面试官非让我嵌套的话也是可以的。
    b、在ScrollView添加一个ListView会导致listview控件显示不全,通常只会显示一条,这是因为两个控件的滚动事件冲突导致。所以需要通过listview中的item高度 * count去计算listview的显示高度,从而使其完整展示。
    C、这时listview的所有item都被创建出来,不存在convertview复用,占用内存极高。工作里不建议使用,一般是把微博正文放在listview的headerView里,评论做为列表部分。

  9. 如何实现让ListView的条目显示不一样的布局?
    a、 重写BaseAdapter的getViewTypeCount()方法返回有几种条目类型
    b、 重写BaseAdapter的getItemViewType(int position)方法,返回值指定position的条目是什么类型的
    c、在BaseAdapter的getView方法中根据当前position的条目类型去加载不同的View

  10. 启动应用后,改变系统语言,应用的语言会改变么?
    a、已经做了多国语言的话,会变
    b、但是设置了android:configChanges="locale",则不会
    在项目里增加zh测试修改语言。可以看到修改语言实际上是界面重启,重新加载资源。

  11. 启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?
    a、区别是根据activity在manifest里面的配置,这个activity可能会放在不同的task栈里面。intent设置的flag flag_new_task 也会有影响。
    b、比如,步骤一,在文件管理器里打开一个文本或者图片,按home键退出;步骤二,从桌面打开图片app,可以看到图片app有自己的堆栈;步骤三,打开文件管理器。可以看到图片预览界面在文件管理器的堆栈里。

  12. Android程序与Java程序的区别?
    a、 Android SDK引用了大部分的Java SDK,少数部分被Android SDK抛弃,比如说界面部分,java.awt swing package除了java.awt.font被引用外,其他都被抛弃,在Android平台开发中不能使用。
    b、 android sdk 添加工具jar ,比如httpclient , pull ,opengl
    c、将Java 游戏或者j2me程序移植到Android平台的过程中,后台逻辑不需要修改,只要修改前台的界面就可以。

  13. Android中Task任务栈的分配。
    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而言的。
    b、Activity有不同的启动模式, 可以影响到task的分配
    c、standard: 标准模式,一调用 startActivity()方法就会产生一个新的实例。
    d、singleTop: 如果已经有一个实例位于 Activity 栈的顶部时, 就不产生新的实例, 而只是调用Activity 中的 newInstance()方法。如果不位于栈顶,会产生一个新的实例。
    e、singleTask: 会在一个新的 task 中产生这个实例,以后每次调用都会使用这个,不会去产生 新的实例了。
    f、singleInstance: 这个跟 singleTask 基本上是一样, 只有一个区别: 在这个模式下的 Activity实例所处的 task 中,只能有这个 activity实例,不能有其他的实例。

  14. dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
    a、每个dvm虚拟机都是linux里面的一个进程.
    b、dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,
    c、三个进程不是一个概念,但是在使用中由于一个dvm虚拟机就是一个linux进程,同时一个虚拟机只运行一个应用,所以也默认三者是同一个可以统一使用。

  15. 如何判断是否有SD卡?
    配置文件中有sd卡的权限, 通过environment的静态方法判断
    Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED )

  16. 嵌入式操作系统内存管理有哪几种, 各有何特性。
    页式,段式,段页,等 …

  17. 什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?
    实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。
    主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

  18. 谈谈对Android NDK的理解。
    a、native develop kit 是一个交叉编译的工具,可以编译c语言代码,生成在手机上运行的.so文件,供java语言调用
    b、一般在实时性要求高的应用里使用ndk,比如游戏, 图形渲染, opencv (人脸识别) ,高清解码等
    c、反编译C语言比Java困难,需要对核心源码进行保密的时候也可以使用NDK处理
    d、我们项目中那些地方用到了ndk, 比如手机影音、百度地图

  19. Android系统中GC什么情况下会出现内存泄露呢? 内存溢出(OOM)
    a、Java 内存泄露的根本原因就是 保存了不可能再被访问的变量类型的引用
    b、如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放。
    c、要确定对象所占内存将被回收,我们就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为null或者从集合中移除该对象。
    d、当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。
    e、如果出现大量的内存泄露,导致有内存被对象占用不能释放,最终导致内存耗尽无法创建新的对象,就会出现内存溢出(OOM)
    Java带垃圾回收的机制,为什么还会内存泄露呢?
    Vector v = new Vector(10);
    for (int i = 1; i < 100; i++) {
     Object o = new Object();  
    v.add(o);  
    o = null;
    }//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。

Handler h = new Handler();

  1. java中的soft reference是个什么东西
    a、StrongReference 是 Java 的默认引用实现, 它会尽可能长时间的存活于 JVM 内, 当没有任何对象指向它时 GC 执行后将会被回收
    b、SoftReference 会尽可能长的保留引用直到 JVM 内存不足时才会被回收(虚拟机保证), 这一特性使得 SoftReference 非常适合缓存
    c、WeekReference 在每次GC时都被回收
    d、在以前的开发里,图片的缓存多数使用软引用,保证内存不足时图片能够及时被回收。在Android2.3版本之后软引用的功能被修改为弱引用一样,导致图片总是要不断重新加载,性能很差。新的图片缓存实现都是LruCache机制。
  2. 说说LruCache底层原理
    a、LruCache使用一个LinkedHashMap简单的实现内存的缓存,没有软引用,都是强引用。如果添加的数据大于设置的最大值,就删除最先缓存的数据来调整内存。
    b、通过构造方法初始化的maxSize值,它表示这个缓存的最大值是多少。一般都是可用的内存大小的八分之一, Runtime.getRuntime().maxMemory() / 8,
    c、插入图片时首先会判断插入后的size大小是否超过maxSize,如果超过了,就删除最长时间未使用的缓存。这个操作将一直循环下去,直到size比maxSize小或者缓存为空。
  3. 如何避免oom异常
    OOM内存溢出,想要避免OOM异常首先我们要知道什么情况下会导致OOM异常。
    a. 图片过大导致OOM
    Android 中用bitmap时很容易内存溢出,比如报如下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget。
    解决方法:
    方法1: 等比例缩小图片

以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。
方法2:使用LruCache机制管理图片。限制图片的内存上限,并及时地进行recyle()操作
方法3:使用加载图片框架处理图片,如专业处理加载图片的ImageLoader图片加载框架。还有我们学的XUtils的BitMapUtils来做处理。
b.界面切换导致oom
一般情况下,开发中都会禁止横屏的。因为如果是来回切换话,activity的生命周期会重新销毁然后创建。
有时候我们会发现这样的问题,横竖屏切换N次后 OOM了。
这种问题没有固定的解决方法,但是我们可以从以下几个方面下手分析。
1、看看页面布局当中有没有大的图片,比如背景图之类的。
去除xml中相关设置,改在程序中设置背景图(放在onCreate()方法中):

在Activity destory时注意,drawable.setCallback(null); 防止Activity得不到及时的释放。

2、跟上面方法相似,直接把xml配置文件加载成view 再放到一个容器里,然后直接调用 this.setContentView(View view);方法,避免xml的重复加载。
3、 在页面切换时尽可能少地重复执行一些代码
比如:重复调用数据库,反复使用某些对象等等......
c.查询数据库没有关闭cursor
程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会出现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
d.构造Adapter没有使用convertview
在使用ListView的时候通常会使用Adapter,那么我们应该尽可能的使用ConvertView。
e、为变量设置合适的作用范围
尽量小的变量作用范围可以保证变量尽快被回收,节约内存。

  1. 根据自己的理解描述下Android数字签名。
    a、所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
    b、Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证 (对于网站而言,如果要证明自己是可信的,他们需要使用权威证书网站的证书)
    c、如果要正式发布一个Android ,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
    d、数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能
  2. 什么是ANR 如何避免它?
    a、在Android上,主线程使用来更新UI的,如果你的应用程序在主线程做耗时的操作,导致有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。
    b、要避免这个问题可以把耗时的操作放在子线程里面完成, handler message,AsynTask , intentservice.等
  3. android中的动画有哪几类,它们的特点和区别是什么?
    帧动画, 补间动画, 属性动画;
     帧动画(Frame Animation)一般用于图片的切换,实现生成连续的gif图效果
     补间动画(Tween Animation)分为平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度(Alpha);补间动画只是改变了View的显示效果
     属性动画(Property Animation),Android3.0 (API11)及以后出现的功能,3.0之前的版本可使用github第三方开源库nineoldandroids.jar进行支持。支持对所有View能更新的属性的动画,如translationX水平平移, translationY竖直平移,alpha透明度, left左边位置, rotation旋转角度, scale缩放等,
     属性动画不仅能实现补间动画的所有效果,而且是对view或任意对象的属性的不断进行的值操作。比如一个Button的位移,补间动画只是重绘了view,并没有真正的去改变Button的位置,点击事件还是停留在原来的位置,而属性动画就是在真正改变Button的位置;
  4. 如何屏幕适配
    Android的屏幕适配主要有五种方式:
    a、layout适配,根据不同的屏幕大小加载不同文件夹下的布局文件图片适配.
    b、权重适配,设置显示比例。
    c、根据不同屏幕大小使用不同文件夹下的图片。使用9Patch图片。
    d、dimens.xml文件适配,根据不同的手机的密度加载不同文件夹下的dimens.xml
    e、java代码适配
  5. Emoji表情实现
    a、使用SpannableString可以把TextView或EditText的一部分文本替换为图片。
    b、Span不仅可以在Textview、Edittext中把一部分内容设置为图片,还可以设置一部分内容的样式,如:字体、颜色、点击事件等。

SpannableString spannableString = new SpannableString("0123456789");
Drawable icon = getResources().getDrawable(R.drawable.ic_launcher);
ImageSpan span = new ImageSpan(icon);
spannableString.setSpan(span,2,3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

  1. 自定义控件常用的方法
    a、onMeasure方法:测量控件的大小
    b、onLayout方法:对子View进行排版
    c、onDraw方法:把控件画出来
    d、onTouch方法:处理触摸事件

  2. Android中touch事件的传递机制是怎样的?
    a、Touch事件传递的相关API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent
    b、Touch事件相关的类有View、ViewGroup、Activity
    c、Touch事件会被封装成MotionEvent对象,该对象封装了手势按下、移动、松开等动作
    d、Touch事件通常从Activity#dispatchTouchEvent发出,只要没有被消费,会一直按布局层次往下传递,到最底层的View。
    e、如果Touch事件传递到的每个View都不消费事件,那么Touch事件会反向向上传递,最终交由Activity#onTouchEvent处理.
    f、onInterceptTouchEvent为ViewGroup特有,可以拦截事件.
    g、Down事件到来时,如果一个View没有消费该事件,那么后续的MOVE/UP事件都不会再给它

  3. 说说mvc模式的原理,它在android中的运用。
    a、MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
    b、Android里MVC模式的使用随处都可以见到。最基本的就是控件对象,xml布局文件,Activity类。以及数据集合,ListView,Adapter。

  4. udp连接和TCP的不同之处,Socket是什么?
    a、tcp确保数据安全,建立连接时有三次握手过程。面向连接流
    b、udp 不关心数据是否达到,是否阻塞。面向无连接
    c、画面优先. tcp 流畅优先 udp
    d、协议只是一个文档约定,Socket是Java语言里对TCP/IP协议的实现
    描述下这三次TCP对话的简单过程:
    主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;
    主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;
    主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。
    三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

  5. 手写一个单例模式,能不能保证使用时对象的唯一性
    a、饿汉式和懒汉式的单例模式代码到处都有,请自行查找学习
    b、这两种方法都不能保证使用时对象的唯一性。比如,当对象是可序列化的,保存对象到本地后,每次反序列化都是生成了一个新的对象。
    c、最好的实现单例模式的方案为,编写一个包含单个元素的枚举。程序员无法自己new出枚举对象,保证了只能有一个对象。同时枚举的序列化机制也不会在反序列化时创建出新的对象,保证对象的唯一性。

  6. 你知道推送的原理吗?调用哪个方法可以接收消息,传递哪些参数呢?
    a、传统获取服务器数据使用的是pull模式,是客户端向服务器请求数据。从客户端发起连接请求,获取到服务器数据后就关闭连接。当连接断开后,服务器就会失去客户端的地址,因此无法主动向客户端发送消息。
    b、推送(push)是服务主动向客户端发送数据。它的原理是保持一个长连接,当客户端和服务器建立连接后不再断开,这样服务器随时有新消息都可以发送给客户端。
    c、至于如何获取推送消息。由于服务端传来推送消息的时间是不确定的,这里只能等待推送SDK的回调,比如通过注册监听或者广播接收者。不同的厂商的推送SDK可能会有不同的处理方案,以百度推送SDK来说,是通过广播接收者获取推送数据。

  7. 开发中都使用到哪些框架、平台
    EventBus(事件处理)
    JPush(推送平台)
    友盟(统计平台)
    有米(优米)(广告平台)
    百度地图
    bmob(服务器平台、短信验证、邮箱验证、第三方支付)
    阿里云OSS(云存储)
    ShareSDK(分享平台、第三方登录)
    Gson(解析json数据框架)
    imageLoader (图片处理框架)
    zxing (二维码扫描)

  8. 开发过程中使用到哪些自定义控件
    pull2RefreshListView 下拉刷新
    LazyViewPager 只加载当前页
    SlidingMenu 侧栏菜单
    ToggleButton 滑动的开关

  9. android开发中怎么去调试bug
    a、logcat
    b、断点 debug
    c、从版本控制系统检出代码,查找出错的提交。比如一个月前没有的问题,突然出现,可以将代码回退到一个月前,使用二分法检查是哪一次提交的代码导致出现问题。

  10. 写10个简单的linux命令
    文件管理:ls mv rm cd mkdir
    网络管理:ping ifconfig
    文件搜索、编辑:find grep vi cat
    查看系统资源占用:du df ps top

  11. JNI调用常用的两个参数
    JNIEnv *env, jobject javaThis

  12. ddms 和traceview的区别.
    a、 DDMS全称daivilk debug manager system,是Android自带的debug界面
    b、TraceView是Android的性能分析工具,是DDMS组成的一部分

1.在应用的主activity的onCreate方法中加入Debug.startMethodTracing("要生成的traceview文件的名字");
2.同样在主activity的onStop方法中加入Debug.stopMethodTracing();
3.同时要在AndroidManifest.xml文件中配置权限

3.重新编译,安装,启动服务,测试完成取对应的traceview文件(adb pull /sdcard/xxxx.trace)。
4.直接在命令行输入traceview xxxxtrace,弹出traceview窗口,分析对应的应用即可。

  1. 手写算法
    a、一般面试考察的都是计算机入门的基本算法,比如排序和查找,并且会要求在纸上手写Java代码或伪代码。
    b、排序最基础的是冒泡排序。如果可以使用快速排序,可以认为学习能力优秀。
    c、查找最基础的算法是有序数组的折半查找。
    d、对于复杂的测试,比如让现场写一个自定义控件,可以分析一下实现思路。
  2. 项目如何向低版本兼容
    a、样式兼容:
    (1)使用兼容包中的样式,如v7\v4 中的Compat 相关样式。
    (2)定义多个不同value文件夹,不同版本指定不同样式。
    b、布局兼容:
    定义多个不同layout-verson(verson为版本数字) 的文件夹,不同版本指定不同的布局文件。
    c、高版本代码兼容方式:
    (1)尽量使用兼容包中的API,如getSupportActionBar, getSupportFragmentManager() 等。
    (2)使用系统Version 来判断,使低版本系统不能执行高版本代码。同时使用 @TargetApi 来消除eclipse、AS 等工具报错。
  3. 介绍一下你的项目架构
    架构是程序的骨架,确定了总体的接口,要求具体的子类实现细节处理。并不是非要用到反射、注解等高级技术才能叫架构。
    a、界面架构 BaseActivity,BaseFragmen。拆解onCreate过程为initView、initListener、initData
    b、网络架构 三级网络封装
    c、图片、文件、数据库等数据数据管理架构

你可能感兴趣的:(java与Android知识点)