一、Android 基本常识
1、写 10 个简单的 linux 命令
mkdir 创建文件夹 rmdir 删除文件夹 rm 删除文件 mv 移动文件 cp 拷贝文件 cat 查看文件 tail 查看文件尾部 more 分页查看文件 cd 切换当前目录 ls 列出文件清单 reboot 重启 date 显示日期 cal 显示日历
ps 查看系统进程相当于 windows 的任务管理器 ifconfig 配置网络
2、书写出 android 工程的目录结构
android. jar 依赖的 android sdk assets 资源文件 bin 生成的字节码 apk 在此 libs 依赖 jar 和 so res 资源文件
drawable drawable-hdpi layout
menu values
AndroidManifest.xml
project.properties
3、什么是 ANR 如何避免它?
在 Android 上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示
ANR 给用户。
不同的组件发生 ANR 的时间不一样,主线程(Activity、Service)是 5 秒,BroadCastReceiver 是 10 秒。解决方案:将所有耗时操作,比如访问网络,Socket 通信,查询大量 SQL 语句,复杂逻辑计算等都放在子线程中去,然后通过 handler.sendMessage、runonUITread、AsyncTask 等方式更新 UI。无论如何都要确保用户界面操作的流畅度。如果耗时操作需要让用户等待,那么可以在界面上显示进度条。
4、谈谈 Android 的优点和不足之处
优点:
1、开放性,开源,免费,可定制
2、挣脱运营商束缚
3、丰富的硬件选择
4、不受任何限制的开发商
5、无缝结合的 Google 应用缺点:
1、安全问题、隐私问题
2、同质化严重
3、运营商对 Android 手机仍然有影响
4、山寨化严重
5、过分依赖开发商,缺乏标准配置
5、一条最长的短信息约占多少 byte?
在国内的三大运营商通常情况下中文 70(包括标点),英文 160 个。对于国外的其他运行商具体多长需要看运营商类型了。
android 内部是通过如下代码进行判断具体一个短信多少 byte 的。
ArrayList android.telephony.SmsManager.divideMessage(String text)
7、如何判断是否有 SD 卡?
通过如下方法:
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
如果返回 true 就是有 sdcard,如果返回 false 则没有。
8、dvm 的进程和 Linux 的进程, 应用程序的进程是否为同一个概念?
dvm 指 dalvik 的虚拟机。每一个 Android 应用程序都拥有一个独立的 Dalvik 虚拟机实例,应用程序都在它自己的进程中运行。而每一个 dvm 都是在 Linux 中的一个进程,所以说可以近似认为是同一个概念。
什么是 android DVM:Dalvik 是 Google 公司自己设计用于 Android 平台的 Java 虚拟机,每一个 Dalvik 应用作为一个独立的 Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
Dalvik 和 Java 虚拟机的区别
- Dalvik 主要是完成对象生命周期管理,堆栈管理,线程管理,安全和异常管理,以及垃圾回收等等重要功能。
- Dalvik 负责进程隔离和线程管理,每一个 Android 应用在底层都会对应一个独立的 Dalvik 虚拟机实例,其代码在虚拟机的解释下得以执行。
- 不同于 Java 虚拟机运行 java 字节码,Dalvik 虚拟机运行的是其专有的文件格式 Dex
- dex 文件格式可以减少整体文件尺寸,提高 I/O 操作的类查找速度。
- odex 是为了在运行过程中进一步提高性能,对 dex 文件的进一步优化。
- 所有的 Android 应用的线程都对应一个 Linux 线程,虚拟机因而可以更多的依赖操作系统的线程调度和管理
机制
- 有一个特殊的虚拟机进程 Zygote,他是虚拟机实例的孵化器。它在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和 Zygote 共享一块内存区域。
9.Android 程序与 Java 程序的区别?
- Android 程序用 android sdk 开发,java 程序用 javasdk 开发.
- Android SDK 引用了大部分的 Java SDK,少数部分被 Android SDK 抛弃,比如说界面部分,java.awt swing package 除了 java.awt.font 被引用外,其他都被抛弃,在 Android 平台开发中不能使用。android sdk 添加工具 jar httpclient , pull opengl
10、启动应用后,改变系统语言,应用的语言会改变么?
这个一般是不会的,一般需要重启应用才能改变应用语言。但是对应应用来说如果做了国际化处理则支持如果没
有处理那系统语言再更改也是无用的。
11、请介绍下 adb、ddms、aapt 的作用
adb 是 Android Debug Bridge ,Android 调试桥的意思,ddms 是 Dalvik Debug Monitor Service,dalvik 调
试监视服务。aapt 即 Android Asset Packaging Tool,在 SDK 的 build-tools 目录下。该工具可以查看,创建, 更新 ZIP 格式的文档附件(zip, jar, apk)。也可将资源文件编译成二进制文件,尽管我们没有直接使用过该工具,但是开发工具会使用这个工具打包 apk 文件构成一个 Android 应用程序。
Android 的主要调试工具是 adb(Android debuging bridge),ddms 是一个在 adb 基础上的一个图形化工具。adb,它是一个命令行工具。而 ddms 功能与 adb 相同,只是它有一个图形化界面。对不喜欢命今操作方式的人
来说是一个不错的选择。
12、ddms 和 traceview 的区别
ddms 原意是:davik debug monitor service。简单的说 ddms 是一个程序执行查看器,在里面可以看见线程和堆栈等信息,traceView 是程序性能分析器。traceview 是 ddms 中的一部分内容。
14、Android 中数据存储方式有哪些?
a)文件存储
b)xml,SharedPreference
c)SQLiteDatabase
d)ContentProvider
e)网络
15、DVM 和 JVM 的区别?
a)dvm 执行的是.dex 文件,而 jvm 执行的是.class。Android 工程编译后的所有.class 字节码会被 dex 工具抽取到一个.dex 文件中。
b)dvm 是基于寄存器的虚拟机 而 jvm 执行是基于虚拟栈的虚拟机。寄存器存取速度比栈快的多,dvm 可以根据硬件实现最大的优化,比较适合移动设备。
c).class 文件存在很多的冗余信息,dex 工具会去除冗余信息,并把所有的.class 文件整合到.dex 文件中。减少了 I/O 操作,提高了类的查找速度。
16、谈一谈 Android 的安全机制
1、Android 是基于 Linux 内核的,因此 Linux 对文件权限的控制同样适用于 Android
在 Android 中每个应用都有自己的/data/data/包名 文件夹,该文件夹只能该应用访问,而其他应用则无权访问。
2、Android 的权限机制保护了用户的合法权益如果我们的代码想拨打电话、发送短信、访问通信录、定位、访问 sdcard 等所有可能侵犯用于权益的行为都
是必须要在 AndroidManifest.xml 中进行声明的,这样就给了用户一个知情权。
3、Android 的代码混淆保护了开发者的劳动成果
17、Android 的四大组件都需要在清单文件中注册吗?
Activity 、 Service 、 ContentProvider 如果要使用则必须在 AndroidManifest.xml 中进行注册,而
BroadcastReceiver 则有两种注册方式,静态注册和动态注册。其中静态注册就是指在 AndroidManifest.xml 中进行
注册,而动态注册时通过代码注册。
18、在 Android 中进程的级别有哪些?
a)Foreground process
b)Visible process
c)Service process
d)Background process
e)Empty process
二、Activity
1、什么是 Activity?
四大组件之一,通常一个用户交互界面对应一个activity。activity 是Context的子类,同时实现了window.callback
和 keyevent.callback, 可以处理与窗体用户交互的事件。
常见的 Activity 类型有 FragmentActivitiy,ListActivity,TabAcitivty 等。如果界面有共同的特点或者功能的时候,还会自己定义一个 BaseActivity。
2、请描述一下 Activity 生命周期
Activity 从创建到销毁有多种状态,从一种状态到另一种状态时会激发相应的回调方法,这些回调方法包括: onCreate onStart onResume onPause onStop onDestroy
其实这些方法都是两两对应的,onCreate 创建与 onDestroy 销毁; onStart 可见与 onStop 不可见;onResume 可编辑(即焦点)与 onPause;
这 6 个方法是相对应的,那么就只剩下一个 onRestart 方法了,这个方法在什么时候调用呢?
答案就是:在 Activity 被 onStop 后,但是没有被 onDestroy,在再次启动此 Activity 时就调用 onRestart(而不再调用 onCreate)方法;
如果被 onDestroy 了,则是调用 onCreate 方法。
3、Activity 的状态都有哪些?
a)foreground activity
b)visible activity
c)background activity
empty process
4、如何保存 Activity 的状态?
Activity 的状态通常情况下系统会自动保存的,只有当我们需要保存额外的数据时才需要使用到这样的功能。一般来说, 调用 onPause()和 onStop()方法后的 activity 实例仍然存在于内存中, activity 的所有信息和状态数据
不会消失, 当 activity 重新回到前台之后, 所有的改变都会得到保留。
但是当系统内存不足时, 调用onPause()和onStop()方法后的activity可能会被系统摧毁, 此时内存中就不会存有该 activity 的实例对象了。如果之后这个 activity 重新回到前台, 之前所作的改变就会消失。为了避免此种情况的发生,
我们可以覆写 onSaveInstanceState()方法。onSaveInstanceState()方法接受一个 Bundle 类型的参数, 开发者可以将状态数据存储到这个 Bundle 对象中, 这样即使 activity 被系统摧毁, 当用户重新启动这个 activity 而调用它的onCreate()方法时, 上述的 Bundle 对象会作为实参传递给 onCreate()方法, 开发者可以从 Bundle 对象中取出保存的数据, 然后利用这些数据将 activity 恢复到被摧毁之前的状态。
需要注意的是, onSaveInstanceState()方法并不是一定会被调用的, 因为有些场景是不需要保存状态数据的. 比
如用户按下 BACK 键退出 activity 时, 用户显然想要关闭这个 activity, 此时是没有必要保存数据以供下次恢复的, 也
就是 onSaveInstanceState()方法不会被调用. 如果调用 onSaveInstanceState()方法, 调用将发生在 onPause()或onStop()方法之前。
@Override
protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState);
}
5、两个 Activity 之间跳转时必然会执行的是哪几个方法?
一般情况下比如说有两个 activity,分别叫 A,B,当在 A 里面激活 B 组件的时候, A 会调用 onPause()方法,然后 B 调
用 onCreate() ,onStart(), onResume()。这个时候 B 覆盖了窗体, A 会调用 onStop()方法. 如果 B 是个透明的,或者是对话框的样式, 就不会调用 A 的onStop()方法。
6、横竖屏切换时 Activity 的生命周期
此时的生命周期跟清单文件里的配置有关系。
1、不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期默认首先销毁当前 activity,然后重新加载。
2、设置 Activity 的 android:configChanges=”orientation|keyboardHidden|screenSize”时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法。
通常在游戏开发, 屏幕的朝向都是写死的。
7、如何将一个 Activity 设置成窗口的样式?
只需要给我们的 Activity 配置如下属性即可。
android:theme=”@android:style/Theme.Dialog”
8、如何退出 Activity?如何安全退出已调用多个 Activity 的 Application?
1、通常情况用户退出一个 Activity 只需按返回键,我们写代码想退出 activity 直接调用 finish()方法就行。
2、记录打开的 Activity:
每打开一个 Activity,就记录下来。在需要退出时,关闭每一个 Activity 即可。
3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个 Activity 收到广播后,关闭即可。
//给某个 activity 注册接受接受广播的意图
registerReceiver(receiver, filter)
//如果过接受到的是 关闭 activity 的广播 就调用 finish()方法 把当前的 activity finish()掉4、递归退出
在打开新的 Activity 时使用 startActivityForResult,然后自己加标志,在 onActivityResult 中处理,递归关闭。
5、其实 也可以通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一个新的 activity。此时如果该任务栈中已经有该 Activity,那么系统会把这个 Activity 上面的所有 Activity 干掉。其
实相当于给 Activity 配置的启动模式为 SingleTop。
9、请描述一下 Activity 的启动模式都有哪些以及各自的特点
启动模式(launchMode)在多个 Activity 跳转的过程中扮演着重要的角色,它可以决定是否生成新的 Activity 实例,是否重用已存在的 Activity 实例,是否和其他 Activity 实例公用一个 task 里。这里简单介绍一下 task 的概念,task 是
一个具有栈结构的对象,一个 task 可以管理多个 Activity,启动一个应用,也就创建一个与之对应的 task。
Activity 一共有以下四种 launchMode:
1.standard
2.singleTop
3.singleTask
4.singleInstance
我们可以在 AndroidManifest.xml 配置的 android:launchMode 属性为以上四种之一即可。下面我们结合实例一一介绍这四种 lanchMode:
8.1 standard
standard 模式是默认的启动模式,不用为配置 android:launchMode 属性即可,当然也可以指定值为 standard。