总结
【Android 详细知识点思维脑图(技能树)】
我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
最后,赠与大家一句话,共勉!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
}
@Override
public Cursor query(Uri uri, String\[\] projection, String selection,
String\[\] selectionArgs, String sortOrder) { //可以供外部应用查询内容提供者提供的数据
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
Cursor cursor \= null;
switch (MATCHER.match(uri)) {
case 1:
cursor \= db.query("person", projection, selection, selectionArgs,
null, null, sortOrder);
break;
case 2:
int rowId = (int) ContentUris.parseId(uri);
String where \= "personId=?" + rowId;
if(selection != null && !"".equals(selection.trim())){
where += " and" + selection;
}
cursor \= db.query("person", projection, where, selectionArgs,
null, null, sortOrder);
break;
default:
throw new IllegalArgumentException("this is Unknown Uri:" + uri);
}
return cursor;
}
/\*\*
\* 2种方法
\* 1.查询所有 /person
\* 2.查询指定的ID /person/10
\* 该方法用于返回当前Uri所代表数据的MIME类型,如果操作的数据属于集合类型
\* 那么,MIME类型字符串应该以vnd.android.cursor.dir/开头
\* 例:要得到所有person记录的Uri为content://cn.itcast.provider.personprovider/person
\* 那么返回的MIME类型字符串应该为:vnd.android.cursor.dir/person
\* 如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该为:
\* vnd.android.cursor.item/开头
\* 例:得到Id为10的person记录,Uri为content://cn.itcast.provider.personprovider/person/10
\* 那么 返回的MIME类型字符串应该为vnd.android.cursor.item/person
\*/
@Override
public String getType(Uri uri) { //返回你现在要操作的数据的内容类型
switch (MATCHER.match(uri)) {
case 1:
return "vnd.android.cursor.dir/person";
case 2:
return "vnd.android.cursor.item/person";
default:
throw new IllegalArgumentException("this is Unknown Uri:" + uri);
}
}
/\*\*
\* 2种方法
\* 1.删除所有 /person
\* 2.删除指定的ID /person/10
\*/
@Override
public int delete(Uri uri, String selection, String\[\] selectionArgs) {
SQLiteDatabase db \= dbOpenHelper.getWritableDatabase();
int num = 0;
switch (MATCHER.match(uri)) {
case 1:
num \= db.delete("person", selection, selectionArgs);
break;
case 2:
int rowId = (int) ContentUris.parseId(uri);
String where \= "personId=?" + rowId;
if(selection != null && !"".equals(selection.trim())){
where += " and" + selection;
}
num \= db.delete("person", where, selectionArgs);
break;
default:
throw new IllegalArgumentException("this is Unknown Uri:" + uri);
}
return num;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db \= dbOpenHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case 1:
long rowId = db.insert("person", "name", values); //如果主键是整数则rowId=主键
// content://cn.itcast.provides.personprovider/person/10
//第一种写法
//Uri insertUri = Uri.parse("content://cn.itcast.providers.personprovider/person/" + rowId);
//第2种写法
Uri insertUri = ContentUris.withAppendedId(uri, rowId);
return insertUri;
default:
throw new IllegalArgumentException("this is Unknown Uri:" + uri);
}
}
/\*\*
\* 2种方法
\* 1.更新所有 /person
\* 2.更新指定的ID /person/10
\*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String\[\] selectionArgs) {
SQLiteDatabase db \= dbOpenHelper.getWritableDatabase();
int num = 0;
switch (MATCHER.match(uri)) {
case 1:
num \= db.update("person", values, selection, selectionArgs);
break;
case 2:
int rowId = (int) ContentUris.parseId(uri);
String where \= "personId=?" + rowId;
if(selection != null && !"".equals(selection.trim())){
where += " and" + selection;
}
num \= db.update("person", values, where, selectionArgs);
break;
default:
throw new IllegalArgumentException("this is Unknown Uri:" + uri);
}
return num;
}
}
新建一个Other应用程序,添加调用ContentProvider的类
package cn.itcast.test;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;
public class AccessContentProviderTest extends AndroidTestCase {
private static final String TAG = "AccessContentProviderTest";
public void testInsert() throws Exception{
总结
本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
n{
总结
本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!