• 安卓Java面试题11-20


    🔥  11、Android本身的API并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,如何解决?🔥

    会,比如nullpointerException。我遇到过,比如textview.setText()时,textview没有初始化。会导致程序无法正常运行出现forceclose。打开控制台查看logcat信息找出异常信息并修改程序。

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

    对于单一Activity的应用来说,退出很简单,直接finish()即可。当然,也可以用 killProcess() 和System.exit()这样的方法

     对于多个activity:

    1、记录打开的Activity:每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

    2、发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

    3、递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

    为了编程方便,最好定义一个Activity基类,处理这些共通问题。

    在2.1之前,可以使用ActivityManager的restartPackage方法。
    它可以直接结束整个应用。在使用时需要权限android.permission.RESTART_PACKAGES。

    可是,在2.2,这个方法失效了。在2.2添加了一个新的方法,killBackground Processes(),需要权限 android.permission.KILL_BACKGROUND_PROCESSES。可惜的是,它和2.2的restartPackage一样,根本起不到应有的效果。

    另外还有一个方法,就是系统自带的应用程序管理里,强制结束程序的方法,forceStopPackage()。

    它需要权限android.permission.FORCE_STOP_PACKAGES。

    并且需要添加android:sharedUserId="android.uid.system"属性。

    同样可惜的是,该方法是非公开的,他只能运行在系统进程,第三方程序无法调用。
    因为需要在Android.mk中添加LOCAL_CERTIFICATE := platform。
    而Android.mk是用于在Android源码下编译程序用的。
    从以上可以看出,在2.2,没有办法直接结束一个应用,而只能用自己的办法间接办到。

     现提供几个方法,供参考:

    1、抛异常强制退出:
    该方法通过抛异常,使程序Force Close。
    验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

    2、记录打开的Activity:
    每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

    3、发送特定广播:
    在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

    4、递归退出
    在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

    除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。但是这样做同样不完美。你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。但至少,我们的目的达到了,而且没有影响用户使用。为了编程方便,最好定义一个Activity基类,处理这些共通问题。

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

    文件的系统权限是由linux系统规定的,只读,读写等。
    运行时权限,是对于某个系统上的app的访问权限,允许,拒绝,询问。该功能可以防止非法的程序访问敏感的信息。

     🔥  14、 简述Android系统的优势和不足?🔥

    Android平台手机 5大优势:

    一、开放性

    在优势方面,Android平台首先就是其开发性,开发的平台允许任何移动终端厂商加入到Android联盟中来。

    显著的开放性可以使其拥有更多的开发者,随着用户和应用的日益丰富,一个崭新的平台也将很快走向成熟。

    开放性对于Android的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,随大的受益正是丰富的软件资源。

    开放的平台也会带来更大竞争,如此一来,消费者将可以用更低的价位购得心仪的手机。

     二、挣脱运营商的束缚

    在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制。

    从去年iPhone 上市 ,用户可以更加方便地连接网络,运营商的制约减少。

    随着EDGE、HSDPA这些2G至3G移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈,当你可以通过手机IM软件方便地进行即时聊天时,再回想不久前天价的彩信和图铃下载业务,是不是像噩梦一样?互联网巨头Google推动的Android终端天生就有网络特色,将让用户离互联网更近。

    三、丰富的硬件选择

    这一点还是与Android平台的开放性相关,由于Android的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品。

    功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容,好比你从诺基亚 Symbian风格手机 一下改用苹果 iPhone ,同时还可将Symbian中优秀的软件带到iPhone上使用、联系人等资料更是可以方便地转移,是不是非常方便呢? 

     四、不受任何限制的开发商

    Android平台提供给第三方开发商一个十分宽泛、自由的环境,不会受到各种条条框框的阻扰,可想而知,会有多少新颖别致的软件会诞生。

    但也有其两面性,血腥、暴力、情色方面的程序和游戏如可控制正是留给Android难题之一。

     五、无缝结合的Google应用

    如今叱诧互联网的Google已经走过10年度历史,从搜索巨人到全面的互联网渗透,Google服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带,而Android平台手机将无缝结合这些优秀的Google服务。

     再说Android的5大不足:

    一、安全和隐私

    由于手机 与互联网的紧密联系,个人隐私很难得到保守。除了上网过程中经意或不经意留下的个人足迹,Google这个巨人也时时站在你的身后,洞穿一切,因此,互联网的深入将会带来新一轮的隐私危机。

     二、首先开卖Android手机的不是最大运营商

    众所周知,T-Mobile在23日,于美国纽约发布 了Android首款手机G1。但是在北美市场,最大的两家运营商乃AT&T和Verizon,而目前所知取得Android手机销售权的仅有 T-Mobile和Sprint,其中T-Mobile的3G网络相对于其他三家也要逊色不少,因此,用户可以买账购买G1,能否体验到最佳的3G网络服务则要另当别论了!

     三、运营商仍然能够影响到Android手机

    在国内市场,不少用户对购得移动定制机不满,感觉所购的手机被人涂画了广告一般。这样的情况在国外市场同样出现。Android手机的另一发售运营商Sprint就将在其机型中内置其手机商店程序。

     四、同类机型用户减少

    在不少手机论坛都会有针对某一型号的子论坛,对一款手机的使用心得交流,并分享软件资源。而对于Android平台手机,由于厂商丰富,产品类型多样,这样使用同一款机型的用户越来越少,缺少统一机型的程序强化。举个稍显不当的例子,现在山寨机泛滥,品种各异,就很少有专门针对某个型号山寨机的讨论和群组,除了哪些功能异常抢眼、颇受追捧的机型以外。

     五、过分依赖开发商缺少标准配置

    在使用PC端的Windows Xp系统的时候,都会内置微软Windows Media Player这样一个浏览器程序,用户可以选择更多样的播放器,如Realplay或暴风影音等。但入手开始使用默认的程序同样可以应付多样的需要。在 Android平台中,由于其开放性,软件更多依赖第三方厂商,比如Android系统的SDK中就没有内置音乐 播放器,全部依赖第三方开发,缺少了产品的统一性。

    🔥 15、简述嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?🔥

    嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。

    主要用于工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。

    又可分为软实时和硬实时两种,而android是基于linux内核的,因此属于软实时。

     🔥  16、 简述如何将SQLite数据库(dictionary.db文件)与apk共同发布?🔥

    可以将dictionary.db文件复制到Eclipse Android工程中的res aw目录中。

    所有在res aw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。

    可以将dictionary.db文件复制到res aw目录中

     🔥  17、 Android如何将打开res aw目录中的数据库文件?🔥

    在Android中不能直接打开res aw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。

    复制的基本方法是使用getResources().openRawResource方法获得res aw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

    🔥 18、简述DDMS和TraceView的区别? 🔥 

    Traceview 是 Android 平台特有的数据采集和分析工具,它主要用于分析 Android 中应用程序的 hotspot(瓶颈)。

    Traceview 本身只是一个数据分析工具,而数据的采集则需要使用 Android SDK 中的 Debug 类或者利用DDMS 工具。

    二者的用法如下:开发者在一些关键代码段开始前调用 Android SDK 中 Debug 类的 startMethodTracing 函数,并在关键代码段结束前调用 stopMethodTracing 函数。

    这两个函数运行过程中将采集运行时间内该应用所有线程(注意,只能是 Java线程) 的函数执行情况, 并将采集数据保存到/mnt/sdcard/下的一个文件中。

    开发者然后需要利用 SDK 中的 Traceview工具来分析这些数据。
    借助 Android SDK 中的 DDMS 工具。 DDMS 可采集系统中某个正在运行的进程的函数调用信息。

     🔥 19、阐述Android的IPC(进程间通信)机制?🔥

    IPC是内部进程通信的简称, 是共享"命名管道"的资源。

    Android中的IPC机制是为了让Activity和Service之间可以随时的进行交互,故在Android中该机制,只适用于Activity和Service之间的通信,类似于远程方法调用,类似于C/S模式的访问。

    通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理

    在Android中,有多种方式可以进行进程间通信(IPC)。以下是关于Android中IPC方式的介绍以及它们各自的优缺点:

    1. Intent:

    Intent是Android中常用的一种IPC方式,它可以在不同的应用组件之间传递消息和数据。优点是简单易用,适合用于启动其他应用的组件或者传递简单的数据。缺点是只能传递少量的数据,不适合大规模的数据交换,而且无法实现实时通信。(https://blog.csdn.net/qq_45716076/article/details/120589277)

     2. 文件共享:

    应用程序可以通过文件共享的方式进行IPC,将数据写入文件,然后其他进程读取该文件来获取数据。

    优点是简单直观,适用于较大的数据传输。缺点是需要频繁的读写文件,效率较低,而且可能存在并发读写问题。此外,文件共享不适合实时通信场景。

    (https://blog.csdn.net/qq_45716076/article/details/120589277)

     3. AIDL(Android Interface Definition Language):

    AIDL是一种基于接口的IPC方式,适用于跨进程的方法调用和数据交换。

    它使用类似于远程过程调用(RPC)的方式,通过定义接口来实现进程间方法的调用和传输复杂数据。

    优点是支持较复杂的数据类型和对象传输,并且具备线程同步机制。

    缺点是编写AIDL接口和处理跨进程通信的代码比较繁琐,需要手动管理线程同步和异常处理。

    (https://blog.csdn.net/qq_45716076/article/details/120589277)

     4. ContentProvider:

    ContentProvider是Android中的另一种IPC方式,它用于共享数据和访问跨进程的数据存储。

    ContentProvider通过URI来标识和访问数据,其他进程可以通过ContentResolver来读取和操作ContentProvider中的数据。

    优点是提供了标准化的数据访问接口,并且支持数据的增删改查操作。缺点是对于复杂的数据结构,需要进行序列化和反序列化,性能较低。

    (https://blog.csdn.net/qq_45716076/article/details/120589277)

     5. Messenger:

    Messenger是一种轻量级的IPC方式,基于AIDL实现。它通过Handler和Message对象来传递消息和数据,适用于低频率的进程间通信。优点是使用简单,对于跨进程的消息传递较为方便。缺点是无法实现实时通信,不适合高频率的数据交换。

    (https://blog.csdn.net/qq_45716076/article/details/120589277)

     6. Binder:

    Binder是Android系统中最常用和最强大的IPC方式。

    它是一种基于进程间通信(IPC)机制的框架,提供了高效的跨进程通信能力。

    Binder机制通过内核驱动支持,可以在不同进程间传递数据和调用方法。

    它的优点包括高效性、稳定性和安全性。Binder可以实现多线程并发访问,并提供了线程同步机制,能够处理多进程并发访问的问题。

    此外,Binder支持传递复杂的数据类型和对象,可以实现实时通信和高频率数据交换。

    缺点是使用Binder进行IPC相对复杂,需要编写AIDL接口和处理跨进程通信的代码。

    但是,Android框架已经提供了一些简化Binder使用的辅助类,如Messenger和IPC(Intents, Providers, and Content)机制,使得使用Binder变得更加方便。

      🔥 20、阐述Android NDK是什么?🔥

    原生开发套件 (NDK) 是一套工具,使您能够在 Android 应用中使用 C 和 C++ 代码,并提供众多平台库,您可使用这些平台库管理原生 Activity 和访问实体设备组件,例如传感器和触摸输入。

    NDK 可能不适合大多数 Android 编程初学者,这些初学者只需使用 Java 代码和框架 API 开发应用。

    然而,如果您需要实现以下一个或多个目标,那么 NDK 就能派上用场:

    1.进一步提升设备性能,以降低延迟或运行游戏或物理模拟等计算密集型应用。

    2.重复使用您自己或其他开发者的 C 或 C++ 库。
    从这里我们可以简单总结为,ndk是一套可以Android应用到C 和 C++ 代码的工具,一般用于需要提升性能的计算密集型应用或复用已存在的C 和 C++ 代码库的时候使用。

    ndk具体作用可以用一句话概括:快速开发C、 C++的动态库,并自动将so和应用一起打包成 APK

  • 相关阅读:
    css学习笔记
    一文带你搞清楚Python的多线程和多进程
    基于FPGA的高速数据采集系统实现
    (C++17) optional的使用
    TypeScript实战之用TS封装Axios
    SQL 注入绕过(六)
    kafka系列(一)安装使用及基本原理
    机器视觉选型-什么时候用远心镜头
    maven与Jenkins
    H3C AC三层组网架构,AP自动上线自动固化
  • 原文地址:https://blog.csdn.net/u013491829/article/details/136550443