当前位置: 首页 > news >正文

免费自创网站做网站接雕塑业务

免费自创网站,做网站接雕塑业务,网站后台管理系统地址,有没有咨询求助做任务的网站#x1f525; Intent 传递数据 #x1f525; Activity、Service、BroadcastReceiver之间的通信载体 Intent 来传递数据。而ContentProvider则是共享文件。 Intent可传递的数据类型#xff1a; a. 8种基本数据类型#xff08;boolean byte char short int long float double… Intent 传递数据  Activity、Service、BroadcastReceiver之间的通信载体 Intent 来传递数据。而ContentProvider则是共享文件。 Intent可传递的数据类型 a. 8种基本数据类型boolean byte char short int long float double、Stringb. Intent、Bundlec. Serializable和Parcelable序列化对象将对象转为字节流及其对应数组、CharSequence 类型d. ArrayList泛型参数类型为Integer、? Extends Parcelable、Charsequence、String 序列化 1.Serializable 方式来进行序列化 //构建一个实现了Serializable接口的类 public class XrData implements Serializable {public String name;public String phone; }//序列化Bundle bundle new Bundle(); // Bundle主要用于传递数据它保存的数据是以key-value(键值对)的形式存在的bundle.putSerializable(DATA, entity); //1fragment.setArguments(bundle);//反序列化mContact (XrData) getArguments().getSerializable(DATA);mContact.name2.Parcelable 这是安卓专用的序列化方式。Parcelable接口比Serializable接口效率更高。 因为其实现原理是把对象分解为Intent支持的数据类型并通过Intent进行传输; 其数据可以保存在内存中相对于Serializable将数据保存在磁盘效率自然更高。public class CutInfo implements Parcelable {private int offsetX;private int offsetY;public CutInfo() {}// 序列化Overridepublic void writeToParcel(Parcel dest, int flags) { //3dest.writeInt(this.offsetX);dest.writeInt(this.offsetY);}Overridepublic int describeContents() { //4return 0;}// 反序列化protected CutInfo(Parcel in) {this.offsetX in.readInt();this.offsetY in.readInt();}// 反序列化public static final CreatorCutInfo CREATOR new CreatorCutInfo() { //5Overridepublic CutInfo createFromParcel(Parcel source) {return new CutInfo(source);}Overridepublic CutInfo[] newArray(int size) {return new CutInfo[size];}}; }// ActivityA.java 实现序列化 button.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {Intent intent new Intent(this, ActivityB.class);intent.putExtra(cut, new CutInfo(8, 8));startActivity(intent);}});// ActivityB.java 获取并反序列化Intent intent getIntent();CutInfo cut intent.getParcelableExtra(cut);Log.d(ActivityB, cut.toString()); //会输出 “8 8”ContentProvider 进程间传递数据   进程间传递数据(底层用的还是binder) 原理Binder简单的用法是进程A可以通过Binder获得进程B的本地代理通过本地代理就可以在进程A里面的调用进程B的方法。在ContentProvider的实现原理中通过ContentResolver可以查找对应给定Uri的ContentProvider返回对应的本地代理 BinderProxy通过这个BinderProxy就可以调用insert、delete接口。 Content Provider使一个应用程序的指定数据集提供给其他应用程序。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。例如通信录信息ContentProvider使用URI来唯一标识其数据集这里的URI以content://作为前缀表示该数据由ContentProvider来管理。ContentProvider是以Uri的形式对外提供数据ContentResolver是根据Uri来访问数据。 三者关系   ContentProvider、ContentResolver、ContentObserver 三者关系 ContentProvider内容提供者主要作用就是管理数据比如最常见的增删改查操作同时为这些数据的访问提供了统一的接口实现进程间的数据传递和共享ContentResolver内容解析者ContentResolver可以为不同URI操作不同的ContentProvider中的数据外部进程可以通过ContentResolver与ContentProvider进行交互。ContentObserver内容观察者观察ContentProvider中的数据变化有变化的时候执行特定操作。本人用的最多的是监听Settings数据库的变化。由于ContentObserver的生命周期不同步于Activity和Service等因此在不需要时需要手动的调用unregisterContentObserver()去取消注册。 在AndroidManifest注册   在Android文件AndroidManifest.xml注册authorities:访问表的主机地址exported:是否允许对外应用程序访问true允许false不允许默认false 继承ContentProvider Android系统为我们提供ContentProvider类我们继承这个类实现onCreate()、getType()、insert()、delete()、update()、query()onCreate()内容提供者初始化的时候调用一般这里执行数据库创建、升级操作。getType():根据给定的Uri返回一个MIME类型的数据。insert():Uri表示需要操作哪张表ContentValues需要插入的值插入成功返回一个Uridelete():Uri表示需要操作哪张表selection和selectionArgs表示筛选的条件返回受影响的行。update():Uri表示需要操作哪张表ContentValues需要插入的值selection和selectionArgs表示筛选的条件返回受影响的行。query():Uri表示需要操作哪张表projection需要查询表中那些字段selection和selectionArgs表示筛选的条件sortOrder对查询查询结果进行排序将查询结果放到Cursor返回。 public class PersonProvider extends ContentProvider {private static String TAG PersonProvider.class.getSimpleName();//这里的AUTHORITY就是我们在AndroidManifest.xml中配置的authoritiespublic static final String AUTHORITY com.dream.contentprovider;//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码,也就是说如果找不到匹配的类型,返回-1private static final UriMatcher URI_MATCHER;//匹配不同的表的codeprivate static final int ALL_PERSON 1;private static final int PERSON 2;//数据库的名字public static final String DB_NAME test.db;//数据库版本public static final int DB_VERSION 1;//数据库表的名称private static final String TABLE_NAME person;private MyDBHelper dbHelper;private SQLiteDatabase db;static {//创建一个路径识别器URI_MATCHER new UriMatcher(UriMatcher.NO_MATCH);//1.指定一个路径的匹配规则//如果路径满足content://com.dream.contentprovider.provider.PersonProvider/person,返回值就是(ALL_PERSON)1URI_MATCHER.addURI(AUTHORITY, /person, ALL_PERSON);//2.#号为通配符//如果路径满足content://com.dream.contentprovider.provider.PersonProvider/person/3,返回值就是(PERSON)2URI_MATCHER.addURI(AUTHORITY, /person/#, PERSON);}/*** 一般是对象第一次被创建时调用的方法** return*/Overridepublic boolean onCreate() {dbHelper new MyDBHelper(this.getContext(), DB_NAME, null, DB_VERSION);db dbHelper.getReadableDatabase();return true;}/*** 让别人去调用返回结果** param uri 匹配条件* param projection 选择的列* param selection 查询条件* param selectionArgs 查询条件的value* param sortOrder 排序* return*/NullableOverridepublic Cursor query(NonNull Uri uri, Nullable String[] projection, Nullable String selection, Nullable String[] selectionArgs, Nullable String sortOrder) {int type URI_MATCHER.match(uri);switch (type) {case ALL_PERSON:return db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);case PERSON://获取具体某一行的数据String id uri.getPathSegments().get(1);return db.query(TABLE_NAME, projection, _id ?, new String[]{id}, null, null, sortOrder);default:break;}return null;}//如果是单条记录应该返回以vnd.android.cursor.item/ 为首的字符串//如果是多条记录应该返回vnd.android.cursor.dir/ 为首的字符串NullableOverridepublic String getType(NonNull Uri uri) {int type URI_MATCHER.match(uri);switch (type) {case ALL_PERSON:return vnd.android.cursor.dir/vnd.com.dream.contentprovider.provider.person;case PERSON:return vnd.android.cursor.item/vnd.com.dream.contentprovider.provider.person;default:return null;}}NullableOverridepublic Uri insert(NonNull Uri uri, Nullable ContentValues values) {int type URI_MATCHER.match(uri);switch (type) {case ALL_PERSON:long row db.insert(TABLE_NAME, null, values);return ContentUris.withAppendedId(uri, row);case PERSON:long row2 db.insert(TABLE_NAME, null, values);return ContentUris.withAppendedId(uri, row2);default:return null;}}Overridepublic int delete(NonNull Uri uri, Nullable String selection, Nullable String[] selectionArgs) {int type URI_MATCHER.match(uri);int updateRow 0;switch (type) {case ALL_PERSON:updateRow db.delete(TABLE_NAME, selection, selectionArgs);break;case PERSON://获取具体某一行的数据String id uri.getPathSegments().get(1);updateRow db.delete(TABLE_NAME, _id ?, new String[]{id});break;default:break;}return updateRow;}Overridepublic int update(NonNull Uri uri, Nullable ContentValues values, Nullable String selection, Nullable String[] selectionArgs) {int type URI_MATCHER.match(uri);int updateRow 0;switch (type) {case ALL_PERSON:updateRow db.update(TABLE_NAME, values, selection, selectionArgs);break;case PERSON://获取具体某一行的数据String id uri.getPathSegments().get(1);updateRow db.update(TABLE_NAME, values, _id ?, new String[]{id});break;default:break;}return updateRow;} } 当APP启动的时候onCreate()方法被执行此时已经创建了数据库。 跨进程调用 private static final Uri STUDENT_ALL_URI Uri.parse(content:// PersonProvider.AUTHORITY /person); 拼接完整的地址为content://com.dream.contentprovider/person和content://com.dream.contentprovider/person/id其中这个id表示表中数据的行数id0、1、 2 ...。当和UriMatcher 进行匹配返回匹配类型。不管是进程内还是跨进程之间通信关键是否URL正确否则会出现如下错误: private static final Uri STUDENT_ALL_URI Uri.parse(content://com.dream.contentprovider/person); 插入数据insert() mUserProvider getContentResolver();ContentValues values new ContentValues();values.put(name, 张三);values.put(age, 18);values.put(sex, 男);mUserProvider.insert(STUDENT_ALL_URI, values); 删除数据delete() mUserProvider getContentResolver();mUserProvider.delete(STUDENT_ALL_URI, name ?, new String[]{张三}); 查询数据query()  mUserProvider getContentResolver();String result ;Cursor cursor mUserProvider.query(STUDENT_ALL_URI, null, null, null);if (cursor ! null) {try {while (cursor.moveToNext()) {String id cursor.getString(cursor.getColumnIndex(_id));String name cursor.getString(cursor.getColumnIndex(NAME));String age cursor.getString(cursor.getColumnIndex(AGE));String sex cursor.getString(cursor.getColumnIndex(SEX));result result \n _id id name name sex sex age age;}} finally {cursor.close();cursor null;mTextView.setText(result);}} 记得关闭游标防止内存泄漏 BroadcastReceiver BroadcastReceiver广播接收器属于 Android 四大组件之一在 Android 开发中BroadcastReceiver 的应用场景非常多。今天我将详细讲解关于BroadcastReceiver的所有广播类型主要分为5类 普通广播Normal Broadcast系统广播System Broadcast有序广播Ordered Broadcast粘性广播Sticky BroadcastApp应用内广播Local Broadcast 普通广播Normal Broadcast  即开发者自身定义intent的广播最常用。发送广播使用如下 Intent intent new Intent(); //对应BroadcastReceiver中intentFilter的action intent.setAction(BROADCAST_ACTION); //发送广播 sendBroadcast(intent); 若被注册了的广播接收者中注册时 intentFilter 的 action与上述匹配则会接收此广播即进行回调 onReceive() 。如下mBroadcastReceiver则会接收上述广播 receiver //此广播接收者类是mBroadcastReceiverandroid:name.mBroadcastReceiver //用于接收网络状态改变时发出的广播intent-filteraction android:nameBROADCAST_ACTION //intent-filter /receiver若发送广播有相应权限那么广播接收者也需要相应权限 系统广播System Broadcast  Android中内置了多个系统广播只要涉及到手机的基本操作如开机、网络状态变化、拍照等等都会发出相应的广播 每个广播都有特定的Intent - Filter包括具体的actionAndroid系统广播action如下 系统操作action监听网络变化android.net.conn.CONNECTIVITY_CHANGE关闭或打开飞行模式Intent.ACTION_AIRPLANE_MODE_CHANGED充电时或电量发生变化Intent.ACTION_BATTERY_CHANGED电池电量低Intent.ACTION_BATTERY_LOW电池电量充足即从电量低变化到饱满时会发出广播Intent.ACTION_BATTERY_OKAY系统启动完成后(仅广播一次)Intent.ACTION_BOOT_COMPLETED按下照相时的拍照按键(硬件按键)时Intent.ACTION_CAMERA_BUTTON屏幕锁屏Intent.ACTION_CLOSE_SYSTEM_DIALOGS设备当前设置被改变时(界面语言、设备方向等)Intent.ACTION_CONFIGURATION_CHANGED插入耳机时Intent.ACTION_HEADSET_PLUG 未正确移除SD卡但已取出来时(正确移除方法:设置–SD 卡和设备内存–卸载SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL插入外部储存装置如SD卡Intent.ACTION_MEDIA_CHECKING成功安装APKIntent.ACTION_PACKAGE_ADDED成功删除APKIntent.ACTION_PACKAGE_REMOVED重启设备Intent.ACTION_REBOOT屏幕被关闭Intent.ACTION_SCREEN_OFF屏幕被打开Intent.ACTION_SCREEN_ON关闭系统时Intent.ACTION_SHUTDOWN重启设备Intent.ACTION_REBOOT 注当使用系统广播时只需要在注册广播接收者时定义相关的action即可并不需要手动发送广播当系统有相关操作时会自动进行系统广播 有序广播Ordered Broadcast  定义 发送出去的广播被广播接收者按照先后顺序接收 广播接受者接收广播的顺序规则同时面向静态和动态注册的广播接受者 按照Priority属性值从大-小排序 Priority属性相同者动态注册的广播优先 特点 接收广播按顺序接收 先接收的广播接收者可以对广播进行截断即后接收的广播接收者不再接收到此广播 先接收的广播接收者可以对广播进行修改那么后接收的广播接收者将接收到被修改后的广播 具体使用 有序广播的使用过程与普通广播非常类似差异仅在于广播的发送方式 sendOrderedBroadcast(intent); App应用内广播Local Broadcast 背景 Android中的广播可以跨App直接通信exported对于有intent-filter情况下默认值为true 冲突 可能出现的问题 其他App针对性发出与当前App intent-filter相匹配的广播由此导致当前App不断接收广播并处理 其他App注册与当前App一致的intent-filter用于接收广播获取广播具体信息 即会出现安全性 效率性的问题。 解决方案 使用App应用内广播Local Broadcast 1、App应用内广播可理解为一种局部广播广播的发送者和接收者都同属于一个App。 2、相比于全局广播普通广播App应用内广播优势体现在安全性高 效率高 具体使用1 - 将全局广播设置成局部广播 注册广播时将exported属性设置为false使得非本App内部发出的此广播不被接收 在广播发送和接收时增设相应权限permission用于权限验证 发送广播时指定该广播接收器所在的包名此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。 通过**intent.setPackage(packageName)**指定报名 具体使用2 - 使用封装好的LocalBroadcastManager类 使用方式上与全局广播几乎相同只是注册/取消注册广播接收器和发送广播时将参数的context变成了LocalBroadcastManager的单一实例 注对于LocalBroadcastManager方式发送的应用内广播只能通过LocalBroadcastManager动态注册不能静态注册 //注册应用内广播接收器 //步骤1实例化BroadcastReceiver子类 IntentFilter mBroadcastReceiver mBroadcastReceiver new mBroadcastReceiver(); IntentFilter intentFilter new IntentFilter(); //步骤2实例化LocalBroadcastManager的实例 localBroadcastManager LocalBroadcastManager.getInstance(this);//步骤3设置接收广播的类型 intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);//步骤4调用LocalBroadcastManager单一实例的registerReceiver方法进行动态注册 localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);//取消注册应用内广播接收器 localBroadcastManager.unregisterReceiver(mBroadcastReceiver);//发送应用内广播 Intent intent new Intent(); intent.setAction(BROADCAST_ACTION); localBroadcastManager.sendBroadcast(intent); 粘性广播Sticky Broadcast  由于在Android5.0 API 21中已经失效所以不建议使用在这里也不作过多的总结。  OnReceive 回调函数中Context 含义 对于不同注册方式的广播接收器回调OnReceiveContext contextIntent intent中的context返回值是不一样的 对于静态注册全局应用内广播回调onReceive(context, intent)中的context返回值是ReceiverRestrictedContext对于全局广播的动态注册回调onReceive(context, intent)中的context返回值是Activity Context对于应用内广播的动态注册LocalBroadcastManager方式回调onReceive(context, intent)中的context返回值是Application Context。对于应用内广播的动态注册非LocalBroadcastManager方式回调onReceive(context, intent)中的context返回值是Activity Context
http://www.zqtcl.cn/news/415284/

