目录
选择题
选择题知识点汇总
Activity
Intent
Broadcast
BroadcastReceiver
如何自定义Receiver
如何注册接收器
Service
SharedPreferences
三种访问模式
如何创建
如何存储/修改
如何读取
内部存储
openFileOutput
openFileInput
SD卡
资源文件
SQLite
SQLiteOpenHelper(创建数据库)
SQLiteDatabase(进行具体操作)
ContentProvider
URI
如何自定义
ContentResolver
如何创建
如何增删改查
HttpURLConnection
get和post请求的区别
基本操作
MediaPlayer
简答题
简述Android体系结构
*简述Android的四大组件及其功能
简述Android系统特点
*简述Activity的生命周期
简述Activity栈的工作流程
简述Activity生命周期的事件回调函数
简述Android架构的MVC模式
简述如何设置View的宽度
*简述6种常见的页面布局(分别有什么特点)
简述Intent和Bundle的作用
*简述Intent启动Activity的两种启动方式
简述Intent双向传递数据的原理
简述消息广播标识串的用途
*简述Service的类型(两种启动方式的不同)
简述Service的生命周期
简述SharedPreferences及其三种访问模式
简述访问其他应用程序的SharedPreferences必须满足的三个条件
简述Android文件存储的方式
列举一些系统ContentProvider
进程的基本概念
简述Handler消息处理机制
简述TCP/IP网络层次结构
简述什么是socket
简述端口号的作用
简述HttpURLConnection的基本工作流程
简述什么是Fragment及其优点
简述传感器的分类
编程题
补充:toast的使用
基本控件的属性(View)
如何新建菜单
***双向传递数据的核心代码框架
双向传递数据示例(求和)
***双向传递数据+自定义广播示例
系统广播示例(监听拨打电话)
选择题
刷题
【Android】期末选择题和判断题_android判断题_Lotay_天天的博客-CSDN博客
Android期末复习篇_传智课后习题以及答案(选择、填空、判断、简答、编码题)_2、请编写一个数据传递的小程序,要求在第一个界面输入用户名和工作岗位,第二个界_scl、的博客-CSDN博客
Android基础最全题库_android题库_没有谁可以给你想要的生活的博客-CSDN博客
https://www.cnblogs.com/shuzijunofficial/p/14775323.html
Android笔试题大全(持续更新中),android实战项目健身_android笔试题及答案_m0_66264324的博客-CSDN博客
附一份安卓选择题汇总:
链接:https://pan.baidu.com/s/1BinNvd7N_dmKI913sIx4AA?pwd=WHY6
选择题知识点汇总
Activity
- 创建菜单的代码:
getMenuInflater().inflate(R.menu.main_menu,menu);
- onCreate()方法在Activity生命周期中只调用一次
- 七个回调函数:
-
- onCreate() Activity启动后第一个被调用的函数,常用来进行Activity的初始化,例如创建View、绑定 数据或恢复信息等。
- onStart() 当Activity显示在屏幕上时(此刻用户尚不能交互),该函数被调用。
- onResume() 当用户可以与Activity交互时(此时Activity成为前台程序),被调用。
- onPause() 当Activity进入暂停状态时(部分遮挡),该函数被调用。主要用来释放CPU资源、保存持久 数据、关闭动画等。
- onStop() 当Activity对用户不可见后,该函数被调用,Activity进入停止状态。
- onRestart() 当Activity从停止stop状态进入start状态前,调用该函数。
- onDestroy() 在Activity被终止前,即进入非活动状态前,该函数被调用。 有两种情况该函数会被调用:(1)当程序主动调用finish()函数;(2)程序被Android系统终结。
- Log方法示例:
Log.d(myTAG, "创建");
(输出调试信息)
Intent
- 如何创建并启动Intent(显示):
- 创建:
Intent intent = new Intent(A_Activity.this, B_Activity.class);
- 启动:
startActivity(intent);
- 如何创建并启动Intent(隐示):
- 创建:
Intent intent = new Intent( Intent.ACTION_VIEW,Uri.parse("http://www.163.com") )
(参数:Intent动作,Intent数据) - 也可通过
setAction
添加动作,通过setData
添加数据:
- 启动:
startActivity(intent);
- bubble如何存放/获取序列化对象:
- 双向传递数据时:
- 如何启动Activity:
startActivityForResult ( Intent intent , int requestCode )
- requestCode的作用:一般是自设的正整数,主要目的用于区别是谁回传的数据
- 如何回传数据:
setResult ( int resultCode, Intent intent )
- 系统提供了RESULT_OK (-1)、RESULT_CANCELED (0)等常量值作 为resultCode ,没有特殊情况可以直接用RESULT_OK
- 如何对回传的数据进行处理:
onActivityResult
Broadcast
广播发送端,主要进行intent的定义和广播发送
主要步骤:
①创建intent:ntent intent=new Intent("wust.zz.mybroadcast");
(自定义广播标识串)
②通过bubble添加数据
③发送广播:sendBroadcast(intent)
BroadcastReceiver
广播接收端,通过receiver和广播过滤接受广播
主要步骤:
①自定义Receiver
②注册接收器
③判断是否接受到了相应的广播,进行处理:
判断逻辑:if(intent.getAction().equals("wust.zz.mybroadcast"))
(自定义广播标识)
如何自定义Receiver
- 自定义MyReceiver,首先继承BroadcastReceiver方法
public class MyReceiver extends BroadcastReceiver
- 重写onReceive方法:
public void onReceive(Context context, Intent intent)
;当Receiver接收到相应的广播时,会触发onReceive事件
如何注册接收器
静态注册
在AndroidManifest.xml
文件中添加注册信息,用Intent过滤器来设置接收哪种广播
工作流程:当系统广播消息后,所有已经注册的BroadcastReceiver会检查注册时的IntentFilter是否有与发送的广播消息(Intent)相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法
示例中的广播是系统广播
也可以自定义广播:<action android:name="wust.zz.mybroadcast" />
;这里就是自定义了广播的标识串
这个标识有三个地方能用到:
①发送广播时:用于创建Intent对象,Intent intent = new Intent("广播标识串");
②manifest中注册时用:作为BroadcastReceiver的intent-filter的action name值
③处理消息时:在onReceive()方法中作为消息类型的判断用
动态注册
IntentFilter filter = new IntentFilter();
filter.addAction("wust.zz.mybroadcast");
动态注册涉及到一个问题,如何将注册的广播添加到BroadcastReceiver中?
BroadcastReceiver receiver = new MyReceiver();
registerReceiver( receiver , filter);
如果需要注销某个广播:
unregisterReceiver(receiver);
Service
自定义Service:public class MyService extends Service
- onCreate:由startService()触发
- onStartCommand:服务的主要代码写在onStartCommand()中,不推荐使用onStart()
- onDestroy:由stopService()或stopSelf()触发
- 绑定服务:
public IBinder onBind(Intent intent)
如何启动/关闭service:
startService(intent)
stopService(intent)
SharedPreferences
SharedPreferences用于数据的存储和读取
三种访问模式
私有(MODE_PRIVATE):仅有创建程序有权限对其进行读取或写入
全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其他应用程序也读取操作的权限,但没有写入操作的权限
全局写(MODE_WORLD_WRITEABLE):创建程序和其他程序都可以对其进行写入操作,但没有读取的权限
可以设置混合访问模式:
public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;
全局读+全局写
如何创建
通过getSharedPreferences方法创建
SharedPreferences sharedPreferences = getSharedPreferences(PREFERENCE_NAME, MODE);
如何存储/修改
通过SharedPreferences.Editor
类对SharedPreferences进行修改;通过commit()
函数保存修改的内容:
数据存储目录:SharedPreferences文件保存在/data/data/<package name>/shared_prefs
目录下
如何读取
内部存储
文件保存的路径:/data/data/<package name>/files
目录下
openFileOutput:写文件
openFileInput:读文件
openFileOutput
openFileOutput()函数为写入数据做准备而打开的应用程序文件,如果指定的文件不存在,则创建一个新的文件
四种文件操作模式:
模式 | 说明 |
MODE_PRIVATE | 私有模式,缺陷模式,文件仅能够被文件创建程序访问,或具有相同UID的程序访问。 |
MODE_APPEND | 追加模式,如果文件已经存在,则在文件的结尾处添加新数据。 |
MODE_WORLD_READABLE | 全局读模式,允许任何程序读取私有文件。 |
MODE_WORLD_WRITEABLE | 全局写模式,允许任何程序写入私有文件。 |
示例:
第1行代码定义了建立文件的名称fileDemo.txt
第2行代码使用openFileOutput()函数以私有模式建立文件
第4行代码调用write()函数将数据写入文件
第5行代码调用flush()函数将所有剩余的数据写入文件
第6行代码调用close()函数关闭FileOutputStream
为了提高文件系统的性能,一般调用write()函数时,如果写入的数据量较小,系统会把数据保存在数据缓冲区中,等数据量累积到一定程度时再一次性的写入文件中;由上可知,在调用close()函数关闭文件前,务必要调用flush()函数,将缓冲区内所有的数据写入文件
openFileInput
openFileInput()函数为读取数据做准备而打开应用程序私文件
SD卡
文件存储在/sdcard目录下
资源文件
- 原始格式文件可以是任何格式的文件,例如视频格式文件、音频格式文件、图像文件和数据文件等等,存放在
/res/raw
目录下;
- 读取原始格式文件,首先需要调用
getResource()
函数获得资源对象,然后通过调用资源对象的openRawResource()
函数,以二进制流的形式打开指定的原始格式文件。在读取文件结束后,调用close()函数关闭文件流 - XML文件,一般用来保存格式化的数据,存放在
/res/xml
目录下 - 读取XML格式文件,首先通过调用资源对象的
getXml()
函数,获取到XML解析器XmlPullParser
SQLite
SQLiteOpenHelper(创建数据库)
常用方法:
- 创建 or 打开 可读/写的数据库(通过 返回的SQLiteDatabase对象 进行操作)
getWritableDatabase()
- 创建 or 打开 可读的数据库(通过 返回的SQLiteDatabase对象 进行操作)
getReadableDatabase()
- 数据库第1次创建时 则会调用,即 第1次调用 getWritableDatabase() / getReadableDatabase()时调用(在继承 SQLiteOpenHelper类的子类中复写)
onCreate(SQLiteDatabase db)
- 数据库升级时自动调用(在继承SQLiteOpenHelper类的子类中复写)
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
- 关闭数据库
close()
SQLiteDatabase(进行具体操作)
SQLiteDatabase db
db.execSQL()
:执行具体的sql语句db.close()
:关闭数据库
静态方法:
SQLiteDatabase.openOrCreateDatabase()
:打开或创建数据库SQLiteDatabase.deleteDatabase()
:删除数据库
ContentProvider
ContentProvider和ContentResolver之间是一对多的关系,一个ContentProvider可以提供多个数据集,可为多个ContentResolver服务
URI
统一资源标识符,用于标识资源的位置;
URI的格式:
需要记住,URI的固定前缀,是content://
如何自定义
ContentResolver
如何创建
ContentResolver resolver = getContentResolver();
如何增删改查
resolver.query()、insert()、update()、delete()
HttpURLConnection
get和post请求的区别
get的数据是在HTTP的头部传送的,而post的数据则是在HTTP请求的内容里传送。
简单的说:post传输数据时,不需要在URL中显示出来,而get方 法要在URL中显示
基本操作
- 创建url对象:
URL url = new URL(httpUrl);
(httpUrl是自定义的网址) - 创建HttpURLConnection对象:
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
- 设置请求方式(默认get):
httpURLConnection.setRequestMethod("GET");
- 建立连接:
httpURLConnection.connect();
- 获取请求状态码:
httpURLConnection.getResponseCode();
MediaPlayer
prepare()
:完成视频播放前的准备工作
setDataSource()
:设置多媒体数据来源
如何创建:
①MediaPlayer mediaPlayer = new MediaPlayer();
②MediaPlayer mediaPlayer = MediaPlayer.create();
简答题
简述Android体系结构
- 应用程序层:包括各类与用户直接交互的应用程序,或由java语言编写的运行于后台的服务程序;例如:SMS短信,电话拨号,图片浏览器,日历,游戏, 地图,web浏览器等程序,以及开发人员开发的其他应用 程序
- 应用程序框架层:
- 系统运行库层:
- 程序库:C库、媒体库、Surface Manager、WebKit、SGL、3Dlibraries、FreeType、SSL、SQLite等
- Android 运行库:每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例
关于JVM和Dalvik VM:
JVM:执行class文件(字节码 )
Dalvik VM:执行dex文件(Dalvik Executes缩写)
Dalvik最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备
- Linux 内核层:Android的核心系统服务依赖于Linux内核,如安全性,内存管理,进程管理,网络协议栈和驱动模型
*简述Android的四大组件及其功能
①Activity:用于界面展示与用户交互
②Service:Service是Android系统四大组件之一,它是一种长生命周期的,没有可视化界面,运行于后台的一种服务程序,用于执行后台任务
③BroadcastReceiver:对发送出来的Broadcast进行过滤并响应,用于传递/通知某种事件
④ContentProvider:提供了应用程序之间共享数据的方法,一个应用程序可以通过ContentProvider将自己的数据暴露出去;应用程序通过ContentProvider访问数据而不需要关心数据具体的存储及访问过程,这样既提高了数据的访问效率,同时也保护了数据
简述Android系统特点
在内存和进程管理方面,Android有自己的运行时和虚拟机;
Android将界面设计与程序逻辑分离,界面布局使用XML文件,有利于界面的修改和维护;
Android提供轻量级的进程间通讯机制Intent,使跨进程组件通信和发送系统广播成为可能
Android提供Service作为无用户界面、长时间后台运行组件;
支持快速、高效的数据存储
为了跨进程共享数据,Android提供ContentProvider接口
可以无需了解数据源、路径的情况下,对共享数据进行查询、添加、删除和更新等操作
*简述Activity的生命周期
答案1:Activity生命周期指Activity从启动到销毁的过程
Activity表现为四种状态:
- 活动状态Active:Activity在用户界面中处于最上层,完全能被用户看到,能够与用户进行交互。
- 暂停状态Pause:Activity在界面上被部分遮挡,不再处于用户界面的最上层,且不能够与用户进行交互。(如弹出选择框时)
- 停止状态Stop:Activity被其他Activity全部遮挡,界面完全不能被用户看到。(如玩游戏时来电了)
- 非活动状态Dead:Activity没有启动或者被finish()。
答案2:
onCreate():创建活动,做一些数据初始化的操作
onStart():由不可见变为可见
onResume():可以与用户进行交互,位于栈顶
onPause():暂停,启动或恢复另一个活动时调用
onStop():停止,变为不可见
onRestart():由停止状态变为运行状态
onDestroy():销毁
简述Activity栈的工作流程
- Activity栈后进先出
- 新的Activity启动之后入栈,处于活动状态,如果按了返回键或者Activity被finish,则该Activity出栈,位于非活动状态;
- 位于栈底的暂停状态或者停止状态的Activity被系统强制终止后也会出栈,变为非活动状态
简述Activity生命周期的事件回调函数
简述Android架构的MVC模式
MVC目的:M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式,C可确保M和V的同步,一旦M改变,V能同步更新
简述如何设置View的宽度
①通过wrap_content设置:自适应内容,表示和自身内容一样的长度
②通过match_parent(fill_parent)设置,表示和父组件一样的长度
③设置具体的宽度:android:layout_width="xxdp"
④在代码中通过setLayoutParams
来设置
*简述6种常见的页面布局(分别有什么特点)
RelativeLayout
相对布局是一种非常灵活的布局方式;
通过指定界面元素与其他元素的相对位置关系,来确定界面中所有元素的布局位置;
优点:能够最大程度保证在各种屏幕尺寸的手机上正确显示界面布局
常用布局:
居中:
margin(设置组件与父容器的间距):
padding(设置组件内部元素间的间距):
*LinearLayout
线性布局是常用的一种布局方式,支持横向和纵向排列子视图
通过设置android:orientation
来确定是垂直还是水平布局
android:orientation="vertical"
垂直布局(垂直布局时:每行仅包含一个界面元素)
android:orientation="horizontal"
水平布局 (默认)(水平布局时:所有界面元素都在一行)
FrameLayout
FrameLayout中所有界面对象都是从屏幕的左上角(0,0)开始布局,不能指定位置;
多个组件层叠排列,上一层的会覆盖下一层的控件;
第一个添加的组件放到最底层,最后添加的显示在最上面
TableLayout
表格布局以行列的形式管理子元素,每一行是一个TableRow布局对象,当然也可以是普通的View对象;TableRow表现为一个水平LinearLayout,里面的元素会水平排列
GridLayout
Android4.0新支持的布局
网格布局将用户界面划分为网格,可以方便地实现等分、不等分的布局;界面元素可随意摆放在网格中,网格布局比表格布局更灵活;
在网格布局中界面元素可以占用多个网格
AbsoluteLayout
绝对布局能通过指定界面元素的坐标位置,来确定用户界面的整体布局。已经不推荐使用
绝对布局不能够根据不同屏幕对界面元素进行位置调整
简述Intent和Bundle的作用
Intent是一种组件之间消息传递机制,它是一个动作的完整描述:包含了动作产生组件、接收组件和传递的数据信息;Intent主要用途有启动Activity、Service,在Android系统上发布Broadcast消息
Bundle类是一个存储和管理key-value值对的类,多应用于Activity之间相互传递值
*简述Intent启动Activity的两种启动方式
显示启动
在Intent中指明要启动的Activity类
代码示例:
隐式启动
无需指明具体启动哪一个Activity,而由Android系统根据Intent的动作和数据来决定启动哪一个Activity
代码示例:
简述Intent双向传递数据的原理
简述消息广播标识串的用途
- 发送广播时:用于创建Intent对象,Intent intent = new Intent("广播标识串");
- manifest中注册时用:作为BroadcastReceiver的intent-filter的action name值
- 处理消息时:在onReceive()方法中作为消息类型的判断用
*简述Service的类型(两种启动方式的不同)
简述Service的生命周期
在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用 onStartCommand()方法。如果调用startService()方法前服务已经被创建,多次调startService() 方法并不会导致多次创建服务,但会导致多次调onStartCommand() 方法。
如果调用方法前服务已经被绑定,多次调用bindService()并不会导致多次创建服务及绑定(也就是 onCreate()和onBind()方法并不会被多次调用)。
简述SharedPreferences及其三种访问模式
SharedPreferences是一种轻量级的数据保存方式
通过SharedPreferences可以将NVP(Name/Value Pair,名称/值对)保存在Android的文件系统中,而且SharedPreferences完全屏蔽对文件系统的操作过程;SharedPreferences不仅能够保存数据,还能够实现不同应用程序间的数据共享
SharedPreferences支持三种访问模式
- 私有(MODE_PRIVATE):仅有创建程序有权限对其进行读取或写入。
- 全局读(MODE_WORLD_READABLE):不仅创建程序可以对其进行读取或写入,其他应用程序也读取操作的权限,但没有写入操作的权限。
- 全局写(MODE_WORLD_WRITEABLE):创建程序和其他程序都可以对其进行写入操作,但没有读取的权限。
简述访问其他应用程序的SharedPreferences必须满足的三个条件
- 共享者需要将SharedPreferences的访问模式设置为全局读或全局写
- 访问者需要知道共享者的包名称和SharedPreferences的名称,以通过Context获得SharedPreferences对象
- 访问者需要确切知道每个数据的名称和数据类型,用以正确读取数据
简述Android文件存储的方式
Android使用的是基于Linux的文件系统
- 内部存储:在内部存储器上进行文件写入和读取
- 外部存储:在SD卡上进行存储;SD卡使用的是FAT(File Allocation Table)的文件系统,不支持访问模式和权限控制,但可以通过Linux文件系统的文件访问权限的控制保证文件的私密性
- 资源文件:程序开发人员可以将程序开发阶段已经准备好的原始格式文件和XML文件分别存放在/res/raw和/res/xml目录下,供应用程序在运行时进行访问
原始格式文件可以是任何格式的文件,例如视频格式文件、音频格式文件、图像文件和数据文件等等,在应用程序编译和打包时,/res/raw目录下的所有文件都会保留原有格式不变
/res/xml目录下的XML文件,一般用来保存格式化的数据,在应用程序编译和打包时会将XML文件转换为高效的二进制格式,应用程序运行时会以特殊的方式进行访问
列举一些系统ContentProvider
进程的基本概念
简述Handler消息处理机制
- 不直接在子线程中进行 UI 操作,子线程通过 Handler 将Message 传送出去
- 主线程中的Handler接收这个Message,然后进行 UI 等相关操作
简述TCP/IP网络层次结构
简述什么是socket
网络上的两个应用程序之间的通信是分层进行的,socket是应用程序进行网络通信的接口
简述端口号的作用
如果要发起网络连接,不仅需要知道远程机器的地址或名字。而且,还需要一个端口号。客户端和服务器必须事先约定所使用的端口,如果系统两部分所使用的端口不一致,那就不能进行通信
简述HttpURLConnection的基本工作流程
get:
post:
简述什么是Fragment及其优点
Fragment(碎片)是一种可以嵌入在Activity中的 UI 片段,它能让程序更加合理和充分地利用屏幕空间
优点:
Fragment可以轻松地创建动态灵活的UI设计,可以适应不同的屏幕尺寸,从手机到平板电脑
Fragment可将Activity分离成多个可重用的组件,每个都有它自己的生命周期和UI
Fragment是一个独立的模块,紧紧地与Activity绑定在一起。可以在运行中动态地移除、加入、替换等。
Fragment 替代TabActivity做导航,性能更好
Fragment 在4.2版本中新增嵌套fragment方法,能够生成更好的界面 效果
Fragment做局部内容更新更方便,原来为了到达这一点要把多个布局 放到一个Activity里面,现在可以用多个Fragment来代替,只有在需要的时候才加载Fragment,提高性能
简述传感器的分类
编程题
补充:toast的使用
Toast 在应用程序上浮动显示少量信息给用户,它永远不会获得焦点,不影响用户的输入等操作
基本用法:
Toast toast=Toast.makeText( 参数1,参数2,参数3 );
toast.show();
参数1:当前的上下文环境;getApplicationContext()或者是某个Activity.this
参数2:要显示的字符串
参数3:显示时间的长短:Toast.LENGTH_SHORT或 Toast.LENGTH_LONG
基本控件的属性(View)
(有可能就是给出一个页面,填写如何设置控件的属性来实现这个页面)
如何新建菜单
菜单资源示例:
这里的名称和创建时的名称对应,上面是main.xml,这里就得是R.menu.main
同样,这里的R.id.menu_item1应该为R.id.menu1(我是从不同的代码拼接的,注意区分)
***双向传递数据的核心代码框架
A端收到回传的数据:
双向传递数据示例(求和)
***双向传递数据+自定义广播示例
系统广播示例(监听拨打电话)
(如何添加广播的代码要会)
(这一部分代码也要会,记住如何startActivity)