Android - 四大组件之内容提供者,通知栏提醒Notification,短信,联系人数据库,内容观察者

}else{

}

6.内容提供者编写的流程

  1. 写一个类继承ContentProvider,实现增删改查的方法

  2. 在清单文件中配置内容提供者,指定 android:authorities=”com.mythmayor.db”

  3. 在内容提供者代码的内部 声明uriMatcher

  4. 通过uriMatcher 检查uri的路径是否正确

  5. 在另外一个应用程序里面 通过contentResolver 增删改查

7.内容提供者编写的流程

  1. 创建一个类继承ContentProvider

public class BankDBBackdoor extends ContentProvider {

}

  1. 在清单文件的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” >

  1. 在内容提供者代码的内部声明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);

}

  1. 实现增删改查的方法,通过uriMatcher的返回值确定要做什么操作

  2. 在另外一个应用程序里面,通过contentResolver进行增删改查

8.学习内容提供者的目的

  1. 了解内容提供者原理

  2. 能看懂系统源码

  3. 获取系统应用内容提供者所提供的数据,例如联系人、短信应用

9.如何去分析系统应用的内容提供者

  1. 查看数据库,分析数据库的表和字段

  2. 操作内容提供者需要uri

  3. 找到系统应用的源代码,首先去清单文件中查找主机名authorities

<provider android:name=“SmsProvider”

android:authorities=“sms”

android:multiprocess=“true”

android:readPermission=“android.permission.READ_SMS”

android:writePermission=“android.permission.WRITE_SMS” />

  1. 去对应的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); //草稿箱

}

  1. 根据主机名和表名确定uri,使用ContentResolver的增删改查方法操作对应的数据库

10.通知栏提醒Notification

显示在另外一个进程的界面里面的

  1. 在低版本中的写法(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);

  1. 在高版本中的写法(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);

  1. 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);

  1. 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.如何打开短信界面

尝试打开系统某个界面的思路

  1. 从logcat中查看是哪个Activity

  2. 在上层源码中搜索该工程

  3. 查看清单文件中是否有隐式意图可以激活

//打开短信界面的隐式意图

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.联系人数据库

  1. 路径:data/data/com.android.providers.contacts/databases/contacts2.db

  2. 主要操作的3张表:

  3. raw_contact:联系人的id表

  • contact_id 保存联系人的id
  1. data:联系人的数据表
  • raw_contact_id 表示属于哪个联系人

  • data1 具体的数据

  • mimetype_id 数据的类型,使用该id去mimetypes表中查询数据类型

  1. mimetypes:联系人的数据类型表

  2. 查询联系人数据库的数据的步骤

  3. 查询raw_contact表,获取所有联系人id

  4. 根据联系人id,查询data表,该联系人的所有数据

  5. 根据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();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(资料价值较高,非无偿)

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

13/H4lCoPEF.jpg" />

写在最后

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料

如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。

①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包,最后觉得有帮助、有需要的朋友可以点个赞

[外链图片转存中…(img-nTC5itJF-1711531908035)]

[外链图片转存中…(img-InICV7jx-1711531908036)]

[外链图片转存中…(img-D9p33y0H-1711531908036)]

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

猜你喜欢

转载自blog.csdn.net/2401_83916241/article/details/137084114