一、判断题(共10小题,每题1分,共10分)
二、单选题(共10小题,每题1分,共10分)
三、填空题(共10小题,每空1分,共10分)
四、简答题 (共4小题,每题10分,共40分)
五、程序设计题 (共2小题,每空2分,共30分)
知识点:
1. Android体系结构包含的层次及各层的特点。
a)??? 应用程序层:一个核心应用程序的集合,安装在手机中的应用程序都属于这一层。
b)??? 应用程序架构层:主要提供了构建应用程序时用到的各种API。例如活动管理器(Activity Manager)。
c)??? 核心类库:主要包含了系统库和Android运行环境。
d)??? Linux内核:他为Android设备的各种硬件提供了底层的驱动,如:显示驱动。
2. Dalvik虚拟机的特点与作用。
主要负责完成对象生命周期管理、堆栈管理、线程管理、安全和异常管理,以及垃圾回收等。
Dalvik虚拟机具有以下特点:
3. AndroidManifest.xml清单文件的作用。
AndroidManifest.xml是Android应用程序的配置文件,它描述了应用程序的基本信息和组件,以及应用程序的权限和功能。
4. Android项目资源文件夹的目录结构。
5. Android中常用的尺寸单位dp和sp的区别。
6. Android程序调试的两种方法:单元测试,logcat日志输出。
1. Android中的几种常用布局及其各自的特点。
2. 界面布局的几个通用属性的名称与功能:
android:id、android:layout_width、android:layout_height、android:background、android:layout_margin、android:padding。
3. 线性布局LinearLayout的两个常用属性的名称与功能:
android:orientation:决定了子元素是垂直排列还是水平排列(vertical、horizontal)
android:layout_weight:通过设置该属性值,可使布局内的控件按照权重比显示大小
4. TableLayout与LinearLayout的父子关系。
TableLayout继承自LinearLayout,因此它完全支持LinearLayout所支持的属性。
1. TextView控件的常用属性名称与功能
android:text、android:textColor、android:textSize、android:gravity。
2. EditText控件的常用属性名称与功能
android:hint:当EditText为空时,显示的提示文本。当用户开始输入时,提示文本会消失。
3. EditText、Button与TextView的父子关系。TextView是Button和EditText的父类
4. 实现Button按钮的点击事件有哪几种不同方式?
5. ImageView控件的两个常用属性android:background与android:src功能及区别。
android:background主要用于设置背景(可以是颜色、渐变色、位图等),而android:src主要用于设置显示的图片。
6. RadioButton和RadioGroup的关系及使用方法。
7. ListView控件的基本特点以及数据适配器的作用。
数据适配器的主要作用包括:
8. ListView与RecyclerView的区别。
1、展示效果:RecyclerView控件可以通过LayoutManager类实现横向或竖向的列表效果、瀑布流效果和GridView效果,而ListView控件只能实现竖直的列表效果。
2、适配器:RecyclerView控件使用的是RecyclerView.Adapter适配器,该适配器将BaseAdapter中的getView()方法拆分为onCreateViewHolder()方法和onBindViewHolder()方法,强制使用ViewHolder类,使代码编写规范化,避免了初学者写的代码性能不佳。
3、复用效果:RecyclerView控件复用Item对象的工作由该控件自己实现,而ListView控件复用Item对象的工作需要开发者通过convertView的setTag()方法和getTag()方法进行操作。
4、动画效果:RecyclerView控件可以通过setItemAnimator()方法为Item添加动画效果,而ListView并没有实现动画效果,但我们可以在Adapter自己实现item的动画效果。
1. Activity有哪些生命周期方法及什么时候被调用?
1、onCreate():Activity创建时调用,通常做一些初始化设置。
2、onStart():Activity即将可见时调用。
3、onResume():Activity获取焦点时调用。
4、onPause():当前Activity被其他Activity覆盖或屏幕锁屏时调用。
5、onStop():Activity对用户不可见时调用。
6、onDestroy():Activity销毁时调用。
7、onRestart():Activity从停止状态到再次启动时调用。
2. Activity组件的基本方法:setContentView、findViewById。
3. Activity组件显式调用和隐式调用的定义与区别。
4. Activity组件之间互相调用的基本方法:startActivity、startActivityForResult、setResult、onActivityResult。
5. 通过意图对象intent在不同的Activity之间传递数据的方法。
首先需要创建一个Intent对象,并使用putExtra()方法将需要传递的数据附加到Intent对象中。然后,通过调用startActivity()方法并将Intent对象作为参数传入,即可实现数据的传递。
假设有两个Activity:A和B。现在需要在A中获取一些数据,然后将这些数据传递给B。可以在A中创建一个Intent对象,将数据放入Intent对象中,然后启动B。在B中,可以从Intent对象中取出A传递过来的数据。如果需要返回数据给上一个活动,可以使用startActivityForResult()方法代替startActivity()方法。这样,当从B返回到A时,就可以在onActivityResult()方法中获取到返回的数据。
6. Android任务栈的特点。Activity有几种不同的启动模式?
Android任务栈是一种栈结构,具有后进先出的特点,用于存放Activity。当打开一个新的Activity时,新的Activity会被存放到栈顶位置,只有栈顶的Activity才能与用户进行交互。当栈顶的Activity结束后,界面会回退到任务栈中的上一个Activity。当一个任务栈中的Activity全部结束,无Activity可以继续回退时,会销毁此任务栈,并回退到最近一次访问的任务栈的栈顶。
Activity的四种启动模式分别为standard、singleTop、singleTask和singleInstance。
有一个模拟浏览器访问主界面MainActivity,包含TextView、Button、EditText等UI组件。请按如下要求编写核心部分代码,组件名自定,应符合见名知意原则:不需要编写全部代码,无需编写其它文件:
1)在MainActivity布局网址文本框、浏览按钮、重置按钮,重置按钮清空已经填入的网址,焦点回到网址文本框里面。(15分)
2)浏览按钮通过intent启动BrowserActivity,在BrowserActivity里面布局一个浏览器显示网址文本框里面的网页内容;(10分)
注意:要求用事件监听器匿名内部类处理两个按钮事件。(5分)
public class MainActivity extends AppCompatActivity {?
??? private EditText urlEditText;?
??? private Button browseButton, resetButton;?
??? @Override?
??? protected void onCreate(Bundle savedInstanceState) {?
??????? super.onCreate(savedInstanceState);?
??????? setContentView(R.layout.activity_main);?
?
??????? urlEditText = findViewById(R.id.urlEditText);?
??????? browseButton = findViewById(R.id.browseButton);?
??????? resetButton = findViewById(R.id.resetButton);?
?
??????? browseButton.setOnClickListener(new View.OnClickListener() {?
??????????? @Override?
??????????? public void onClick(View v) {?
??????????????? Intent intent = new Intent(MainActivity.this, BrowserActivity.class);?
??????????????? intent.putExtra("url", urlEditText.getText().toString());?
??????????????? // startActivity(intent);
??????????????? startActivityForResult(intent, 1);
??????????? }?
??????? });?
?
??????? resetButton.setOnClickListener(new View.OnClickListener() {?
??????????? @Override?
??????????? public void onClick(View v) {?
??????????????? urlEditText.setText("");?
??????????????? urlEditText.requestFocus();?
??????????? }?
??????? });?
??? }?
}
public class BrowserActivity extends AppCompatActivity {
??? private WebView webView;
??? @Override
??? protected void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.activity_browser);
??????? webView = findViewById(R.id.webView);
??????? String url = getIntent().getStringExtra("url");
??????? webView.loadUrl(url);
??? }
}
1. Android系统在进行文件存储时,内部存储与外部存储的存储位置区别。
内部存储是手机ROM上的一块存储区域,主要用于存储系统以及应用程序的数据,即使手机关机或者退出应用,这些数据也不会丢失。而外部存储则是指SD卡或扩展的外部存储空间,当设备的内置存储空间不足时,可以插入SD卡来扩充存储空间。
2. Android中进行动态申请权限的两个方法:requestPermissions、onRequestPermissionsResult。
3. 几种常见的需要动态申请的危险权限:SD卡读写、读取手机通讯录。
4. SQLite数据库的创建与打开:使用SQLiteOpenHelper类的构造方法。
5. SQLiteOpenHelper类的基本方法:onCreate、onUpgrade、getReadableDatabase、getWritableDatabase。
6. SQLite数据库的CRUD方法:使用SQLiteDatabase工具类。
PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper (getApplication());
//获取一个可读写的SQLiteDataBase对象
SQLiteDatabase db = helper.getWritableDatabase();
// 开始数据库的事务
db.beginTransaction();
try {
??? //执行转出操作
??? db.execSQL("update person set account = account-1000 where name =?",
?????? ?????????????????????????????????????????????????????new Object[] { "张三" });
??? //执行转入操作
??? db.execSQL("update information set account = account +1000 where name =?",
???????????????????????????????????????????????????????????? new Object[] { "王五" });
??? //标记数据库事务执行成功
??? db.setTransactionSuccessful();
}catch (Exception e) {
??? Log.i("事务处理失败", e.toString());
} finally {
??? db.endTransaction();??? //关闭事务
??? db.close();????????????? //关闭数据库
}
1. 内容提供者的基本工作原理。
假设B程序需要操作A程序数据库中的数据,一般需要A程序使用ContentProvider暴露数据,才能被其他程序操作。B程序通过ContentResolver操作A程序暴露出来的数据,而A程序会将操作结果返回给ContentResolver,然后ContentResolver再将操作结果返回给B程序。
内容观察者工作原理:使用ContentObserver观察A程序的数据时,首先要在A程序的ContentProvider中调用ContentResolver的notifyChange()方法。调用此方法后,当B程序操作A程序中的数据时,A程序会向“消息中心”发送数据变化的消息,此时C程序会观察到“消息中心”的数据有变化,会触发ContentObserver的onChange()方法。
2. URI的组成结构。
Uri主要有三部分组成,分别是scheme、authority和path。
3. 如何获取内容解析器:getContentResolver方法。
4. 如何查询内容提供者的数据:ContentResolver对象所提供的query方法。
1. BroadcastReceiver组件的静态注册和动态注册方法。
静态注册的方式是在AndroidManifest.xml文件中进行定义,这种方式注册的广播接收器需要继承自BroadcastReceiver。例如,如果要监听电量变化,就需要在AndroidManifest.xml中进行静态注册。
动态注册则是在程序中使用Context.registerReceiver()方法进行注册。这种方式允许我们在程序运行时动态地注册广播接收器,这在需要根据程序运行状态来开关广播的情况下非常有用。例如,当我们需要监听应用的安装、卸载等事件时,就可以使用动态注册的方式来实现。
另外,当我们发送广播事件时,可以通过Context.sendBroadcast()方法来发送,这个消息会被包含在Intent对象中,并通过Action来指定具体的操作。例如,如果我们希望发送一个标准广播,只需要实例化一个Intent对象,然后调用context的sendBroadcast()方法即可
2. BroadcastReceiver组件的基本方法:onReceive、registerReceiver、sendBroadcast。
3. 有序广播与无序广播的区别。
(1) 发送广播时,使用的方法不同。有序广播使用sendOrderedBroadcast()发送广播,而无序广播使用sendBroadcast()方法发送广播。
(2) 广播接收者执行的顺序
有序广播按照广播接收者声明的优先级别被依次接收。当在高级别的广播接收者逻辑执行完毕之后,广播才会继续传递。当优先级相同时,先注册的广播接受者优先执行。
当发送无序广播时,所有监听这个广播的广播接收者都会接收到此广播消息,但接收和执行的顺序不确定。
(3)拦截广播
有序广播的接收者可拦截广播。如果优先级较高的广播接收者将广播终止,那么广播将不再向后传递。而无序广播则不能被拦截。
(4)效率
有序广播的效率比无序广播低。
1. Service的两种启动方式的过程及区别。
Service的启动方式分别可以调用startService()、bindService()方法,这两个启动方式的区别如下所示:
2. Service的生命周期方法。
3.本地服务通信的基本原理。
Android本地服务通信的基本步骤:
public class MusicService extends Service {
??? private MediaPlayer player;
??? public MusicService() {}
??? @Override
??? public IBinder onBind(Intent intent) {
?????? return? new MusicControl(); //当服务绑定时,返回服务的代理对象
??? }
??? @Override
??? public void onCreate() {
??????? super.onCreate();
??????? player = new MediaPlayer();//创建音乐播放器对象
??? }
??
??? class MusicControl extends Binder {
??????? ????}
??? @Override
?? ?public void onDestroy() {
??????? super.onDestroy();
??? }
}
在AndroidManifest.xml中注册服务
<service android:name=".MusicService" />
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
??? private static TextView tv_progress, tv_total;
??? private MusicService.MusicControl musicControl;
??? MyServiceConn conn;
??? Intent intent;
??? private boolean isUnbind = false;//记录服务是否被解绑
??? @Override
??? protected void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? setContentView(R.layout.activity_main);
??????? init();
??? }
??? private void init() {
??????? findViewById(R.id.btn_play).setOnClickListener(this);
??????? findViewById(R.id.btn_pause).setOnClickListener(this);
??????? findViewById(R.id.btn_continue_play).setOnClickListener(this);
??????? findViewById(R.id.btn_exit).setOnClickListener(this);
??????? intent = new Intent(MainActivity.this, MusicService.class); //创建意图对象
??????? conn = new MyServiceConn(); //创建服务连接对象
??????? bindService(intent, conn, BIND_AUTO_CREATE); //绑定服务
??????? ImageView iv_music = findViewById(R.id.iv_music);
??? }
??? class MyServiceConn implements ServiceConnection { //用于实现连接服务
??????? @Override
??????? public void onServiceConnected(ComponentName name, IBinder service) {
??????????? //获取服务代理对象
??????????? musicControl = (MusicService.MusicControl) service;
??????? }
??????? @Override
??????? public void onServiceDisconnected(ComponentName name) {
??????? }
??? }
??? private void unbind(boolean isUnbind) {
?? ?????if (!isUnbind) { //判断服务是否被解绑
??????????? musicControl.pausePlay(); //暂停播放音乐
??????????? unbindService(conn); //解绑服务
??????? ????stopService(intent); //停止服务
??????? }
??? }
??? @Override
??? public void onClick(View v) {
??????? switch (v.getId()) {
??????????? case R.id.btn_play: //播放按钮点击事件
??????????????? musicControl.play(); //播放音乐
??????????????? animator.start(); //播放动画
??????????????? break;
??????????? case R.id.btn_pause: //暂停按钮点击事件
??????????????? musicControl.pausePlay(); //暂停播放音乐
?????????? ?????animator.pause(); //暂停播放动画
??????????????? break;
??????????? case R.id.btn_continue_play: //继续播放按钮点击事件
??????????????? musicControl.continuePlay(); //继续播放音乐
??????????????? animator.start(); //播放动画
??????????????? break;
??????????? case R.id.btn_exit: //退出按钮点击事件
??????????????? unbind(isUnbind); //解绑服务绑定
??????????????? isUnbind = true; //完成解绑服务
??????????????? finish(); //关闭音乐播放界面
??????????????? break;
??????? }
??? }
??? @Override
??? protected void onDestroy() {
??????? super.onDestroy();
?????? ?unbind(isUnbind); //解绑服务
??? }
}
4. Android系统的四大核心组件名称、作用以及在清单文件中的注册方式。
Activity:负责用户交互的最主要组件,一个Activity表示一个可视化用户界面,除非不需要任何用户界面,否则Android应用程序至少包含一个Activity。
Service:用于提供服务,执行一些持续性的,耗时的且无需用户界面交互的操作。
BroadcastReceive:一种全局监听器,用于接收来自系统和应用程序的广播。
ContentProvider:一种共享的持久数据存储机制,是在应用程序之间共享数据时的首选方案。
注册主 Activity 时, 还需要内嵌<intent-filter>、<action>和<category>标签,以此说明 该 Activity 为 Android 应用程序的入口
<activity
android:name="prg_packname.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN"A>
<category android:name="android.intent.category.LAUNCHER">
</intent-filter>
</activity>
1. HttpURLConnection类的作用及两种不同的发送HTTP请求的方式。
HttpURLConnection是Java的标准类,它继承自URLConnection并被用于发送HTTP请求以及处理服务器的响应。这个类提供了一些特定的方法,如获取服务器响应代码、获取服务器响应消息和设置请求方法等。
HttpURLConnection主要支持以下两种发送HTTP请求的方式:GET和POST。GET请求主要用于获取资源,而POST请求则通常用于提交数据到服务器。
2. JSON数据的两种表示结构:对象结构和数组结构。
3. Android SDK提供的两种不同的解析JSON数据的类:JSONObject、JSONArray。
1. 利用Bitmap类与BitmapFactory类创建位图的区别。
Bitmap是一张位图,代表一个图像,可以被用来存储和操作图像的像素数据。开发者可以通过Bitmap类提供的方法来获取、设置和修改图像的像素值,实现对图像的各种操作。BitmapFactory则是一个用于创建Bitmap对象的工厂类,可以从不同来源(如文件、网络等)解码图像数据并生成对应的Bitmap对象。
2. 三种不同的动画类型名称与基本特点:补间动画、逐帧动画、属性动画。
1. 使用MediaPlayer类播放音频的基本方法:setDataSource、prepare、start、pause、stop。
2. 使用MediaPlayer类播放视频与播放音频在使用上的区别。