资源分享
- 最新大厂面试专题
这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等
- 对应导图的Android高级工程师进阶系统学习视频
最近热门的,NDK,热修复,MVVM,源码等一系列系统学习视频都有!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
3.创建内容提供者
- 创建一个类继承ContentProvider
public class BankDBBackdoor extends ContentProvider {
}
- 在清单文件的application节点中进行配置
<application
android:allowBackup=“true”
android:icon=“@drawable/ic_launcher”
android:label=“@string/app_name”
android:theme=“@style/AppTheme” >
…
…
<provider
android:name=“com.mythmayor.db.BankDBBackdoor”
//必须配置该主机名,访问者使用该主机名才能访问
android:authorities=“com.mythmayor.db” >
- 重写内容提供者中的insert等方法
4.访问内容提供者
// 得到内容提供者的解析器
ContentResolver resolver = getContentResolver();
// 访问内容提供者主要通过uri来访问
Uri uri = Uri.parse(“content://com.mythmayor.db”);
ContentValues values = new ContentValues();
// 通过内容解析器让内容提供者添加一条数据
resolver.insert(uri, values);
5.UriMatcher的使用步骤
- 创建一个UriMatcher,并初始化
//初始化为不匹配
static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
- 创建一些匹配规则
//如果uri满足 content://com.mythmayor.db/account,则返回SUCCESS这个常量值
static {
mUriMatcher.addURI(“com.mythmayor.db”, “account”, SUCCESS);
}
//系统短信应用的匹配规则
private static final UriMatcher sURLMatcher = new UriMatcher(UriMatcher.NO_MATCH);
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); //草稿箱
}
- 在insert等方法中,先使用match(Uri uri)方法匹配一个uri,然后根据返回的值进行不同的操作
int code = mUriMatcher.match(uri);
if (code == SUCCESS) {
…
…
}else{
…
…
}
6.内容提供者编写的流程
-
写一个类继承ContentProvider,实现增删改查的方法
-
在清单文件中配置内容提供者,指定 android:authorities=”com.mythmayor.db”
-
在内容提供者代码的内部 声明uriMatcher
-
通过uriMatcher 检查uri的路径是否正确
-
在另外一个应用程序里面 通过contentResolver 增删改查
7.内容提供者编写的流程
- 创建一个类继承ContentProvider
public class BankDBBackdoor extends ContentProvider {
}
- 在清单文件的application节点中进行配置
<application
android:allowBackup=“true”
android:icon=“@drawable/ic_launcher”
android:label=“@string/app_name”
android:theme=“@style/AppTheme” >
…
…
<provider
android:name=“com.mythmayor.db.BankDBBackdoor”
//必须配置该主机名,访问者使用该主机名才能访问
android:authorities=“com.mythmayor.db” >
- 在内容提供者代码的内部声明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);
//设置自定义布局
面试复习笔记
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960页Android开发笔记》
《1307页Android开发面试宝典》
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
列出的知识点会大大增加通过前两轮技术面试的几率。
[外链图片转存中…(img-UXD2ECNl-1715158053536)]
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
[外链图片转存中…(img-fqtdvPi4-1715158053536)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!