zoukankan      html  css  js  c++  java
  • 面试题整理(一)

    面试题整理回答(一)

    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();
    }
  • 相关阅读:
    Systemverilog for design 笔记(三)
    SystemVerilog for design 笔记(二)
    Systemverilog for design 笔记(一)
    假如m是奇数,且m>=3,证明m(m² -1)能被8整除
    SharpSvn操作 -- 获取Commit节点列表
    GetRelativePath获取相对路径
    Dictionary(支持 XML 序列化),注意C#中原生的Dictionary类是无法进行Xml序列化的
    Winform中Checkbox与其他集合列表类型之间进行关联
    Image(支持 XML 序列化),注意C#中原生的Image类是无法进行Xml序列化的
    修复使用<code>XmlDocument</code>加载含有DOCTYPE的Xml时,加载后增加“[]”字符的错误
  • 原文地址:https://www.cnblogs.com/ganwei/p/4824277.html
Copyright © 2011-2022 走看看