最后附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总)
面试成功其实是必然的,因为我做足了充分的准备工作,包括刷题啊,看一些Android核心的知识点,看一些面试的博客吸取大家面试的一些经验,下面这份PDF是我翻阅了差不多1个月左右一些Android大博主的博客从他们那里取其精华去其糟泊所整理出来的一些Android的核心知识点, 全部都是精华中的精华,我能面试到现在资深开发人员跟我整理的这本Android核心知识点有密不可分的关系,在这里本着共赢的心态分享给各位朋友。
这份PDF囊括了JVM,Java集合,Java多线程并发,Java基础,生命周期,微服务, 进程,Parcelable 接口,IPC,屏幕适配,线程异步,ART,架构,Jetpack,NDK开发,计算机网络基础,类加载器,Android 开源库源码分析,设计模式汇总,Gradle 知识点汇总…
由于篇幅有限,就不做过多的介绍,大家请自行脑补
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
strJson = “{staff:[{name:‘Alex’,age:21},{name:‘Zhou’,age:22},{name:‘Anne’,age:23}],company:‘T-Chip’}”;
staffInfo = “原始数据:\n” + strJson + “\n\n解析之后:\n”;
try {
JSONObject mJsonObject = new JSONObject(strJson);
JSONArray mJsonArray = mJsonObject.getJSONArray(“staff”);
String company = mJsonObject.getString(“company”);
staffInfo = staffInfo + company + "共有 " + mJsonArray.length()
- " 个员工,信息如下:\n";
for (int staffCount = 0; staffCount < mJsonArray.length(); staffCount++) {
// 获取员工
JSONObject staff = mJsonArray.getJSONObject(staffCount);
int staffNo = staffCount + 1;
staffInfo = staffInfo + “序号:” + staffNo + " 姓名: "
-
staff.getString(“name”) + " 年龄: "
-
staff.getInt(“age”) + “\n”;
}
tvMsg.setText(staffInfo);
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
布局有点拖沓,其实数据封装部分还可以利用一下解析部分的逻辑。
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
android:layout_width=“fill_parent”
android:layout_height=“fill_parent”
android:orientation=“vertical” >
<TextView
android:id=“@+id/tvMsg”
android:layout_width=“fill_parent”
android:layout_height=“wrap_content” />
<TextView
android:layout_width=“fill_parent”
android:layout_height=“wrap_content”
android:text=“==========================” />
<LinearLayout
android:layout_width=“fill_parent”
android:layout_height=“wrap_content”
android:orientation=“horizontal” >
<EditText
android:id=“@+id/etName”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:hint=“姓名” />
<EditText
android:id=“@+id/etAge”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:hint=“年龄” />
<Button
android:id=“@+id/btnAdd”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“增加” />
<Button
android:id=“@+id/btnJson”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“JSON” />
<TextView
android:id=“@+id/tvJson”
android:layout_width=“fill_parent”
android:layout_height=“wrap_content” />
4.DOM,SAX解析XML
分别通过DOM和SAX解析XML实现存储和读取XML信息。
首先是DOM存储信息到XML文件:
// 判断是否存在SDCard
if(!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)){
return ;
}
// 路径:/sdcard/zhoumushui/android.xml
File file = new File(Environment
.getExternalStorageDirectory().toString()
-
File.separator
-
“zhoumushui” + File.separator + “android.xml”) ;
// 若目录不存在则创建
if (! file.getParentFile().exists()) {
file.getParentFile().mkdirs() ;
}
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document doc = null;
doc = builder.newDocument();
// 根标签
Element roottag = doc.createElement(“roottag”) ;
// 次标签
Element infotag = doc.createElement(“infotag”) ;
Element name = doc.createElement(“name”) ;
Element url = doc.createElement(“url”) ;
name.appendChild(doc.createTextNode(MyDOMDemo.this.name.getText()
.toString()));
url.appendChild(doc.createTextNode(MyDOMDemo.this.url.getText()
.toString())) ;
// 次标签有两个子元素name和url
infotag.appendChild(name) ;
infotag.appendChild(url) ;
// 主标签有一个子元素infotag
roottag.appendChild(infotag) ;
doc.appendChild(roottag) ;
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = null;
try {
transformer = transformerFactory.newTransformer();
} catch (TransformerConfigurationException e1) {
e1.printStackTrace();
}
transformer.setOutputProperty(OutputKeys.ENCODING, “UTF-8”) ;
// 定义source和result,从source变形为result:
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(file);
try {
transformer.transform(source, result);
} catch (TransformerException e) {
e.printStackTrace();
}
在Activity中输入内容后,点击Button提交后,在/sdcard/zhoumushui/android.xml文件中显示以下信息:
<?xml version="1.0" encoding="UTF-8"?>zhoumushui
blog.csdn.net/zhoumushui
成功实现了将数据存储到XML文件中,下面看一下怎么用DOM读取XML中的信息:
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return;
}
File file = new File(Environment.getExternalStorageDirectory()
.toString()
-
File.separator
-
“zhoumushui”
-
File.separator + “android.xml”);
if (!file.exists()) {
return;
}
// 建立DocumentBuilderFactory,以用于取得DocumentBuilder
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
// 通过DocumentBuilderFactory取得DocumentBuilder
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
// 定义Document接口对象,通过DocumentBuilder类进行DOM树的转换操作
Document doc = null;
try {
doc = builder.parse(file); // 读取指定路径的xml文件
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
NodeList nodeList = doc.getElementsByTagName(“infotag”);
// 输出NodeList中第一个子节点中文本节点的内容
for (int x = 0; x < nodeList.getLength(); x++) { // 循环输出节点内容
Element e = (Element) nodeList.item(x); // 取得每一个元素
MyDOMDemo.this.name.setText(e.getElementsByTagName(“name”)
.item(0).getFirstChild().getNodeValue()); // 设置文本
MyDOMDemo.this.email.setText(e.getElementsByTagName(“url”)
.item(0).getFirstChild().getNodeValue()); // 设置文本
}
这样就可以读取到刚刚存储到android.xml文件中的内容了。
下面看一下另外一种解析方式SAX获得xml中内容的处理方法:
Activity中的内容与DOM类似:
if (!Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
return;
}
File file = new File(Environment.getExternalStorageDirectory()
.toString()
-
File.separator
-
“zhoumushui”
-
File.separator + “android.xml”);
if (!file.exists()) {
return;
}
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = null;
MySAX mySax = new MySAX();
try {
parser = factory.newSAXParser();
} catch (Exception e) {
e.printStackTrace();
}
try {
parser.parse(file, mySax);
} catch (Exception e) {
e.printStackTrace();
}
List all = mySax.getAll();
name.setText(all.get(0).getName());
url.setText(all.get(0).getUrl());
MySAX类继承自org.xml.sax.helpers.DefaultHandler :
public class MySAX extends DefaultHandler {
private List all = null;
private String elementName = null;
private LinkMan linkMan = null;
@Override
public void startDocument() throws SAXException {
this.all = new ArrayList();
}
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
if (“infotag”.equals(localName)) {
this.linkMan = new LinkMan();
}
this.elementName = localName;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if (this.elementName != null) {
String data = new String(ch, start, length);
if (“name”.equals(this.elementName)) {
this.linkMan.setName(data);
} else if (“url”.equals(this.elementName)) {
this.linkMan.setUrl(data);
}
}
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if (“linkman”.equals(localName)) {
this.all.add(this.linkMan);
this.linkMan = null;
}
this.elementName = null;
}
public List getAll() {
return this.all;
}
}
这两天开始开始忙起来了,做一些mediaTek编译和固件的事情,还有Qualcomm的初步熟悉和部分源码了解。今晚还要赶一下月度述职报告,就先这样了。
5.初识Media类的EXTERNAL_CONTENT_URI和INTERNAL_CONTENT_URI
今天有个客户需求,要内置一个不可删除的视频。
不可删除的话,不能在设备中删除,USB连接电脑也不能删除。那么直接放到system/media/下好了,这样对用户就完全不可见了,这样还不行,完全不可见,就失去了内置视频的意义,所以我们还要在视频播放器中显示出来,这就要修改播放器的源码,让播放器读取Internal的媒体文件即可。
adb shell,查看如下目录
/data/data/com.android.providers.media/databases/
可以看到有两个数据库文件:external.db和internal.db:
尾声
最后,我再重复一次,如果你想成为一个优秀的 Android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
做深度研究。
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
[外链图片转存中…(img-ij57HPHZ-1715409201728)]
Android进阶学习资料库
一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
[外链图片转存中…(img-NdJUvmwK-1715409201728)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!