面试知识点

作者: gadfly_only | 来源:发表于2016-08-08 23:39 被阅读487次

    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);
        }
    

    相关文章

      网友评论

        本文标题:面试知识点

        本文链接:https://www.haomeiwen.com/subject/gptwjttx.html