【Android开发Wiki】进阶篇内容共享-Sharing Content从其他应用程序接收内容
- 格式:pdf
- 大小:99.28 KB
- 文档页数:3
原文连接:/training/search/setup.html从Android3.0开始,使用SearchView部件作为工具栏中的搜索部件,是您的应用程序的首选方式。
和工具栏中的所有项目一样,只要有有空间,你可以定义SearchView显示在任何时候,或作为一个可折叠的活动,显示为一个图标,当用户点击它时,最初的Search View将占据整个工具栏用来搜索字段。
注:在这个类中,您将学习如何使您的不支持SearchView应用程序向下兼容的设备到An droid 2.1(API 7级)。
向工具栏添加搜索视图要向工具栏添加一个的SearchView部件,可以在您的项目种创建一个名为res/menu/op tions_menu.xml文件,并添加下面的代码到该文件。
此代码定义了如何创建搜索项目,比如该项目要使用的图标和标题。
collapseActionView的属性可以让你的SearchView扩展到了整个工具栏,在不使用时又可以折叠回一个正常的工具栏项目。
由于手持设备的工具栏空间有限,建议您使用collapsibleActionView属性来获得更好的用户体验。
注:如果你已经有一个XML文件菜单项,你可以向该文件中添加<item>元素替代。
注:如果您的可搜索活动以单顶模式(android:launchMode="singleTop")启动的话,也可以在onNewIntent()方法中处理ACTION_SEARCH意图。
在单顶模式下,您的活动只有一个实例被创建,随后被调用来启动你的活动而不在栈上创建一个新的活动。
这种启动模式是非常有用的,用户可以从相同的活动执行搜索,而无需每次都创建一个新的活动。
文章来源:/page/Setting_Up_the_Search_Interface。
利用 ContentProvider 进行跨应用数据共享近年来,随着移动应用的快速发展,越来越多的用户在使用不同的应用程序进行各种操作。
然而,由于每个应用都有自己的数据存储机制,造成了数据孤岛的问题。
为了解决这一问题,Android 提供了ContentProvider 来实现应用间的数据共享。
本文将介绍如何利用ContentProvider 进行跨应用数据共享。
一、概述ContentProvider 是 Android 系统提供的一种机制,用于实现应用程序之间的数据共享。
它可以让其他应用程序获取和修改指定应用程序的数据。
ContentProvider 的实现通常包含以下几个重要组件:1. Authority(权限):是一个唯一标识,在跨应用通信时用于区分不同的 ContentProvider。
2. URI(统一资源标识符):用于唯一标识 ContentProvider 中的数据。
3. 数据操作方法:用于对数据进行增删改查等操作。
二、创建 ContentProvider要创建一个 ContentProvider,需要遵循以下步骤:1. 创建一个继承自 ContentProvider 的子类,并重写相关方法,如onCreate、query、insert 等。
2. 在 AndroidManifest.xml 文件中声明 ContentProvider,指定Authority 和对应的类名。
三、实现跨应用数据共享要实现跨应用数据共享,首先需要确保提供方(数据源应用)已经创建了 ContentProvider,并且在 AndroidManifest.xml 中声明了相应的权限和 URI。
接下来,使用获取 ContentResolver 的方式来访问 ContentProvider 提供的数据。
具体步骤如下:1. 获取 ContentResolver 实例:```ContentResolver resolver = getContentResolver();```2. 定义查询的 URI:```Uri uri = Uri.parse("content://authority/data");```3. 执行查询操作:```Cursor cursor = resolver.query(uri, null, null, null, null);```4. 处理查询结果:```if (cursor != null && cursor.moveToFirst()) {do {String data = cursor.getString(cursor.getColumnIndex("data"));// 处理数据} while (cursor.moveToNext());}```四、权限控制和数据访问为了保证数据的安全性,ContentProvider 还提供了权限控制和数据访问限制的机制。
浅析Android之数据共享摘要:Android是基于Linux开放性内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。
Android作为Google移动互联网战略的重要组成部分,将进一步推进“随时随地为每个人提供信息”这一企业目标的实现。
Google的目标是让移动通信不依赖于设备,甚至是平台。
出于这个目的,Android将完善而不是替代Google 长期以来推行的移动发展战略:通过与全球各地的手机制造商和移动运营商成为合作伙伴,开发既实用又有吸引力的移动服务,并推广这些产品。
关键词:保存方式数据共享文件1 Android数据共享数据是应用的核心,但是在Android中,每一个应用都运行在各自的进程中,当一个应用需要访问其他应用的数据时,也就是数据需要在不同的虚拟机之间传递,这样的情况操作起来可能有些困难——在正常情况下,不能读取其他应用的数据。
那么Android是如何实现应用程序之间数据共享的?一个应用程序可以通过一套标准及统一的接口将自己的数据暴露出去,而外界可以通过这一套标准及统一的接口和这个程序里的数据打交道。
2 通过Intent实现数据共享Android为了屏蔽进程的概念,利用不同的组件(Activity、Service)来表示进程之间的通信。
组件间通信的核心机制是Intent,通过Intent 可以开启一个Activity或Service,而不论这个Activity或Service是属于当前应用还是其它应用的。
Intent包含两部分。
2)隐式——需要在AndroidMainifest.xml中注册,一般用于跨进程通信。
new Intent(String action)有了Intent这种基于消息的进程内或进程间通信模型,我们就可以通过Intent去开启一个Service,也可以通过Intent跳转到另一个Activity,不论上面的Service或Activity是在当前进程还是其它进程内的,即不论Service或Activity是当前应用还是其它应用的,通过消息机制都可以进行通信,实现数据共享。
原文链接:/training/accessibility/accessible-app.htmlAndroid有几个可访问性焦点特性融入了平台,这些特性使你能够非常容易地优化你的应用应用程序,使之适应于那些在视力或肢体不方便的用户群。
但是,什么才是正确的、最优的,或者最简单的方法去利用这个框架去实现这个目标呢?有时候还不是那么显而易见的。
这节课将向你展示怎样去实现这样的策略和有助于使你的安卓应用程序具有更大可接入性的这么一些平台特性。
添加内容描述你的应用本该提供更多的引导方法而不仅仅只有触摸屏幕这一种方法。
很多android设备都有引导硬件而不是触摸屏,像十字键,方向键,轨迹球。
另外,后面版本也支持外部设备,比如以USB或蓝牙为媒介的键盘。
直观地验证你的应用在这些情形所产生效果。
最简单的方法是直接在安卓模拟器运行你的应用,使用模拟器上的方向键操作用户界面,用OK键代替触摸动作来选择UI控件。
触发辅助性事件测试你的应用一定要测试这个辅助性功能当你把它加入到你的应用中。
为了测试内容描述和辅助性事件,安装和使能一个辅助性服务。
一个选择是Talkback,它是安卓市场上一个免费的,开源屏幕阅读器。
启动服务后,在你的应用程序上测试所有的引导走向,然后听下所产生语音反馈。
并且,尝试使用方向控制器操作你的应用程序,而不仅仅是触摸屏幕。
你也可以使用其他有方向键或轨迹球的设备,如果它可以用的话。
如果不能用的话,使用安卓模拟器和它的模拟键盘控制器。
在该服务提供的反馈和方向盘操作你的应用时,你应该有一种感觉,你的应用程序可能被操作而没有任何视觉上的提示。
修改有问题区域当它们出现,然后你就会拥有可接入性很强的这么一个安卓应用程序。
文章来源:/page/Developing_Accessible_Applications。
原文链接:/training/cloudsync/backupapi.html当一个用户买了一个新设备,或是把他们已有的设备重设时,他人可能希望当Google Pla y在初始安装恢复设备上的应用的同时,也把与这些应用相关的数据恢复。
但默认情况下,用户在你应用中所有的设置和成就信息都会丢失。
但当数据量相对较小时(小于1M),比如用户的preference设定,笔记,游戏高分,或是其它数据,备份的API提供了一个轻量级的解决方法,这节课将帮你将备份API集成到你的应用程序中,然后用备份的API来在新设备中恢复数据。
注册Android备份服务这节课需要使用Android备份服务,这个服备需要被注册。
在此处点击注册。
一旦你完成了注册,该服务会预设一个XML标签,以便你插入Android的Manifest文件,如下示:请注意,每一个备份密钥只在指定的包名下有效,如果你有不同的应用,为每一个注册一个单独的密钥。
配制你的Manifest文件要使用Android备份服务,需要在你应用manifest文件里添加两个附加项。
首先,声明你完成备份行为的类的名字,然后把上面的代码片断加到Application的标签下。
假设你的备份代理被叫作TheBackupAgent,以下是一个例子:撰写你自己的备份代理创建备份代理最简单的方式莫过于继承封装类backupAgentHelper。
创建这个帮助类十分简单。
只要创建一个你在上一节manifest里声明的类来继承BackupAgentHelper。
然后重写onCreate()方法。
在onCreate()方法内部创建一个BackupHelper。
这些helper是专门用来备份某些数据的。
Android框架目前包括两种helper:FileBackupHelper和SharedPreferencesBackupH elper。
在你创建helper并把它指向你想备份的数据后,你只需要使用addHelper()方法来将helper加入到BackupAgentHelper,同时加入一个键值以便日后使用。
Android 使用ContentProvider共享数据当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。
虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。
而使用ContentProvider共享数据的好处是统一了数据访问方式。
当应用需要通过ContentProvider对外共享数据时,第一步需要继承ContentProvider并重写下面方法:Java代码:Java代码1publicclassPersonContentProviderextendsContentProvider{2publicbooleanonCreate()3publicUriinsert(Uriuri,ContentV aluesvalues)4publicintdelete(Uriuri,Stringselection,String[]selectionArgs)5publicintupdate(Uriuri,ContentV aluesvalues,Stringselection,String[]selectionArgs)6publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,Strings ortOrder)7publicStringgetType(Uriuri)}第二步需要在AndroidManifest.xml使用<provider>对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider ,ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:java代码:XML/HTML代码8<manifest>9<applicationandroid:icon="@drawable/icon"android:label="@string/app_name">10<providerandroid:name=".PersonContentProvider"android:authorities="cn.android.provid er.personprovider"/>11</application>12</manifest>注意:一旦应用继承了ContentProvider类,后面我们就会把这个应用称为ContentProviderjava代码:Java代码13publicclassPersonContentProviderextendsContentProvider{14//数据集的MIME类型字符串则应该以vnd.android.cursor.dir/开头15publicstaticfinalStringPERSONS_TYPE="vnd.android.cursor.dir/person";16//单一数据的MIME类型字符串应该以vnd.android.cursor.item/开头17publicstaticfinalStringPERSONS_ITEM_TYPE="vnd.android.cursor.item/person";18publicstaticfinalStringAUTHORITY="cn.android.provider.personprovider";//主机名19/*自定义匹配码*/20publicstaticfinalintPERSONS=1;21/*自定义匹配码*/22publicstaticfinalintPERSON=2;23publicstaticfinalUriPERSONS_URI=Uri.parse("content://"+AUTHORITY+"/person"); 2425/*这里UriMatcher是用来匹配Uri的类,使用match()方法匹配路径时返回匹配码*/ 26privatestaticfinalUriMatchersMatcher;27static{28sMatcher=newUriMatcher(UriMatcher.NO_MA TCH);//常量UriMatcher.NO_MA TCH表示不匹配任何路径的返回码29//如果match()方法匹配content://cn.android.provider.personprovider/person路径,返回匹配码为PERSONS30sMatcher.addURI(AUTHORITY,"person",PERSONS);31//如果match()方法匹配content://cn.android.provider.personprovider/person/230路径,返回匹配码为PERSON32sMatcher.addURI(AUTHORITY,"person/#",PERSON);33}34privateDatabaseHelperdatabaseHelper;35@Override36publicbooleanonCreate(){37databaseHelper=newDatabaseHelper(this.getContext());38returntrue;39}4041@Override42publicUriinsert(Uriuri,ContentV aluesvalues){43SQLiteDatabasedb=databaseHelper.getWritableDatabase();44if(sMatcher.match(uri)!=PERSONS){45thrownewIllegalArgumentException("UnknownURI"+uri);46}47longrowId=db.insert("person","personid",values);//往person表添加一条记录48db.close();49if(rowId>0){//如果添加成功50//ContentUris是contentURI的一个辅助类。
组合:为范例应用创建框架现在,我们对导航的模式和屏幕分组技术有了有深入地理解,是时候把它们组合起来并应用到我们的屏幕上了。
让我们再看一眼这个新闻应用范例的完整的屏幕地图。
下一步,我们要做的是从前文讨论过的导航模式中选择一种并应用到这个屏幕地图上,使用Anroid最佳实践方式,最大化导航速度,最小化触屏次数,同时保持接口的直观与统一。
我们也应该考虑不同设备的屏幕尺寸不一这个因素,做出相应的不同的选择。
为了简单起见,让我们专注于平板和手持制备(手机)。
-Choose Patterns选择模式选择模式-Choose首先,我们的第二层屏幕(故事分类列表,照片列表,以及保存的项目列表)可以使用标签(tabs)统一分组。
注意,我们并不一定需要使用水平排列的标签(tabs);在一些情况下,下拉列表UI元素可以作为合适的代替使用,特别是当设备的屏幕非常窄时,如一些手机。
我们也可以把,保存的图片列表,保存的故事列表组合起来,在手机用使用标签(tabs)显示,或是是平板上使用多个垂直的内容面板显示。
最后,让我们考虑一下怎么呈现新闻故事。
为了简化不同故事分类之就的导航,第一个可选方案是使用水平颁页,并在横向滑动面上使用一系列的标签(labels),指示当前可见的页面以及相临地可访问的分类。
在平板上,当水平显示时,我们可以多做一步,在屏幕左边添加一个面板显示水平可分页的故事列表,而故事视图则作为主要内容显示在屏幕右边。
下图展示了使用这种导航模式后手机以及平板上新的屏幕地图。
到目前为止,思考一下屏幕地图的变化是一个很好的主意,这样做是为了防止在实践中(当你草绘应用的屏幕布局时)你的选择不能很好的被应用。
下图是一个屏幕地图变化的范例,其展示的是在平板上并排地显示不同分类的故事列表,而故事视力则保持独立。
-Sketch and Wireframe素描和线框-Sketch素描和线框绘制线框图是你开始为你的屏幕布局时的第一步。
有创意地开始想象怎么样安排UI元素来允许用户在你的应用种进行导航。
原文链接:/training/implementing-navigation/descendant.htmlDescendant导航是导航下应用程序信息的层次结构。
关于这个的描述详见Designing Effe ctive Navigation和Android Design:Application Structure。
Descendant导航一般通过Intent对象和startActivity()方法或者通过FragmentTransaction对象在activity中添加fragment来实现。
本节课将讲述一些别的比较有意思的案例来实现Descendant导航。
通过手机或平板电脑来实现Master/Detail Flows在master/detail navigation flow中,一个master画面包含一个集合中的项目列表,de tail画面展示集合中不同项目对应的不同细节信息。
由master画面到detail页面的导航实现就是Descendant导航的一种实现方式。
手机触摸屏比较适合一次显示一屏画面(一个master画面或者一个detail画面);这个关系的讨论详见Planning for Multiple Touchscreen Sizes。
Descendant导航通常使用Int ent实现:Intent开始一个Detail画面activity。
另一方面是平板电脑显示,特别是横屏显示的时候,比较适合一次显示多个内容板块:左边显示master,右边显示detail。
如果是这种情况的话descendant导航的实现通常是使用FragmentTransaction(添加、删除、替换)。
这种模式比较基础的实现详见Implementing Adaptive UI Flows(Designing for Multiple Screens class)。
这个类描述了在手机上用两个activity、在平板电脑上用一个activity来实现master/detail flow。
原文链接:/training/multipleapks/screensize.html在我们利用多重的APKs在Google Play中开发android应用时,很重要的一点就是在一开始就要采取好的方法,以避免在进一步开发过程中遇到不必要的麻烦。
这节课将会告诉你如何在你的涵盖不同类别的屏幕尺寸的应用中创建多重的APKs。
你也将会获得一些工具,这些工具能让你更容易的维护多重的APK代码库。
确认你需要多重的APKs当你试图创建一个能够在多个不同尺寸的android设备上运行的应用程序时,当然,你希望你的应用程序既能够充分利用较大屏幕尺寸设备的所有空间,又不至于在较小屏幕尺寸设备上牺牲兼容性和易用性。
从一开始看来多重的APK支持就是最好的解决方案,但情况往往不是这样。
多重APK开发者指南的Using Single APK Instead部分包含了一些有用信息,关于如何用单个的APK做到这一点,包括利用我们的支持文库。
你也可以阅读本指南以实现多屏幕支持,你甚至可以用android SDK下载我们的支持文库,它可以让你使用蜂窝设备的片段(使单一APK支持多屏幕尺寸更容易)。
如果你能够做的好,那么仅包含一个单一的APK的应用程序会有以下几个优点:∙出版和测试更容易∙只需要维持一个代码库∙应用程序可以适应设备配置的变化∙跨设备的应用程序恢复工作∙无需担心市场的偏好,APK的“升级”行为,以及APK在何种类别的设备上运行假设你现在已经研究了这一节课的主题,而且还相当好学的吸收掌握了链接中的资源素材,并确定多重的APKs是你的应用程序的正确选择。
把你的需求列成图表开始你需要创建一个图表以快速的确定你需要多少的APK,以及每一个APK所囊括的屏幕尺寸。
这种图表能够很容易快速、轻松的绘制出你要的需求,并在以后作为你的参考。
我们可以以代表Android平台上可供选择的不同屏幕尺寸的一行单元格作为开始。
现在你可以给这个图表涂上色,每一种颜色代表一个APK。
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》需要操作的ContentProvider2》对ContentProvider中的什么数据进行操作Uri是一个通用资源标志符,将其分为A,B,C,D 4个部分:A:无法改变的标准前缀,包括;"content://"、"tel://"等。