Android面试题Android今日看点

面试知识点

2016-08-08  本文已影响487人  gadfly_only

1.AIDL

1.aidl对应的接口名称与aidl文件名相同(aidl对应的接口名称必须与aidl文件名相同不然无法自动编译)
2.aidl的文件的内容类似java代码
3.创建一个Service(服务),在服务的onBind(Intent intent)方法中返回实现了aidl接口的对象
4.aidl对应的接口的方法前面不能加访问权限修饰符(public ,private,protected等,也不能用static final!)
5.AIDL默认支持的类型包括Java基本类型,String,List,Map,CharSequence,自定义类型需要实现Parcelable接口

2.前台进程

Paste_Image.png

3.Toast

使用Toast提示时,关于提示时长,显示时长默认只有2种设置,toast只能设置为 2s和3.5s.传进去自定义数字并不会报错,只是实际不起作用,想要更丰富的提示推荐用Dialog

4.AlertDialog

1.AlertDialog.Builder的create() 和show()方法都返回AlertDialog对象
2.AlertDialog不能直接用new关键字构建对象,而必须使用其内部类Builder(****因为其构造器都是保护的,所以不允许非子类调用****)

5.SQLiteOpenHelper对数据库进行管理的方法

getReadableDatabase()和 getWriteableDatabase()都可以得到一个可既可以读又可以写的数据库对象,不同的是,当磁盘空间满了之后, getReadableDatabase()得到的是一个只读的对象,而 getWriteableDatabase()则会抛出异常。

6.Android系统对下列哪些对象提供了资源池

A.Message提供了消息池,有静态方法Obtain从消息池中取对象;
B.Thread默认不提供资源池,除非使用线程池ThreadPool管理;
C.AsynTask是线程池改造的,池里 默认提供(核数+1)个线程进行并发操作,最大支持(核数 * 2 + 1)个线程,超过后会丢弃其他任务;
D.Looper,每个Looper创建时创建一个消息队列和线程对象,也不是资源池;
因此答案为AC

7.IntentService

继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期,那么与service不同的是,IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作。

8.style和theme

style和theme本质上就是同一个东西,xml格式完全相同,只是我用在activity上我就叫他theme,我用在view上我就叫他style。唯一的区别就是style里头控制的各个属性了,某些属性是只有针对Activity才能生效的(你view有标题栏嘛有状态栏有导航栏吗嘛?但是反过来Activity内部却有一个继承自View的Decorview) 。所以style可以作用在activity上,但是theme却不能反过来作用在view上

9.线程间通信

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 。

Paste_Image.png

Message:消息分为硬件产生的消息(如按钮、触摸)和软件生成的消息;
MessageQueue:消息队列的主要功能向消息池投递消息(MessageQueue.enqueueMessage)和取走消息池的消息(MessageQueue.next);
Handler:消息辅助类,主要功能向消息池发送各种消息事件(Handler.sendMessage)和处理相应消息事件(Handler.handleMessage);
Looper:不断循环执行(Looper.loop),按分发机制将消息分发给目标处理者。
《Android中Handler引起的内存泄露》

10.Activity间通过Intent传递数据大小限制

底层parcel对象在不同activity直接传递过程中保存在一个叫做“ Binder transaction buffe”的地方,既然是缓冲区,肯定有大小限制1M。(官方解释,对于具体某一次Activity间传输的限制大小是不确定的,依据使用环境而定)
该博客“Yet another post on Serializable vs Parcelable”中 Serializable和Parcel时提到以下两点数据,仅供参考了解,实际使用各有不同

  1. 使用 Serializable 和parcel传输相同对象,都转换为byte[]后,parcel大概是serializable的20倍了。
  2. 但是官方建议使用Parcel,原因是说速度是serializable的将近10倍。

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

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

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

Dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,每个android程序系统都会给他分配一个单独的liunx uid(user id),每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.

12. 如何在一个Service中启动一个Activity

Intent intent = new Intent(Service.this,TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

13.程序之间的亲和性的理解

1、默认情况下一个应用的所有Activity都是具有相同的affinity,都是从application中继承,application的affinity默认就是manifest的包名。
2、affinity对Activity来说,就像是身份证一样,可以告诉所在的Task,自己属于其中的一员。
3、应用场合:
a:根据affinity重新为Activity选择合适的宿主Task;
b:与allowTaskReparenting属性配合;
c:启动Activity使用Intent设置了FLAG_ACTIVITY_NEW_TASK标记。

14.注册广播有几种方式,这些方式有什么特点和区别?

两种方式,首先这两种方式都要先写继承自broadcastreceive的类
答: 第一种:在清单文件中声明,添加
<receive android:name=".IncomingSMSReceiver " >
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED")
<intent-filter>
<receiver>
第二种使用代码进行注册如:
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomgSMSReceiver();
registerReceiver(receiver,filter);
两种注册类型的区别是:
1)第二种不是常驻型广播,也就是说广播跟随程序的生命周期。
2)第一种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

15.Activity A 启动 Activity B 时一系列操作的发生顺序

Activity A 的 onPause方法执行。
Activity B 的 onCreate、onStart和 onResume方法依次执行。
然后,如果 Activity A 在屏幕上不再可见,则其 onStop方法执行。

您可以利用这种可预测的生命周期回调顺序管理从一个 Activity 到另一个 Activity 的信息转变。 例如,如果您必须在第一个 Activity 停止时向数据库写入数据,以便下一个 Activity 能够读取该数据,则应在 onPause而不是 onStop执行期间向数据库写入数据.
onPause较容易被触发,所以我们在做BroadcastReceiver注销时放在onStop要好些。onPause时Activity界面仍然是可见的,如弹出一个Dialog时。但在保存数据时,放在onPause去做可以保证数据存储的有效性,如果放在onStop去做,在某些情况下Activity走完onPause后有可能还没顺利走到onStop就被系统回收了。

16.如何实现应用内多语言切换?

直接调用Android开放的接口Resources.updateConfiguration:

 public static void changeSystemLanguage(Context context, String language) {
        if (context == null || TextUtils.isEmpty(language)) {
            return;
        }

        Resources resources = context.getResources();
        Configuration config = resources.getConfiguration();
        if (Locale.SIMPLIFIED_CHINESE.getLanguage().equals(language)) {
            config.locale = Locale.SIMPLIFIED_CHINESE;
        } else {
            config.locale = new Locale(language);
        }
        resources.updateConfiguration(config, null);
    }
上一篇下一篇

猜你喜欢

热点阅读