【Android开发Wiki】进阶篇内容共享-Sharing Content从其他应用程序接收内容
【Android开发Wiki】进阶篇添加搜索功能-Adding Search Functionality(一):设置搜索界面
原文连接:/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 进行跨应用数据共享
利用 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之数据共享摘要: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是当前应用还是其它应用的,通过消息机制都可以进行通信,实现数据共享。
【Android开发Wiki】进阶篇声明访问权限(一)—开发可访问的应用程序
原文链接:/training/accessibility/accessible-app.htmlAndroid有几个可访问性焦点特性融入了平台,这些特性使你能够非常容易地优化你的应用应用程序,使之适应于那些在视力或肢体不方便的用户群。
但是,什么才是正确的、最优的,或者最简单的方法去利用这个框架去实现这个目标呢?有时候还不是那么显而易见的。
这节课将向你展示怎样去实现这样的策略和有助于使你的安卓应用程序具有更大可接入性的这么一些平台特性。
添加内容描述你的应用本该提供更多的引导方法而不仅仅只有触摸屏幕这一种方法。
很多android设备都有引导硬件而不是触摸屏,像十字键,方向键,轨迹球。
另外,后面版本也支持外部设备,比如以USB或蓝牙为媒介的键盘。
直观地验证你的应用在这些情形所产生效果。
最简单的方法是直接在安卓模拟器运行你的应用,使用模拟器上的方向键操作用户界面,用OK键代替触摸动作来选择UI控件。
触发辅助性事件测试你的应用一定要测试这个辅助性功能当你把它加入到你的应用中。
为了测试内容描述和辅助性事件,安装和使能一个辅助性服务。
一个选择是Talkback,它是安卓市场上一个免费的,开源屏幕阅读器。
启动服务后,在你的应用程序上测试所有的引导走向,然后听下所产生语音反馈。
并且,尝试使用方向控制器操作你的应用程序,而不仅仅是触摸屏幕。
你也可以使用其他有方向键或轨迹球的设备,如果它可以用的话。
如果不能用的话,使用安卓模拟器和它的模拟键盘控制器。
在该服务提供的反馈和方向盘操作你的应用时,你应该有一种感觉,你的应用程序可能被操作而没有任何视觉上的提示。
修改有问题区域当它们出现,然后你就会拥有可接入性很强的这么一个安卓应用程序。
文章来源:/page/Developing_Accessible_Applications。
【Android开发Wiki】进阶篇同步到云-Syncing to the Cloud(二):使用备份的API—Using the Backup API
原文链接:/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共享数据
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的一个辅助类。
【Android开发Wiki】进阶篇设计高效的应用导航—把它们放在一起:把APP例子用线框图圈起来
组合:为范例应用创建框架现在,我们对导航的模式和屏幕分组技术有了有深入地理解,是时候把它们组合起来并应用到我们的屏幕上了。
让我们再看一眼这个新闻应用范例的完整的屏幕地图。
下一步,我们要做的是从前文讨论过的导航模式中选择一种并应用到这个屏幕地图上,使用Anroid最佳实践方式,最大化导航速度,最小化触屏次数,同时保持接口的直观与统一。
我们也应该考虑不同设备的屏幕尺寸不一这个因素,做出相应的不同的选择。
为了简单起见,让我们专注于平板和手持制备(手机)。
-Choose Patterns选择模式选择模式-Choose首先,我们的第二层屏幕(故事分类列表,照片列表,以及保存的项目列表)可以使用标签(tabs)统一分组。
注意,我们并不一定需要使用水平排列的标签(tabs);在一些情况下,下拉列表UI元素可以作为合适的代替使用,特别是当设备的屏幕非常窄时,如一些手机。
我们也可以把,保存的图片列表,保存的故事列表组合起来,在手机用使用标签(tabs)显示,或是是平板上使用多个垂直的内容面板显示。
最后,让我们考虑一下怎么呈现新闻故事。
为了简化不同故事分类之就的导航,第一个可选方案是使用水平颁页,并在横向滑动面上使用一系列的标签(labels),指示当前可见的页面以及相临地可访问的分类。
在平板上,当水平显示时,我们可以多做一步,在屏幕左边添加一个面板显示水平可分页的故事列表,而故事视图则作为主要内容显示在屏幕右边。
下图展示了使用这种导航模式后手机以及平板上新的屏幕地图。
到目前为止,思考一下屏幕地图的变化是一个很好的主意,这样做是为了防止在实践中(当你草绘应用的屏幕布局时)你的选择不能很好的被应用。
下图是一个屏幕地图变化的范例,其展示的是在平板上并排地显示不同分类的故事列表,而故事视力则保持独立。
-Sketch and Wireframe素描和线框-Sketch素描和线框绘制线框图是你开始为你的屏幕布局时的第一步。
有创意地开始想象怎么样安排UI元素来允许用户在你的应用种进行导航。
【Android开发Wiki】进阶篇实施高效的应用导航—实现子代导航
原文链接:/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。
【Android开发Wiki】进阶篇包含多个APK(二):创建多个APKs为不同的屏幕尺寸
原文链接:/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。
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》需要操作的ContentProvider2》对ContentProvider中的什么数据进行操作Uri是一个通用资源标志符,将其分为A,B,C,D 4个部分:A:无法改变的标准前缀,包括;"content://"、"tel://"等。
android共享内存(ShareMemory)的实现
android共享内存(ShareMemory)的实现Android 几种进程通信方式跨进程通信要求把方法调用及其数据分解至操作系统可以识别的程度,并将其从本地进程和地址空间传输至远程进程和地址空间,然后在远程进程中重新组装并执行该调用。
然后,返回值将沿相反方向传输回来。
Android 为我们提供了以下几种进程通信机制(供开发者使用的进程通信 API)对应的文章链接如下:•文件•AIDL (基于 Binder)•Binder•Messenger (基于 Binder)•ContentProvider (基于 Binder)•Socket在上述通信机制的基础上,我们只需集中精力定义和实现 RPC 编程接口即可。
如何选择这几种通信方式这里再对比总结一下:•只有允许不同应用的客户端用 IPC 方式调用远程方法,并且想要在服务中处理多线程时,才有必要使用 AIDL•如果需要调用远程方法,但不需要处理并发 IPC,就应该通过实现一个Binder 创建接口•如果您想执行 IPC,但只是传递数据,不涉及方法调用,也不需要高并发,就使用 Messenger 来实现接口•如果需要处理一对多的进程间数据共享(主要是数据的 CRUD),就使用ContentProvider•如果要实现一对多的并发实时通信,就使用 Socketimage.pngIPC分析:android IPC的核心方式是binder,但是android binder的传输限制1M(被很多进程共享),在较大数据交换一般通过文件,但是效率很低,因此介绍下新的内存共享方式: ShareMemory具体实现:通过binder把MemoryFile的ParcelFileDescriptor 传到Service;在服务端通过ParcelFileDescriptor 读取共享内存数据;•客户端 LocalClient.java 通过MemoryFile获取ParcelFileDescriptor,通过Binder把ParcelFileDescriptor(int类型)传递到服务端•服务端 RemoteService 获取到ParcelFileDescriptor 之后,有两种方式第一种:通过FileInputStream 读取ParcelFileDescriptor 的FD,此种方式的问题在于,每次读取之后FD的游标都在文件最后(也就是说第二次读取结果是不低的,必须重置FD的游标) 第二种:就是通过反射,直接ParcelFileDescriptor构建MemoryFile,然后读取,此种方式问题在于26和27实现的不同,代码如下:Android P(9.0)反射限制: 上述反射的方式在android P上被限制(android 9.0禁止通过放射调用系统的的非公开方法),此路不同(If they cut off one head, two more shall take it's place... Hail Hydra.),还有千万条路•ShareMemory android O(8.0)之后增加新的共享内存方式,SharedMemory.java 此类继承Parcelable,可以作为IPC通讯传输的数据;•ClassLoader 多态:此方式并非真正的多态,而是根据ClassLoader类的加载顺序,在应用中构建一个和系统类同样包名的类(方法也同名,可以不做实现),编译时使用的应用中的类,运行时加载的是系统中的类,从而实现伪多态;GitHub:ShareMemory优点:binder 限制(binder的android上的限制1M,而且是被多个进程共享的); binder 在android进程中经过一次内存copy,内存共享通过mmap,0次copy效率更高;。
如何实现Android应用程序之间数据共享的
如何实现Android应用程序之间数据共享的一个应用程序可以将自己的数据完全暴露出去,外界更本看不到,也不用看到这个应用程序暴露的数据是如何存储的,或者是使用数据库还是使用文件,还是通过网上获得,这些一切都不重要,重要的是外界可以通过这一套标准及统一的接口和这个程序里的数据打交道,例如:添加(insert)、删除(delete)、查询(query)、修改(update),当然需要一定的权限才可以。
如何将应用程序的数据暴露出去? Android提供了ContentProvider,一个程序可以通过实现一个Content provider的抽象接口将自己的数据完全暴露出去,而且Content providers 是以类似数据库中表的方式将数据暴露。
Content providers存储和检索数据,通过它可以让所有的应用程序访问到,这也是应用程序之间唯一共享数据的方法。
要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据添加到一个已经存在的Content provider中,前提是有相同数据类型并且有写入Content provider的权限。
如何通过一套标准及统一的接口获取其他应用程序暴露的数据?Android提供了ContentResolver,外界的程序可以通过ContentResolver接口访问ContentProvider提供的数据。
当前篇主要说明,如何获取其它应用程序共享的数据,比如获取Android 手机电话薄中的信息。
什么是URI?在学习如何获取ContentResolver前,有个名词是必须了解的:URI。
URI是网络资源的定义,在Android中赋予其更广阔的含义,先看个例子,如下:将其分为A,B,C,D 4个部分:A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;B:URI的标识,它定义了是哪个Content Provider提供这些数据。
【Android开发Wiki】进阶篇提供布局的整体性能(一):优化布局层次结构
图2图一中嵌套使用LinearLayout布局的布局层次
图3点击一个层次节点,可以看到其所展现的样子
在图2中我们可以看到连接很多关系线(problems laying out,不是很确定,如果有高手请给指点一下)的文本框呈现三个层级。
点击各个控件可以显示进程的每一步时间花费情况(图3)。
通过这可以很清楚的了解到测试、布局、渲染所花费的时间,这也是我们需要花费时间优化的地方。
在这个布局里完成渲染列表控件所需要的时间为:
Measure:0.977ms
Layout:0.167ms
Draw: 2.717ms
修正你的布局
使用混合绘制的方法——使用混合绘制的方法将会比由一个ImageView和一个TextView组成的LinearLayout更加有效率。
组合根结构——如果一个FrameLayout是在布局的根目录下并且没有背景和填充时,可以被稍微更有效的组合标签所取代。
尽量少使用叶子节点——如果一个布局没有子节点或背景同样可以被移除(因为它不可见),从而变成更扁平更有效的布局层次。
尽量少使用双亲结点——一个有孩子节点而没有兄弟节点的布局不是ScrollView或根布局,并且也没有背景,可以被移除从而让其子节点直接指向双亲结点,从而变成更扁平更有效的结构层次。
深层布局——过多的嵌套布局会对程序性能产生坏的影响。
考虑使用RelativeLayout或GridLayout之类的扁平布局以提高程序性能。
默认最大深度为10。
文章来源:/page/Optimizing_Layout_Hierarchies。
【Android开发Wiki】进阶篇声明访问权限(二)—开发无障碍服务
如果你为这个服务创建一个新的工程的话,且不打算要一个应用程序,你可以把它启动活动
的类(通常叫做MainActivity.java)从你的源文件中删除。
同时也把相应的活动元素从你
的mainfest文件中删除。
配置自己的辅助性服务
如果你要使用XML路径,要在你的mainfest文件中指定它,在你的服务声明中添加<meta-data>标签,并指向这个XML资源文件。
假如你把你的XML文件存储在res/xml/serviceconf
ig.xml这个路径下,新的标签格式如下所示:
响应AccessibilityEvents事件
为更多的上下文查询视图层次结构
在那个视图中,寻找一个标签和一个复选框作的子视图。
如果找到,创建一个字符串来向用户报告,以表明这个标签是否被选择了。
如果遍历视图层次结构后返回null,则会退出该方法。
文章来源:/page/Developing_an_Accessibility_Service。
android jetpack sharing 用法
Jetpack Sharing 是Android Jetpack 组件库中的一部分,它提供了一组易于使用的API,用于在Android 应用中实现社交分享功能。
通过Jetpack Sharing,您可以轻松地将文本、图片、视频等内容分享到不同的社交媒体平台,如Facebook、Twitter、Instagram 等。
以下是使用Jetpack Sharing 实现Android 应用中的社交分享功能的一般步骤:1. 添加Jetpack Sharing 依赖项首先,您需要在您的Android 项目的`build.gradle` 文件中添加Jetpack Sharing 的依赖项。
在`dependencies` 部分中添加以下代码:```groovyimplementation 'androidx.sharing:sharing-common:1.0.0'implementation 'androidx.sharing:sharing-ui:1.0.0'```2. 配置Sharing Intent接下来,您需要创建一个`SharingIntent` 对象,并配置要分享的内容和目标平台。
您可以使用`ShareCompat.IntentBuilder` 类来构建`SharingIntent`。
例如,以下代码演示了如何分享一张图片到Facebook:```javaBitmap image = ... // 获取要分享的图片Intent sharingIntent = ShareCompat.IntentBuilder.from(this).setType("image/jpeg") // 设置分享文件的MIME 类型.setStream(image) // 设置要分享的图片流.setChooserTitle("分享到Facebook") // 设置选择器标题.build(); // 构建SharingIntent```3. 启动Sharing Intent最后,您可以使用`startActivity` 方法启动`SharingIntent`。
Android开发与实践第15章 ContentProvider实现数据共享
第15章 ContentProvider实现数据共享
Content Provider保存和获取数据并使其对所有应用程序可见。这是不 同应用程序间共享数据的唯一方式。在Android中,没有提供所有应用共同 访问的公共存储区域。本章将介绍如何使用预定义和自定义Content Provider。
15.1
Content Provider 概述
15.1.1 数据模型 15.1.2 URI的用法
15.1
Content Provider 概述
Content Provider内部如何保存数据由其设计者决定。但是所有的 Content Provider都实现一组通用的方法用来提供数据的增、删、改、查功 能。 客户端通常不会直接使用这些方法,大多数是通过ContentResolver对象实 现对Content Provider的操作。开发人员可以通过调用Activity或者其他应 用程序组件的实现类中,getContentResolver()方法来获得 ContentProvider对象,例如: ContentResolver cr = getContentResolver(); 使用ContentResolver提供的方法可以获得Content Provider中任何感兴趣 的数据。 当开始查询时,Android系统确认查询的目标Content Provider并确保它正 在运行。系统会初始化所有ContentProvider类的对象,开发人员不必完成 此类操作。实际上,开发人员根本不会直接使用ContentProvider类的对象。 通常,每个类型的ContentProvider仅有一个单独的实例。但是该实例能与 位于不同应用程序和进程的多个ContentResolver类对象通信。不同进程之 间的通信由ContentProvider类和ContentResolver类处理。
Android中的content(个人见解)
Android中的content(个⼈见解)Context是什么?1) Context是⼀个抽象类,其通⽤实现在ContextImpl类中。
2) Context:是⼀个访问application环境全局信息的接⼝,通过它可以访问application的资源和相关的类,其主要功能如下:启动Activity启动和停⽌Service发送⼴播消息(Intent)注册⼴播消息(Intent)接收者可以访问APK中各种资源(如Resources和AssetManager等)可以访问Package的相关信息APK的各种权限管理从以上分析可以看出,Context就是⼀个对APK包⽆所不知的⼤管家,⼤家需要什么,直接问它就可以了。
(这篇⽂章是我在csdn中的谋篇⽂章看到的,总结的不错)在上⾯我们看到了conntent的功能和作⽤下⾯就是我⾃⼰的⼀些理解context 在很多地⽅都会⽤到,⼊Dialog、RecyclerView的onCreateView⽅法中的 View view = Layout.from(parent.getcontent()).inflate. (yout.Recycle,parent,flase)和Intent intent = new Intent(context,NewsContentActivity.class)等这些⽅法都会⽤到content,1) 创建Application 对象时,⽽且整个App共⼀个Application对象2) 创建Service对象时3) 创建Activity对象时因此应⽤程序App共有的Context数⽬公式为:总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)那么我对contenx的理解是,⽤到context的地⽅都是要加载页⾯、xml这类,⽽这些页⾯都是Activity,要放到View中去的,⽽View的加载的底层本质都是LayoutInflater.from(this).inflate(resId,null)⽤的是这个⽅法,⽽Context是抽象类,Activity和Application为Context的间接⼦类,所以我就感觉其实context可以理解为想加载想要的页⾯所需要的⼀个框架,我们需要的是把想要出现的东西放到这个Context中(即是View),不同的View有不同的context,就像Intent的作⽤,可以从这个View1调转到另⼀个View2中,⽽View2是从View1跳转⽽来的,那⼀般我们是 Intent intent = new Intent(this(这⾥也可为context),View2.class),context.startActivity(intent);这⾥的this为这个类继承了Application或Activity,所以都有继承context,那什么时候要⽤到context呢?那通过这个例⼦我们可以这么理解context,⼀般要⽤到页⾯出现新的View的时候(如Dialog、新的Activity等)我们都要⽤到context那这个context⽤哪个好呢,⼀般都为想要在哪个View中弹出或跳转的那⼀个View的context(即弹窗前的⼀个界⾯Activity的context)因为View都是Activity,context是调⽤LayoutInflater.from(this).inflate(resId,null)的关键,是java代码到.xml页⾯布局的桥梁实现,其实也可以通过Context context = MainActivity.this;因为MainActivity继承Activity,⽽Activity继承Context,所以它也可以⽤来提供Activity Contex;或单独新建⼀类,获取当前活动的context对象public class MyApplication extends Application {private static Context context;@Overridepublic void onCreate() {super.onCreate();context = getApplicationContext();//获取应⽤上下⽂环境public static Context getContext() {return context;}}另外要在AndroidManifest.xml中声明Application的名字<applicationandroid:name=".MyApplication"使⽤时context对象,调⽤就可MyApplication.getContext();。
Android学习之基础知识十—内容提供器(ContentProvider)
Android学习之基础知识⼗—内容提供器(ContentProvider)⼀、跨程序共享数据——内容提供器简介 内容提供器(Content Provider)主要⽤于在不同的应⽤程序之间实现数据共享的功能,它提供了⼀套完整的机制,允许⼀个程序访问另⼀个程序中的数据,同时还能保证被访数据的安全性,⽬前,使⽤内容提供器是Android实现跨程序共享数据的标准⽅式。
不同于⽂件存储和SharedPreferences存储中的两种全局可读写操作模式,内容提供器可以选择只对哪⼀部分数据进⾏共享,从⽽保证我们程序中的隐私数据不会有泄漏的风险。
在正式学习内容提供器之前,我们还需要先掌握另外⼀个⾮常重要的知识——Android运⾏时权限,因为待会⼉的内容提供器⽰例中会使⽤到运⾏时权限的功能。
不光是内容提供器,开发过程中经常会⽤到运⾏时权限,因此必须牢牢掌握。
⼆、运⾏时权限 Android开发团队在Android6.0系统中引⽤了运⾏时权限这个功能,⽐之前的Android权限机制能更好的保护⽤户的安全和隐私。
2.1、Android权限机制详解 Android现在将所有的权限归成了两类:⼀类是普通权限,⼀类是危险权限。
普通权限是指那些不会直接威胁到⽤户的安全和隐私的权限,对于这部分权限申请,系统会⾃动帮我们进⾏授权,⽽不需要⽤户再去⼿动操作了,⽐如查看⽹络连接,开机⾃启等权限;危险权限则表⽰那些可能会触及⽤户隐私,或者对设备安全性造成影响的权限,如获取设备联系⼈信息、定位设备的地理位置等,对于这部分权限申请,必须要有⽤户⼿动点击授权才可以,否则程序就⽆法使⽤相应的功能。
虽然Android中⼀共有上百种权限,但是危险权限⼀共就只有9组24个,其他剩下的就都是普通权限。
下⾯是危险权限的列表:注意:表格中每个危险权限都是属于⼀个权限组,我们在进⾏运⾏时权限处理时使⽤的是权限名,但是⽤户⼀旦同意授权了,那么该权限所对应的权限组中所有的其他权限也会同时被授权。
android分享功能
android分享功能Android系统中的分享功能是指在应用程序中实现内容的分享给其他应用程序或者其他用户的功能。
这个功能使得用户可以方便地将照片、文本、链接等内容分享到社交媒体、邮件、短信等不同的平台上。
首先,Android系统中的分享功能具有很高的灵活性。
用户可以选择分享的对象、分享的方式以及分享的内容。
用户可以选择要分享给哪个应用程序,比如分享到社交媒体平台、邮件应用、短信应用等。
同时,用户还可以选择分享的方式,可以是链接、照片、文本等多种形式。
这使得用户可以根据自己的需求选择最合适的分享方式。
其次,Android系统中的分享功能也非常方便易用。
用户只需要点击分享按钮,在弹出的分享面板中选择要分享到的应用程序,即可将内容分享出去。
这种方式与其他应用程序的集成非常紧密,用户不需要退出当前应用程序再进入目标应用程序进行分享,节省了用户的时间和精力。
此外,Android系统中的分享功能还支持多种不同的应用程序和平台。
无论用户使用的是社交媒体平台、邮件应用、短信应用还是其他应用程序,都可以通过Android系统的分享功能进行分享。
这个功能可以很好地满足用户不同的分享需求,增加了系统的灵活性和适应性。
最后,Android系统中的分享功能还具有很高的安全性。
系统会自动对待分享的内容进行一定的检测和过滤,以确保分享的内容符合相关的安全规范和政策。
这样可以保护用户的隐私和安全,避免不必要的风险和问题。
总的来说,Android系统中的分享功能是一个非常实用和方便的功能。
它提供了多种多样的分享方式和选择,同时又具有很高的灵活性和易用性。
这个功能可以很好地满足用户不同的分享需求,同时也保障了用户的隐私和安全。
Android系统的分享功能给用户带来了很大的便利,使得用户能够更加轻松地与其他应用程序和用户进行内容的分享。
《Android应用开发》课件——第8章 使用内容提供者共享数据
主讲内容
第8章 使用内容提供者共享数据
8.3 访问内容提供者
主讲内容
Speech content
8.3 访问内容提供者
获取相应操作的Uri,Uri.parse()方法 是将字符串转化成Uri对象。
Uri uri = Uri.parse("content://cn.et5.mycontentprovider/person");
ContentResolver resolver = context.getContentResolver(); 获取ContentResolver对象
Cursor cursor = resolver.query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);
主讲内容
Speech content
8.1 内容提供者概述
ContentProvider
– 内容提供者(ContentProvider)是Android系统四大组件之一, 它是不同应用程序之间进行数据共享的标准API,通过 ContentResolver类可以访问ContentProvider中共享的数据。
主讲内容
第8章 使用内容提供者共享数据
8.4 内容观察者的使用
3. 与已经注册的Uri进行匹配
Uri uri = Uri.parse("content://" + “cn.et5.contentprovider" + "/people"); int match = matcher.match(uri); switch (match){
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
eoe 移动开发者社区
/
为了处理从 Intent 传过来的数据,可以通过调用 getIntent()方法来获取到 Intent 对象。 一旦获取该对象,就可以对里面的数据进行判断,从而决定下一步应该做什么。请记住, 如 果一个 activity 可以被其他的程序启动,你需要在检查 intent 的时候考虑这种情况。 1 void onCreate (Bundle savedInstanceState) { 2 ... 3 // Get intent, action and MIME type 4 Intent intent = getIntent(); 5 String action = intent.getAction(); 6 String type = intent.getType(); 7 8 if (Intent.ACTION_SEND.equals(action) && type != null) { 9 if ("text/plain".equals(type)) { 10 handleSendText(intent); // Handle text being sent 11 } else if (type.startsWith("image/")) { 12 handleSendImage(intent); // Handle single image being sent 13 } 14 } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) { 15 if (type.startsWith("image/")) { 16 handleSendMultipleImages(intent); // Handle multiple images being 17 sent 18 } 19 } else { 20 // Handle other intents, such as being started from the home screen 21 } 22 ... 23 } 24 25 void handleSendText(Intent intent) { 26 String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); 27 if (sharedText != null) { 28 // Update UI to reflect text being shared 29 } 30 } 31 32 void handleSendImage(Intent intent) { 33 Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); 34 if (imageUri != null) { 35 // Update UI to reflect image being shared 36 } 37 } 38 39 void handleSendMultipleImages(Intent intent) {
注意:更多关于 intent 和 intent filter 的信息,请参考 Intents and Intent Filters 当另外一个程序通过创建 intent 并传给 startActivity()以尝试分享一些东西时,你的程 序会被呈现在一个列表里面让用户进行选择。如果用户选择了你的程序,相应的 activity 就应该被调用开启(上面例子中的.ui.MyActivity), 这个时候就是你如何处理获取到的数据 的问题了。 处理接收到的数据
eoe 移动开发者社区
/
40 ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA 41 _STREAM); 42 if (imageUris != null) { 43 // Update UI to reflect multiple images being shared } }
eoe 移动开发者社区
ቤተ መጻሕፍቲ ባይዱ
/
原文链接:/training/sharing/receive.html
应用程序能够发送数据到其他程序,同样,也能够接收从其他程序发送过来的数据。需要考 虑的是用户与应用程序如何进行交互,你想要从其他程序接收哪些数据类型。例如,一个社 交网络程序会希望能够从其他程序接受文本数据,像一个有趣的网址链接。Google+ Andro id application 客户端会接受文本数据与单张或者多张图片。通过这个程序,用户可以很 方便地从 Gallery 程序选择一张图片来启动 Google+进行发布。 更新 Manifest 文件 Intent filters 通知 Android 系统一个程序会接受哪些数据。和 Send Content to Other Apps Using Intents 一课中用 ACTION_SEND 动作生成一个 intent 一样,可以通过在 manif est 文件中用 <intent-filter> 元素标签来定义 intent filters 以表明程序能够接收哪些 intent。下面是个例子,定义的 activity 分别指定了可以接收文本、单张图片或者多张图 片。 <activity android:name=".ui.MyActivity" > 1 <intent-filter> 2 <action android:name="android.intent.action.SEND" /> 3 <category android:name="android.intent.category.DEFAULT" /> 4 <data android:mimeType="image/* " /> 5 </intent-filter> 6 <intent-filter> 7 <action android:name="android.intent.action.SEND" /> 8 <category android:name="android.intent.category.DEFAULT" /> 9 <data android:mimeType="text/plain" /> 10 </intent-filter> 11 <intent-filter> 12 <action android:name="android.intent.action.SEND_MULTIPLE" /> 13 <category android:name="android.intent.category.DEFAULT" /> 14 <data android:mimeType="image/* " /> 15 </intent-filter> 16
文章来源:/page/Receiving_Content_from_Other_Apps
敬告: 因为你无法知道其他程序发送过来的数据内容是文本还是其他的数据, 例如设置错误 的 MIME 类型或者发送了过大的图片, 因此你需要避免在 UI 线程里面而是在单独的线程里去 处理那些获取到的二进制数据。 更新 UI 可以像更新 EditText 一样简单,也可以是比过滤出感兴趣的图片还复杂的操作。 因 此,接下来会发生什么事情最终要取决于你的程序。