安卓面试易考题(二)

这是延续上一部分的知识,依然是面试题,进入正题:

面试题一:谈谈你对Activity的理解:

这是考官希望你把自己的心得,做项目的时候的体会写出来;我们可以答Activity异常被系统回收的时候怎么处理的,然后可以讲讲Activity的生命周期。

面试题二:Service是否运行在主线程?能否在Service里面执行耗时的操作?

答:service是默认运行在主线程的,很多人觉得是后台服务就觉得应该是在子线程,其实不是,所以我们不能在里面执行耗时的操作,因为会产生ANR异常。我们要做耗时的操作要新开一个线程,处理耗时操作。

当然我们也可以指定service在指定线程中执行,一般我们在配置清单文件的时候指定所在的线程:

Java代码

  1. <service  android:process="cn.itcast.xxx"></service>

面试题三:两个Activity之间怎么传递数据?

答:如果是基本的数据类型,我们可以通过Intent 传递数据,也可以通过intent putExtra传递一个bundle过来,其他的intent想要获取数据,可以通过:

Java代码

  1. Intent intent = getIntent();
  2. Bundle bundle = intent.getExtras();

Bundle 类似map的集合

Java代码

  1. intent.getStringExtra("key","value");
  2. intent.getBooleanExtra("key","value")

但是如果是复杂类型的话,我们可以在Application 全局里面存放 对象 ,自己去实现自己的application的这个类,基础系统的application ,每个activity都可以取到 ,当然记得 清单文件里面配置一下。

实现复杂类型的传递还可以通过让一个对象实现Serializable接口,实现了在各个接口后就可以序列化到文件,具体实现过程是实例化一个FileOutputStream和一个ObjectOutputStream,然后通过对象输出流向文件写数据。我们在另外一个Activity通过对象 读取这个对象数据,这样就能实现了:

Java代码

  1. File file = new File("c:\\1.obj");
  2. FileOutputStream fos  = new FileOutputStream(file);
  3. ObjectOutputStream oos = new ObjectOutputStream(fos);
  4. Student stu = new Student();
  5. stu.setId("10001");
  6. stu.setName("zs");
  7. oos.writeObject(stu);
  8. FileInputStream fis = new FileInputStream(file);
  9. ObjectInputStream ois = new ObjectInputStream(fis);
  10. Student stu1 = (Student) ois.readObject();
  11. System.out.println(stu1.getName());

以上通过Serializable把对象序列化到文件然后读取效率不高,入门如果是序列化到内存效率就高了,Google于是提供了parcelable接口,Parcelable 把对象序列化到android操作系统 的一块公用的内存空间。

其实传递对象我们还可以用Gson,类似于json把对象按照一定格式打包成字符串,然后通过intent传递基本数据类型一样再反序列化拿到数据:

Java代码

  1. Gson gson = new Gson();
  2. List<Person> persons = new ArrayList<Person>();
  3. for (int i = 0; i < 10; i++) {
  4. Person p = new Person();
  5. p.setName("name" + i);
  6. p.setAge(i * 5);
  7. persons.add(p);
  8. }
  9. String str = gson.toJson(persons);

然后我们拿到这个str字符串,取单个对象:

Java代码

  1. Person person = gson.fromJson(str, Person.class);

取对象集合:

Java代码

  1. List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());
  2. for(int i = 0; i < ps.size() ; i++)
  3. {
  4. Person p = ps.get(i);
  5. System.out.println(p.toString());
  6. }

但是如果我们要传递一个大文件的时候就不能用上面的方法了,因为效率太低,我们就会传递一个引用过去,通过uri:

Java代码

  1. //传递数据的引用
  2. intent.setData(Uri)
  3. Uri.fromFile();  //大图片的传递
  4. contentResolver.getInputStream(uri);-----存数据
  5. contentResolver.getOutputStream(uri);----取数据

面试题四:怎么在启动一个Activity的时候启动一个service?

我们在OnCreate方法里面new Intent(要启动的service);然后startService(intent);。

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

这是可以的,我们可以在激活一个新的activity时候, 给intent设置flag:

Intent的flag添加FLAG_ACTIVITY_NEW_TASK singleinstance  单独的任务栈

,然后这个新开的Activity栈就会在单独的task栈里面。

Java代码

  1. Intent intent = new Intent(A.this,B.class);
  2. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  3. startActivity(intent);

当我们在开启的时候就已经设置了开启新的任务栈,拿我们在Activity的onCreate方法里面,即使还写了开启一个新任务栈,也不会重复开启。

面试题五:Activity怎么和Service绑定,怎么在activity中启动自己对应的service?