相关文章:

  • 镜像网站能否做google排名宝丰网站制作公司
  • 中国公路建设协会网站网站建设 业务培训
  • 原创文章网站开发教程安徽网站建设获客企业
  • 企业网站后台怎么做南京微网站开发
  • 网站seo在线优化广告策划书的格式
  • 网站解析怎么设置三北防护林体系建设网站
  • 长沙高端网站建设公司wordpress分享缩略图
  • 支付网站建设费管理咨询公司取名
  • dw网站制作的一般流程wordpress 分类列表页
  • 重庆技术支持 网站建设公司wordpress挂黑页
  • 2网站建设类似wordpress
  • 特别酷炫网站惠州的服装网站建设
  • 网站右侧悬浮代码网站新闻前置审批
  • 2015网站建设十堰网站优化排名
  • 营销网站的优点番禺人才网最新招聘市场在哪里?
  • 企业网站建站模板自己做网站网站资源哪里来
  • 接入服务商网站备案管理系统技术规范要求郴州网站建设软件定制开发制作
  • 温州做网站公司哪家好购物网站的基本功能
  • 网站建设网站建设教程建设糖果网站的好处有哪些
  • 松原手机网站开发wordpress数据库设计优缺点
  • 惠州建设工程造价管理站网站中国海洋大学站群网站建设
  • 怎么做网站里面的模块太原做网络推广
  • 网站关键词排名优化应该怎么做wordpress实惠主机
  • 服装 营销型网站案例网站建设资料需要公司提交的吗
  • 网站权重高 做别的关键词怎么查看网站是否被百度收录
  • 沈阳网站开发培训多少钱广州做网站的公司哪家好
  • 宁波江北建设局网站建筑室内设计公司
  • 辽宁网站seo做网站的不给ftp
  • 南宁seo网站排名优化公司电商主图一键生成免费
  • 宁波论坛建站模板wordpress发布公告