第一篇:Android数据共享之ContentProvider总结
Content Provider 由上一节内容,我们了解到Adroid的数据都是私有的,那么对于像通讯录之类,多个APP(拨号、通话、短消息…)都需要共享使用,该怎么实现呢?
答案就是ContentProvider。
概述:
ContentProvider是Android平台中,在不同应用程序之间实现数据共享的一种机制。一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制。并且此种方式忽略了底层的数据存储实现,ContentProvider提供了一种统一的通过Uri实现数据操作的方式。
Android为常用的数据类型(图片,音视频,通讯录)提供了大量的ContentProvider,它们被定义在android.provider包下面。
操作模型:
ContentProvider类:
定义在android.content包下面,主要数据存取类,提供了常用的数据操作接口 • delete(): 删除数据集
• insert():添加数据集
• qurey():查询数据集
• update():更新数据集
• onCreate():初始化底层数据集和建立数据连接等工作
• getType():返回指定URI的MIME数据类型,ContentResolver类:
ContentProvider是实际操作数据库的方法,客户端通过ContentResolver实现,ContentResolver和ContentProvider提供了对应的方法,诸如insert(), delete(), query()和update()之类的方法。我们间接的通过ContentResolver的方法来操作ContentProvider。
Uri介绍
ContentProvider 通过URI对象共享数据;Uri代表了要操作的数据,Uri主要包含了两部分信息:
1》需要操作的ContentProvider
2》对ContentProvider中的什么数据进行操作
Uri是一个通用资源标志符,将其分为A,B,C,D 4个部分:
A:无法改变的标准前缀,包括;“content://”、“tel://”等。当前缀是“content://”时,说明通过一个Content Provider控制这些数据;
B:URI的标识,它通过authorities属性声明,用于定义了是哪个ContentProvider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。例如:
“content:// com.test.contentproviderdemo ”;
C:路径,可以近似的理解为需要操作的数据库中表的名字,如:“content:// com.test.contentproviderdemo/people”中的people
D:如果URI中包含表示需要获取的记录的ID,则就返回该id对应的数据,如果没有ID,就表示返回全部;
将字符串转成Uri,Uri uri = Uri.parse(“content:// com.test.contentproviderdemo/people ”)
跟Uri相关的两个操作类:
A、public class UriMatcher //匹配
//注册匹配Uri路径
//常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);//添加需要匹配uri,如果匹配就会返回匹配码
//如果match()方法匹配content:// com.test.contentproviderdemo/people路径,返回匹配码为1 sMatcher.addURI(“com.test.contentproviderdemo”, “people”, 1);
//如果match()方法匹配content://com.test.contentproviderdemo/people/2路径,返回匹配码为2 sMatcher.addURI(“com.test.contentproviderdemo”, “people /#”, 2);//#号为通配符
switch(sMatcher.match(Uri.parse(“content:// com.test.contentproviderdemo/people/10”))){
case 1
break;case 2
break;default://不匹配
break;}
B、public class ContentUris //获取ID
withAppendedId(uri, id)用于为路径加上ID部分:
Uri uri = Uri.parse(“content:// com.test.contentproviderdemo/people ”)Uri resultUri = ContentUris.withAppendedId(uri, 10);parseId(uri)方法 用于从路径中获取ID部分:
Uri uri = Uri.parse(“content:// com.test.contentproviderdemo/people /10”)long personid = ContentUris.parseId(uri);//获取的结果为:10
主要步骤:
1.创建保存数据的文件或者数据库。
2.在当前应用程序中定义一个ContentProvider,重载相关操作接口。如: public class PeopleProvider extends ContentProvider{ public boolean onCreate()public Uri insert(Uri uri, ContentValues values)public int delete(Uri uri, String selection, String[] selectionArgs)public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)} public String getType(Uri uri)3.在当前应用程序的AndroidManifest.xml中注册此ContentProvider
android:authorities = “com.test.contentproviderdemo”/> 4.其他应用程序通过ContentResolver和Uri来获取此ContentProvider的数据。
ContentResolver resolver = getContentResolver();5.通过注册registerContentObserver监听ContentProvider的数据变化;
ContentProvider完整实例:
ContentResolverDemo.zipContentProviderDemo.zip
ContentProviderDemo是一个无界面的示例,仅提供一个ContentProvider组件,供其他应用程序进行数据交换底层使用SQLite数据库,支持数据的添加、删除、更新和查询等基本操作
ContentResolverDemo是使用ContentProvider的示例,自身不具有任何数据存储功能,仅是通过URI访问ContentProviderDemo示例提供的ContentProvider。<完>
第二篇:Android 浅谈数据共享
由麦可网整理,转载请注明出处
Android 浅谈数据共享
对于应用程序之间的数据共享,Android提供了比较灵活的方式,相关的开发经验下面是Android123平时使用的方法。
1.简单配置文件:
SharedPreferences方式存储的配置文件,我们在各个应用间可以通过 getSharedPreferences(“eoeandroid”, Context.MODE_PRIVATE);这样的方式存储,最后是共享模式,这里使用了私有,而通过全局读、全局写可以让其他的应用访问,通过createPackageContext方法,但是在Android 1.5 以后,共享访问需要相同UID和签名才可以访问。
2.SQLite数据库文件
对于一些较为复杂的配置或数据,在Android平台上我们一般使用SQLite数据库存储,对于共享我们可以提供ContentProvider接口来实现,我们虽然可以获取当前应用的数据库保存位置,通过Context的getDatabasePath(String name)这个方法,由于应用的PackageName比较长可能会发生变动,Android提供了类似Intent的方式来匹配一些Uri,比如说电话拨号为 tel:// 而对于网址可以使用 http:// 对于定做坐标使用geo://,而我们的数据库可以通过UriMatcher类的addURI添加一些Uri,通过隐式Intent方式实现自己的处理方式,具体的大家可以查看短信应用的开源代码 Mms.git 了解。
3.对于运行中的高性能数据共享
在Android中共享内存方法可以使用linux底层的mmap方式,对于跨进程访问,使用IPC,当然Android还提供了AIDL远程服务来实现数据绑定访问处理,所以说对于Android Service的开发,一定要记住通过Bind方式来开发,比较典型的有音乐播放器,Music.gif
第三篇:Android之activity总结
Android之Activity总结
一、什么是Activity
Activity 是用户接口程序,原则上它会提供给用户一个交互式的接口功能。它是 android 应用程序的基本功能单元。Activity 本身是没有界面的。所以activity类创建了一个窗口,开发人员可以通过setContentView(View)接口把UI放到activity创建的窗口上,当activity指向全屏窗口时,也可以用其他方式实现:作为漂浮窗口(通过windowIsFloating的主题集合),或者嵌入到其他的activity(使用ActivityGroup)。activity是单独的,用于处理用户操作。几乎所有的activity都要和用户打交道
二、Activity生命周期(生命周期方法)
由图可知,这些方法调用的顺序:
1.Activity正常启动:onCreate-> onStart-> onResume;
2.Activity被杀掉:onPause-> onStop-> onDestroy,此为一个完整的生命周期。3.中断处理:onPause-> onStop,恢复时onRestart-> onStart-> onResume;
4.如果当前Activity是半透明状态或者对话框状态:那么中断就是onPause ,恢复的时候onResume。
那么对于”Other app need memory”,就是我们手机在运行一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能,另外系统也不允许你占用太多资源,至少要保证一些功能(比如电话),所以资源不足的时候也就有可能被kill掉。
方法在系统中的作用及我们应该做什么:
onCreate(创建):在这里创建界面,做一些数据的初始化工作;
onStart(可视状态): 到这一步变成“用户可见不可交互”的状态;
onResume(可交互状态):变成和用户可交互的,(在Activity栈系统通过栈的方式管理这些Activity,即当前Activity在栈的最上端,运行完弹出栈,则回到上一个Activity);
onPause(暂停状态):到这一步是可见但不可交互的,系统会停止动画等消耗CPU的事情。从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降
低,有可能被系统收回。在这里保存的数据,应该在onResume里读出来。
OnStop(停止状态):变得不可见,被下一个activity覆盖了。
onDestroy(杀死):这是Activity被kill前最后一个被调用方法了,可能是其他类调用finish方法或者是系统为了节省空间将它暂时性的干掉。
onPause,onstop,onDestroy,三种状态下 activity都有可能被系统杀掉。
Activity栈:Activity以栈的形式进行管理,后进先出的原则
三、Activity之间的通信
在 Android 中,不同的 Activity 实例可能运行在一个进程中,也可能运行在不同的进程中。因此我们需要一种特别的机制帮助我们在 Activity 之间传递消息。
Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容。
Intent是一种运行时绑定(runtime binding)机制
Intent负责对操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。
在应用中,我们可以以两种形式来使用Intent:
直接Intent(应用程序内部):指定了component(组建)属性的Intent。通过指定具体的组件类,通知应用启动对应的组件。
间接Intent(应用程序之间):没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
对于直接Intent,Android不需要去做解析,因为目标组件已经很明确。
Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。Intent解析机制主要是通过查找已注册在AndroidManifest.xml(清单)中的所有IntentFilter(意图过滤器)及其中定义的Intent,最终找到匹配的Intent。
横屏时:onConfigurationChanged(配置改变))
横屏以及出现键盘键盘时生命周期部重新开始的方法: KeyboardHidHidden/orientation/screenSize 横屏显示:landscape 竖屏显示:portrait
四大组建:activity:活动、service:服务、content provider:内容提供商、broadcast receiver:广播收音机
Activity的所有面试题
什么是Activity? 请描述一下Activity 生命周期?
两个Activity之间跳转时必然会执行的是哪几个方法?
你后台的Activity被系统 回收怎么办?如果后台的Activity由于某原因被系统回收可了,如何在被系统回收之前保存当前状态?
如何退出Activity?如何安全退出已调用多个Activity的Application? 两个Activity之间怎么传递数据?
第四篇:关于android手机的文件共享
关于android系统的设备的文件共享
个人写作水平不怎么好,请各位不要笑话!写这个没有什么其他意图,只是想和大家分享个人的一些想法!
如今这年代手机、平板电脑进入了每个人的生活,时不时的会拿出来玩玩。有时候,几个人在一起的时候,可能会问到“你手机里有什么好东西,分享分享一下”,在这个时候,大家最可能想到的是通过蓝牙来传输,当然如果在文件大小较少时还好,传几分钟没关系,如果是视频,数据包等这类大文件,还这样传输就太费时了。。。。。。。
费话就不多说。直接说说这个文件共享。网络速度的比蓝牙快多了,所以我的共享方法就是通过网络来共享。说到网络当然不会是用中国联通,中国移动这类,指的是局域网,首先得建立一个,android2.2以上系统的手机都可以建立一个无线热点,可以让其中一个手机开启这个功能(如果怕其他设备通过你的手机上网浪费流量,就可以关闭移动数据),让其他需要共享的设备接入这个网络,如果在windows 下,大家都知道,通过Windows的资源管理将某个文件夹共享,其他设备通过输入IP共享目录就可以了,但是android系统的没有这么方便的功能,当然在这里原理也是一样的,必须建立一个共享文件夹,这里个人推荐一个软件是——无线数据线(这个网上很多)——此软件建立的是一个FTP
建立 一个共享还不行啦,得有个软件能访问网络文件夹才行啦,个人推荐ES文件浏览器,通过这两个软件就可以完成共享文件。
软件的使用,我相信大家大部分一看都会用,如果不会请参考网上。总结:
此方法的条件
1:有WIFI功能的设备
2:有一无线网络,或者一个手机能提供无线热点。3:无线数据线软件(仅建立共享机必备)4:ES文件浏览器软件(访问共享的必备)、说明:此方式,他人可以删除文件,安全性不高 玩android高手,可以建立一个SMB服务器进行共享。
另一种和与蓝牙点对点发送方式类似,同样要求上一种方式的前两项,要求另外一个软件,称为WIFI文件共享软件,网上有下载。
第五篇:Android总结
Android四大组件:
Activity—表现屏幕界面
Service—后台服务
BroadcastReceiver—实现广播机制
ContentProvider—实现数据存储
Intent类:用来启动程序并传递信息的类
用于Activity、Receiver、Service之间进行交互的类,通过无参构造方法创建对象,增加其action、category、data、extra等属性进行信息传递,并通过Activity中的startActivity(Intent intent)进行界面的跳转;通过Context中的StartService(Intent intent)进行服务跳转;通过Context中的registerReceive(Intent intent)对广播进行注册,并通过sendBroadcast()进行无序消息发送,或可以通过SendOrderedBroadcast()进行有序的消息发送。Handler类:
用来发送和处理消息,并配合主线程完成UI的更新;消息Message/Runnable传递通过MessageQueue(消息队列,先进先出)进行传递,并通过Lopper进行接收,传递的消息可以为Message对象,也可以是Runnable对象;接收方法通过HandleMessage(Message msg)进行获取。SharedPreferences类:
一般用于第一次登录时的设置,或者是各个界面的一些小型格式设置,如字体等。是本地的小型共享数据库,可以通过Context的静态方法getSharedPreferences获得其对象,对象内的值均为键值对进行储存。通过SharedPreferences对象调用editor()获取SharedPreferences.Editor对象,向共享数据库中增加数据,putString(),并提交数据,commit();通过SharedPreferences对象获取共享数据库中的数据,getString()。
ViewPager:实现界面滑动的类;
通过设置OnPagerChangedListener设置ViewPager的监听事件;
实现流程:
①布局文件中设置ViewPager控件;
②代码中进行绑定控件;
③通过继承PagerAdapter抽象类进行设置适配器,并传递数据源;
④适配器中实现两个抽象方法,两个重写方法:getCount()—获取滑动界面的数量,isViewFromObject()—判断视图是否是来自于Object文件中;重写两个方法,分别为destoryItem—销毁指定位置的视图;InstantiateItem(),设置指定位置的视图;
Timer与TimerTask类:
Timer为计时器的类,通过无参构造方法可以获取对象,通过Timer.schedule(TimerTask task,long time)进行设置多久后执行某任务,当任务执行完后,取消计时的功能,Timer.cancle();TimerTask类为抽象类,实例化时,必须重写run方法;执行的内容,均在run方法中进行设置,并且执行时,已在子线程中进行执行。自定义View:用到的类有Paint、Canvas、Spec、SpecF、Path、View.MeasureSpec、Timer、TimerTask;
抽象类,通过子类继承,获取对象;在布局文件中绑定后,通过代码,设置自定义View的属性;自定义View中,通过重写OnMeasure方法,对布局文件中的尺寸进行测量,并由View中的setMeasureDimenson()方法,进行数据的保存;通过重写Ondraw方法,进行绘图;当需要绘制动态图形时,使用计时器Timer的schedule(TimerTask,long time,delay time2)方法,在time时间后,每隔time2时间,重写执行run方法中的内容;将耗时的操作设置在run方法中,并通过View中的invalidate()方法刷新主线程中的绘的图形,通过postInvalidate()刷新子线程中的图形。数据库:
常用的数据库有Oracle,需要安装和配置的大型收费数据库;MySQL是中型数据库,同样需要安装配置,但不需要收费;Sqlite是小型免费的嵌入式数据库,占用内存低,最新版本为3.0。Sqlite数据库需要通过SqliteDatabaseOpenHelper进行创建数据库,并通过SqliteDatabase进行数据库的操作。辅助类是抽象类,通过继承,重写两个方法,并在子类的构造方法中通过OpenHelper的构造方法(Context context,String SqlName,SqliteDatabase.CursorFactory factory,int version)进行数据库的创建,在onCreate方法中,进行数据库表的创建,在onUpdate中进行数据库的版本更新。在数据库的操作类中,执行exect方法,通过sql语句对数据库进行操作。Create table student(_id integer primary key auto increament ,name text);insert into student(_id,name)values(1,zx);delete from student where _id=1;update student set _id=2 where name=zx;select *from student;ListView、GridView适配器的优化:
将布局文件中的控件进行封装,当视图加载时,判断可变视图是否存在,当不存在时,通过布局文件获取视图,并新建封装类,将地址通过setTag()进行发送;当视图存在时,重复利用地址—getTag()。反射:
存储数据的方式:
共享数据库、数据库、文件、网络、内容提供者
广播:
广播传播时,需要接收者、发送者、广播频道;根据发送者的发送方式不同,分为有序广播、无序广播;有序广播为接收者有接收顺序,根据设置的优先级不同,确定先后顺序,接收者同时也是发送者,向后面的广播发送消息,发送过程中,可以添加信息,也可以停止广播的传输;无序广播,接收者之间无联系,均从发送者处接收信息;广播在传输过程中,不能被添加信息,也不可能被停止。广播在发送前,需要对接收者进行注册,注册方式有两种,动态注册、静态注册。动态注册,是在代码中进行,通过Context对象调用静态方法进行注册,所有的广播均可以用动态注册,其生命周期依赖于应用,相对于静态注册,比较节省内存;静态方法在清单文件中进行注册,部分系统广播不能通过静态注册进行,其生命周期依赖于系统,当系统启动,即运行接收广播,较耗内存。广播接收者需要继承BroadcastReceiver,并实现抽象方法onReceive(),通过回调接口,进行数据的传输。注意:广播发送前,必须进行接收者的注册,并且,当显示跳转时,不需要意图过滤器。安卓布局:九种布局
线性布局,水平或垂直方向两种格式,主要特点为权重,即规定各控件在视图中的占有的比例;
相对布局,相对于父控件或兄弟控件的布局,各控件需指定相对位置; 绝对布局,指定各控件在视图中的绝对位置,几乎不再使用; 表格布局,子布局放在行中,列由控件表示(TableRow); 帧布局:覆盖前面布局的布局,一般用于暂停按钮等; 风格布局:可以跨行、跨列的布局,占满换行;
左右侧滑:可以实现左右侧滑,通过设置主菜单和二级菜单设置左右两个菜单; 下拉刷新:设置下拉刷新、上拉加载的功能; 抽屉布局;
安卓版本及对应的API:
1.6—4;2—7;3—11;4—15;4.3—18;5—20;5.1—21;6—23;7—25; 安卓四层架构:
应用层:Java语言开发,主要从事App开发;
运行库层:Java语言与C语言,View视图、管理类等的开发; 架构层:C语言与Linux语言,各种框架、浏览器等; 内核层:Linux、C语言,开发各种驱动; 安卓四大组件:
Activity:界面,实现程序与用户之间的交换,有自己的生命周期,七个生命周期;4种启动模式 Service:
BroadcastReceive:三要素,发送者、接收者、发送频道(Intent);类型:有序(接收有序,有数据传送,可以拦截数据)、无序广播(相对);注册方式:静态注册,持久监听,占用内存比较高生命周期跟随系统,动态注册(代码中),所有广播都可以动态注册,部分系统广播不能动态注册,临时监听,占用内存较少,生命周期随应用进行;
ContentProvide:不能存放数据,五种存放数据方式之一,特点为:①为数据的获取等操作添加一个统一的接口②可以实现跨应用访问数据;③可以实现Android中通讯录、消息、音频、视频等的访问或操作;通过ContentReceive进行数据的访问,可以对数据进行增删改查操作。
动画: IO流: 序列化: AlertDialog:
Set实现类: 手机电量检测:
自定义SurfaceView:
自定义View:三个构造方法的区别
Message:Handler.obtain/new/Message.obtain
HttpUriConnection访问网络
gride 异步任务 动画
抽象类和接口 反射 克隆 序列化 侧滑的实现 数据库 Socket:
Gson解析
异步任务和子线程区别 WebView 版本更新 照片的圆角化
Collection与Collections Sql语句
MVP框架与MVC: TCP与UDP的区别: 一键分享的流程: Http协议的理解: 不使用框架访问网络: List集合与set集合: 自定义View的流程: 线性布局的特点: ViewPager的原理: 服务的启动方式:
Activity的启动方式: Xml数据解析: