Android
来源:互联网 发布:ios上传图片java接收 编辑:程序博客网 时间:2024/06/08 14:53
1.四大组件
- activity
- service
- broadcast receiver
- content provider 内容提供者
2.内容提供者的作用
应用程序创建的数据库默认都是私有的,别的应用程序不可以访问里面的数据。如果有需求把自己应用程序私有的数据库暴露给别的用户,就需要使用内容提供者
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" > </provider></application>
重写内容提供者中的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" > </provider></application>
在内容提供者代码的内部声明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.初始化NotificationNotification 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.初始化NotificationNotification 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表
- 查询联系人数据库的数据的步骤
- 查询raw_contact表,获取所有联系人id
- 根据联系人id,查询data表,该联系人的所有数据
- 根据mimetype确定数据类型
13.如何读取联系人数据
ContentResolver resolver = getContentResolver();//1.查询raw_contact表,获取所有联系人idUri 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.界面提醒方式
- 土司
- 对话框
- 通知栏 notification
显示在另外一个进程的界面里面的
18.总结
- 内容提供者(ContentProvider)
- 内容提供者的作用
- 如何编写内容提供者
- UriMatcher的作用,如何使用
- 如何访问其他应用的内容提供者
- 通过内容提供者操作短信数据
- 通过内容提供者操作联系人数据
- 操作联系人数据库中要用到的三张表
- 获取所有联系人数据的思路
- 内容观察者(ContentObserver)
- 内容观察者的作用
- 如何使用内容观察者
- 通知栏提醒(Notification)
- 通知栏提醒Notification的使用
- Android
- android
- Android
- android
- android
- Android
- Android
- android
- android
- android
- Android
- Android
- android!!!
- android
- android
- android
- android
- android:
- sql server 给某张已经存在的表添加一个字段
- android studio Session 'app': Error Installing APK解决方法
- iOS集成极光推送 生产环境收不到推送消息
- Spring读取配置文件的方式
- 服务发现过程分析
- Android
- IOS Swift3.1 手工代码编写主视图
- Android 表情功能实现,封装面板方便使用
- 关于vbA等项目出现计算机无法加载项目处理方法。
- Ubuntu 中软件的安装、卸载以及查看的方法总结
- [vim] H M L G
- 轻松实现分页指示器 ViewPagerIndicator Android自定义控件
- 全国省市区数据SQL
- 20. OP-TEE中TA与CA执行流程-------CA部分的代码篇