我们在Service的不同方法里面写服务,效果不一样的。

StartService()里面的话,一旦被创建  调用着无关   没法使用service里面的方法。

bindService () 把service 与调用者绑定 ,如果调用者被销毁, service会销毁。同时我们也可以使用里面的方法,通过复写里面的bandService启动服务:我们需要写一个自己的ServiceConnection对象MyConn,(重写onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.:

Java代码

  1. private class Myconn implements ServiceConnection
  2. {
  3. public void onServiceConnected(ComponentName name, IBinder service) {
  4. // TODO Auto-generated method stub
  5. //可以通过IBinder的对象 去使用service里面的方法
  6. }
  7. public void onServiceDisconnected(ComponentName name) {
  8. // TODO Auto-generated method stub
  9. }
  10. }

面试题六:什么是service,service的生命周期?怎么启动一个service,这些方法有啥区别,怎么停用service?

在Service的生命周期中,因为没有界面,被回调的方法比Activity少一些,只有onCreate, onStart, onDestroy,方法,因为是服务,所以有onBind和onUnbind方法。

通常有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

1.通过startService

前面讲过,StartService,没有和调用者绑定在一起,Service会经历 onCreate 到onStart,然后处于运行状态,stopService的时候调用onDestroy方法。

如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。

2.通过bindService

这种方法是和调用者绑定在一起的,Service会运行onCreate,然后是调用onBind,调用者退出了,Srevice就会调用onUnbind->onDestroyed方法。所谓绑定在一起就共存亡了。调用者也可以通过调用unbindService方法来停止服务,这时候Srevice就会调用onUnbind->onDestroyed方法。

但是几个方法交织在一起的话,会出现什么情况呢?

一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又bindService,Service只被创建一次。

如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先是start,那么bind的时候就直接运行onBind方法。

如果service运行期间调用了bindService,这时候再调用stopService的话,service是不会调用onDestroy方法的,service就stop不掉了,只能调用UnbindService, service就会被销毁

如果一个service通过startService 被start之后,多次调用startService 的话,service会多次调用onStart方法。多次调用stopService的话,service只会调用一次onDestroyed方法。

如果一个service通过bindService被start之后,多次调用bindService的话,service只会调用一次onBind方法。

多次调用unbindService的话会抛出异常。

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

这个问题问得不太好,其实默认不做任何处理,B里面的音乐都能播放.

遇到问题, 可以随机应变,灵活发挥,多考虑些细节,比如说这个题就可以这样说,说说你对startActivityForResult的理解()

A开启B的时候,用startActivityForResult()方法, B返回的时候把播放的状态信息返回给A ,A继续播放音乐.

面试题八:什么是IntentService?有何优点?

简单来讲相对于一般service他自己开了一个thread,我们在OnHandleIntent()里面处理耗时的操作。它是Sdk给我们提供的方便的,带有异步处理的service类,异步处理的方法    OnHandleIntent()。每次执行OnHandleIntent方法,都回开启一个不同的线程。

面试题九:什么时候使用Service?

前台进程优先级最高,最难被杀死,service只比前台进程优先级第一点,用service能让我们在后台运行的进程不容易挂掉。

1. 如果service正在调用onCreate,  onStartCommand或者onDestory方法,那么用于当前service的进程相当于前台进程以避免被killed。

2. 如果当前service已经被启动(start),拥有它的进程则比那些用户可见的进程优先级低一些,但是比那些不可见的进程更重要,这就意味着service一般不会被killed.

3.如果一个前台进程同时又绑定到了service上,那这个进程优先级最高。可以理解为,service是可见的。

4. 如果service可以使用startForeground(true)方法来将service设置为前台状态,相当于强行提高了这个service的优先级,那么系统就认为是对用户可见的,并不会在内存不足时killed。

那service用在哪里呢?

1.Service的特点可以让他在后台一直运行,可以在service里面创建线程去完成耗时的操作. 天气预报 widget TimerTask Timer 定期执行timertask。

2.Broadcast receiver捕获到一个事件之后,可以起一个service来完成一个耗时的操作.  Broadcast receiver生命周期 和 响应时间很短,只有10秒,没执行完的话就没有执行了。

  • 远程的service如果被启动起来,可以被多次bind, 但不会重新create.  索爱手机X10i的人脸识别的service可以被图库使用,可以被摄像机,照相机等程序使用.

安卓面试易考题(二)

时间: 2024-10-12 08:04:01

安卓面试易考题(二)的相关文章

iOS开发——面试篇&amp;面试总结(二)

面试总结(二) 1. 风格纠错题 修改方法有很多种,现给出一种做示例: 下面对具体修改的地方,分两部分做下介绍:硬伤部分和优化部分 .因为硬伤部分没什么技术含量,为了节省大家时间,放在后面讲,大神请直接看优化部分. 优化部分 1)enum建议使用 NS_ENUM 和 NS_OPTIONS 宏来定义枚举类型,参见官方的 Adopting Modern Objective-C 一文: 1 2 3 4 5 //定义一个枚举 typedef NS_ENUM(NSInteger, CYLSex) {   

