面试题整理(一)

面试题整理回答(一)

1、简述android体系结构。

(1)应用层: 包括系统应用和非系统应用
(2)应用程序框架层
(3)原生库和Android运行时环境
(4)硬件抽象层
(5)linux内核层

2.Android有哪四大组件?并简单介绍各个组件的作用。

(1)Activity: 可以与用户进行交互可视化界面;
(2)Service:可以长时间运行在后台的组件;(监听、音乐播放、下载、上传等)
(3)ContentProvider: 用来在运行程序之间共享数据的组件,统一了数据操作的方式。
(4)BroadcastReceiver: 用来接收广播事件的组件;

3、简述BroadcastReceiver的两种注册方式,有何不同?

(1)静态注册:在配置文件AndroidManifest.xml中通过标签注册;
(2)动态注册:通过context.registerReceiver()方法进行注册;

不同点
(1)静态注册: 只要安装了应用,就保持着对订阅广播的监听状态,除非卸载。
(2)动态注册:可以由动态地控件是否监听订阅的广播,如果不需要监听,可以通过context.unregisterReceiver()进行注销。
(3)动态注册的优先级较高;

4、Android中的数据存储方式有哪些?用自己的语言对各种存储方式作简单介绍。

(1)文件存储:以文件的方式保存数据,文件存储的位置包含sdcard或手机内存(data/data/包名)中
(2)SharedPrefereces: 经量级的数据存储方式,以键值对的方式保存用户的偏好数据到xml文件中;
(3)Sqlite:Android中使用的关系型数据库;
(4)ContentProvider: Android中用于共享数据的组件;

5、ANR是什么?产生的原因是什么?如何解决?(请分点作答)

(1)Application Not Responding 应用程序无响应
(2)产生原因: 耗时操作长时间阻塞了主线程;
(3)把耗时操作放到子线程中处理,处理完后使用Handler与主线程进行交互。或者才使用AsyncTask,在doInBackground()方法中进行耗时操作;

6、Fragment的生命周期?如何切换Fragment界面显示?如何实现按下返回键时返回到前一个Fragment?

(1)添加时:
onAttach() –> onCreate() –> onCreateView() –> onActivityCreateed() –> onStart() –> onResume()
移除/替换/销毁:
onPause() –> onResume() –> onDestroyView()–>onDestoy() –> onDettach()
添加到返回栈并移除或替换:
onPause() –> onResume() –> onDestroyView()
添加到返回栈后按返回重新显示:
onCreateView() –> onActivityCreated() –> onStart() –> onResume()

(2)
mFragmentManager.replace();
FragmentManager fm=getSupportFragmentManager();
FragmentTransaction ft=fm.beginTransaction();
ft.replace(R.id.content, twoFragment);
ft.commit();

(3)mFragmentManager.addToBackStack(null);//把该事务的操作添加到返回栈中

7、简述Activity的生命周期?Activity切换到后台后有可能会被系统回收,如何防止Activity数据的丢失?

(1)启动:onCreate() –> onStart() –> onResume()
暂停:onPause()
暂停后恢复: onResume()
停止: onPause() –> onStop()
停止后恢复: onRestart() –> onStart() –> onResume()
销毁: onPause() –> onStop() –> onDestroy()

//保存数据  在Activity重写下面两个方法就好了
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("login", login);

}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);

login = savedInstanceState.getBoolean("login");
}

8、 请介绍AsyncTask,如何使用?

(1)异步任务类,内部封装了线程池和Handler,可以避免在项目中大量创建匿名线程。

(2)new AsyncTask<参数类型,进度类型,结果类型>(){}.exceute();
onPreExceute() 预处理操作
doInBackGround() 执行耗时操作(子线程)
onPostExecute() 刷新界面
publishProgress()发布进度
onProgressUpdate() 刷新进度

9、sqlite数据库的操作使用到哪些核心的类?如何批量插入数据时,如何提高效率?如何实现分页?数据库升级时如何处理?

(1)SqliteOpenHelper: 数据库的创建和管理
SqliteDatabase: 用来实现数据的增删改查操作
(2)手动开启事务,批量插入数据,再手动提交事务。
(3)select * from t_student limit 10, 0; // 第1页,每页取10条
select * from t_student limit 10, 10; // 第2页,每页取10条
select * from t_student limit 10, 20; // 第3页,每页取10条
select * from t_student limit 10 offset 0; // 第1页,每页取10条
select * from t_student limit 10 offset 10; // 第2页,每页取10条
(4)重写SqliteOpenHelper的onUpgrade()方法,在该方法中进行数据库的升级,比如修改或添加表字段,或者创建新的表。

10、请使用HttpURLConnection封装http get和post请求方法。除了使用HttpURLConnection外,还可以通过哪些sdk实现?

(1)HttpClient, AsyncHttpClient, XUtil, Volley
(2) 见如下代码

public static String get(String requestUrl) throws Exception {
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(6 * 1000);
if (conn.getResponseCode() == 200) {
InputStream inStream = conn.getInputStream();
byte[] data = readStream(inStream);
return new String(data, "utf-8");
}
return null;
}

public static String post(String path, String param) throws Exception {
URL url = new URL(path);
// 开启连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");// POST请求
conn.setConnectTimeout(6000); // 连接超时时间
conn.setDoOutput(true); // 表示 需要传递数据到服务器

String contentType = "application/x-www-form-urlencoded;charset=utf-8";
// String contentType = "text/xml;charset=utf-8";
// String contentType = "application/json;charset=utf-8";
conn.setRequestProperty("Content-Type", contentType);

// 写入参数到服务器
OutputStream outputStream = conn.getOutputStream();
outputStream.write(param.getBytes());// 写入参数到服务器
int respCode = conn.getResponseCode(); // 获取返回码
if (respCode == 200) { // 等于200表示请求成功
InputStream is = conn.getInputStream();
String result = readStream(is);
return result;
}
return "";
}
public static byte[] readStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
outStream.close();
inStream.close();
return outStream.toByteArray();
}
原文地址:https://www.cnblogs.com/ganwei/p/4824277.html