总结
**其实上面说了这么多,钱是永远赚不完的,在这个知识付费的时代,知识技能提升才是是根本!我作为一名8年的高级工程师,知识技能已经学习的差不多。**在看这篇文章的可能有刚刚入门,刚刚开始工作,或者大佬级人物。
像刚刚开始学Android开发小白想要快速提升自己,最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以这里分享一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
这么重要的事情说三遍啦!点赞+点赞+点赞!
【Android高级架构师系统学习资料】高级架构师进阶必备——设计思想解读开源框架
第一章、热修复设计
第二章、插件化框架设计
第三章、组件化框架设计
第四章、图片加载框架
第五章、网络访问框架设计
第六章、RXJava 响应式编程框架设计
第七章、IOC 架构设计
第八章、Android 架构组件 Jetpack
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 在内容提供者代码的内部声明UriMatcher,创建匹配规则
public static final int SUCCESS = 1;
/**
- 创建一个保安,检查uri的规则,如果uri匹配失败 返回-1
*/
static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
mUriMatcher.addURI(“com.mythmayor.db”, “account”, SUCCESS);
}
-
实现增删改查的方法,通过uriMatcher的返回值确定要做什么操作
-
在另外一个应用程序里面,通过contentResolver进行增删改查
8.学习内容提供者的目的
-
了解内容提供者原理
-
能看懂系统源码
-
获取系统应用内容提供者所提供的数据,例如联系人、短信应用
9.如何去分析系统应用的内容提供者
-
查看数据库,分析数据库的表和字段
-
操作内容提供者需要uri
-
找到系统应用的源代码,首先去清单文件中查找主机名authorities
<provider android:name=“SmsProvider”
android:authorities=“sms”
android:multiprocess=“true”
android:readPermission=“android.permission.READ_SMS”
android:writePermission=“android.permission.WRITE_SMS” />
- 去对应的Provider的源代码中查找匹配规则,确定表名
static {
sURLMatcher.addURI(“sms”, null, SMS_ALL); //所有短信
sURLMatcher.addURI(“sms”, “inbox”, SMS_INBOX); //收件箱
sURLMatcher.addURI(“sms”, “sent”, SMS_SENT); //发件箱
sURLMatcher.addURI(“sms”, “draft”, SMS_DRAFT); //草稿箱
}
- 根据主机名和表名确定uri,使用ContentResolver的增删改查方法操作对应的数据库
10.通知栏提醒Notification
显示在另外一个进程的界面里面的
- 在低版本中的写法(api小于16),创建Notification时直接new Notification()
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//1.初始化Notification
Notification notification = new Notification(R.drawable.ic_launcher, “有新的消息到来了”, System.currentTimeMillis());
//2.创建通知栏的点击事件
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse(“tel://110”));
//PendingIntent延时的意图,可以打开Activity、Service和发送广播
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
//3.设置通知的点击事件
notification.setLatestEventInfo(this, “我是标题”, “我是文本”, contentIntent);
//4.显示通知
nm.notify(0, notification);
- 在高版本中的写法(api大于等于16),创建Notification时使用Notification.Builder
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//1.初始化Notification
Notification notification = new Notification.Builder(this)
.setContentTitle(“我是标题”)
.setContentText(“我是文本”)
.setSmallIcon(R.drawable.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher))
.setContentIntent(PendingIntent intent) //设置点击事件
.build();
//2.显示通知
nm.notify(0, notification);
- Notification中使用自定义View
api小于16
Notification notification = new Notification(R.drawable.ic_launcher, “有新的消息到来了”, System.currentTimeMillis());
//设置自定义布局
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.xxx);
notification.contentView = remoteViews;
api大于16
Builder builder = Notification.Builder(this);
//设置自定义布局
builder.setContent(RemoteViews views);
- RemoteViews使用方式
RemoteViews views = new RemoteViews(getPackageName(), R.layout.xxx);
views.setTextViewText(R.id.xxx, “hello”); //设置TextView的文本
views.setImageViewResource(R.id.xxx, R.drawable.xxx); //设置ImageView的图片
views.setOnClickPendingIntent(R.id.xx, pendingIntent); //设置按钮的点击事件
11.如何打开短信界面
尝试打开系统某个界面的思路
-
从logcat中查看是哪个Activity
-
在上层源码中搜索该工程
-
查看清单文件中是否有隐式意图可以激活
//打开短信界面的隐式意图
Intent intent = new Intent();
intent.setAction(“android.intent.action.MAIN”);
intent.addCategory(“android.intent.category.DEFAULT”);
intent.setType(“vnd.android.cursor.dir/mms”);
startActivity(intent);
12.联系人数据库
-
路径:data/data/com.android.providers.contacts/databases/contacts2.db
-
主要操作的3张表:
-
raw_contact:联系人的id表
- contact_id 保存联系人的id
- data:联系人的数据表
-
raw_contact_id 表示属于哪个联系人
-
data1 具体的数据
-
mimetype_id 数据的类型,使用该id去mimetypes表中查询数据类型
-
mimetypes:联系人的数据类型表
-
查询联系人数据库的数据的步骤
-
查询raw_contact表,获取所有联系人id
-
根据联系人id,查询data表,该联系人的所有数据
-
根据mimetype确定数据类型
13.如何读取联系人数据
ContentResolver resolver = getContentResolver();
//1.查询raw_contact表,获取所有联系人id
Uri uri = Uri.parse(“content://com.android.contacts/raw_contacts”);
Uri datauri = Uri.parse(“content://com.android.contacts/data”);
Cursor cursor = resolver.query(uri, new String[]{“contact_id”}, null, null, null);
while(cursor.moveToNext()){
String id = cursor.getString(0);
System.out.println(“Id:”+id);
//2.根据联系人id,查询data表,该联系人的所有数据
Cursor datacursor = resolver.query(datauri, new String[]{“data1”,“mimetype”}, “raw_contact_id=?”, new String[]{id}, null);
while(datacursor.moveToNext()){
//3.根据mimetype确定数据类型
String data1 = datacursor.getString(0);
System.out.println(“data1:”+data1);
String mimetype = datacursor.getString(1);
System.out.println(“mimetype:”+mimetype);
}
datacursor.close();
System.out.println(“------------”);
}
cursor.close();
-
备注:加上READ_CONTACTS权限,取mimetype时有个小细节,直接在data表里面就可以查询mimetype数据类型了,实际是查询数据库中的视图。
-
数据库视图:视图是虚表,是从一个或几个基本表(或视图)中导出的表。
-
简单性:看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图。
-
安全性:通过视图用户只能查询和修改他们所能见到的数据。数据库中的其它数据则既看不见也取不到。
14.系统联系人应用删除一个联系人的处理逻辑
-
联系人应用删除一个联系人时,只是在raw_contact表中,把对应联系人的id置为null了
-
Google这么设计的目的是为了进行联系人与服务器同步,还有减少计算量
-
比如,本地有4个联系人,服务器有5个联系人,而且服务器也具有添加联系人的功能,那同步时的逻辑是要往本地加一个联系人呢?还是要在服务器减一个联系人呢?
-
另外对比少哪一个数据是一个非常麻烦的算法,要从A里取一个去遍历B里是否有这样一个数据
15.添加一个联系人到数据库的步骤
-
在raw_contact表中添加一个联系人的id
-
在data表里添加联系人的数据,姓名、电话、邮箱等
16.内容观察者
//注册内容观察者
Uri uri = Uri.parse(“content://com.mythmayor.db/account”);
getContentResolver().registerContentObserver(uri, true, new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
System.out.println(“我是观察者,我发现银行的数据库变化了.”);
super.onChange(selfChange);
}
});
- 内容观察者一般用于观察系统数据库的变化,例如联系人、短信等。系统的数据库发生变化是不需要操作数据库的人手动调用ContentResolver.notifyChange()的,所以无论是谁改变了数据库我们都会收到通知。
17.界面提醒方式
- 土司
最后我还整理了很多Android中高级的PDF技术文档。以及一些大厂面试真题解析文档。
Android高级架构师之路很漫长,一起共勉吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
化,例如联系人、短信等。系统的数据库发生变化是不需要操作数据库的人手动调用ContentResolver.notifyChange()的,所以无论是谁改变了数据库我们都会收到通知。
17.界面提醒方式
- 土司
最后我还整理了很多Android中高级的PDF技术文档。以及一些大厂面试真题解析文档。
[外链图片转存中…(img-85qaQUsr-1715157988161)]
Android高级架构师之路很漫长,一起共勉吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!