安卓面试备考题收集

最近要参加面试,网上找了一些题来备着,大家也来学习学习吧,话说平时还真有些东西不知道... 面试题一:AIDL的全称是什么?如何工作? Android interface definition language (android接口定义语言) , 用来跨进程的访问方法, 像 游戏中调用支付宝接口就是用的这个. 访问远程的服务的方法. 如何工作. 面试题二:Android程序运行时权限与文件系统权限的区别? 程序运行时权限:Android程序执行需要读取到安全敏感项必需在androidmanife

安卓图表引擎AChartEngine(二) - 示例源码概述和分析

首先看一下示例中类之间的关系: 1. ChartDemo这个类是整个应用程序的入口,运行之后的效果显示一个list. 2. IDemoChart接口,这个接口定义了三个方法, getName()返回值是listitem上显示的标题; getDesc()返回值是listitem上显示的描述内容. excute(context)返回值是一个Intent,当点击listitem后跳转到此Intent. 3. AbstractDemoChart类是一个抽象类,实现接口IDemoChart接口,这个类中封

安卓学习笔记(二)基本构件

1.Activity 一个Activity,通常是用户在某一个时刻,在设备上看到的单独的界面.一个应用程序通常含有多个Activity,用户可在期间进行切换.对用户而言,这就是程序的外观部分. Activity的生命周期:启动一个Activity可能会消耗大量资源.他可能会涉及到新建一个Linux进程.为UI对象申请内存空间.从UML布局填充所有对象,以及创建整个界面.为了避免这种浪费,Android通过ActivityManager来管理活动的生命周期. ActivityManager负责创建

安卓 面试经验

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha #Alibaba 一面 说一下你怎么学习安卓的? 项目中遇到哪些问题,如何解决的? Android事件分发机制? 三级缓存底层实现? HashMap底层实现,hashCode如何对应bucket? Java的垃圾回收机制,引用计数法两个对象互相引用如何解决? 用过的开源框架的源码分析 Acticity的生命周期,Activity异常退出该如何处理? tcp和udp的区别,tcp如何保

Java 面试知识点解析(二)——高并发编程篇

前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大部分内容参照自这一篇文章,有一些自己补充的,也算是重新学习一下 Java 吧. 前序文章链接: Java 面试知识点解析(一)--基础知识篇 (一)高并发编程基础知识 这里涉及到一些基础的概念,我重新捧起了一下<实战 Java 高并发程序设计>这一本书,感觉到心潮澎湃,这或许就是笔者叙述功底扎实的

易扩展二次开发的web快速开发平台

我们先来看看web快速开发平台的发展 从编程之初,便免不了和方法,类,接口之类的东西打交道.久而久之,自然会对此进行总结,由此而产生了开发平台.而今中国的程序员之中,有很大一部分都是编一些企业MIS.政府MIS之类的程序.其主要工作就是对数据进行一下增删改查的操作,对MIS系统做一些基础的管理而已.随着互联网的流行,自然又要求以互联网为基础,把这些都网络化,以实现网络资源共享,而不是传统的单机模式.诸如用友.金蝶等都有自己的开发构件库,还有SAP的ABAP开发平台等等.但是ABAP开发平台太复杂

易 笔记(二)

先天八卦的顺序 乾一,兑二,离三,震四 正南的乾开始 东南兑 东离 东北震(背向挂顺时针) 巽五,坎六,艮七,坤八 西南巽,西方坎,西北艮,正北坤(背向挂逆时针) 九在中央 历史 天地人 三皇氏族 - 伏羲(先天)- 神农(炎帝氏族)- 黄帝(轩辕) 地理 以中国为本位 只看艮,兑,震,巽(不懂为何没有乾坤离坎),东南为大海

安卓飞机大战(二) SurfaceView实现自制背景

用SurfaceView写一个自制的背景图,并且可以移动,加上安卓飞机大战(一)中的BackgroundManager类,可以直接使用 GameView代码: public class GameView extends SurfaceView implements SurfaceHolder.Callback,Runnable{    private SurfaceHolder hd=null;    private Canvas canvas=null;    private Backgrou