Android笔记
- 格式:docx
- 大小:19.70 KB
- 文档页数:2
01、什么是3G02、android系统简介03、android背景介绍04、android的framewor简介05、两种虚拟机的比较06、sdk的下载以及简介07、创建android模拟器08、ddms简介09、platform-tools的简介及常见adb指令10、android项目的目录结构11、android下apk安装的过程12、常见的adb指令介绍13、创建模拟器遇到的常见错误14、电话拨号器15、点击事件的四种写法16、短信发送器17、相对布局&单位介绍18、现形布局&布局的组合19、表格布局&绝对布局20、帧布局21、测试相关概念22、android下junit测试框架配置23、logcat简介24、保存文件到手机内存25、android下文件访问的权限26、保存文件到SD卡中27、分析setting源代码获取SD卡大小28、_sharePreference入门29、xml文件的序列化30、采用pull解析xml文件31、采用断电调试的方法观察pull解析的的流程32、android下创建一个sqllite数据库33、sql语句实现数据库的增删改查34、系统api实现数据库的增删改查&Sqlite3工具的使用35、数据库的事物36、listView入门37、采用layoutInflater打气筒创建一个view对象38、采用数据适配器ArryAdapter39、常用数据适配器simpleAdapter40、数据适配器总结41、内容提供者简介42、内容提供者的实现43、短信的备份44、插入一条记录到系统短信应用45、内容观察者46、获取系统的联系人信息47、保存联系人到系统通讯录48、读取联系人的一个小细节49、网络图片查看器50、anr产生的原理&如何避免51、android消息机制入门52、网络html查看器53、字符乱码问题的处理54、采用get方式提交数据到服务器55、采用post方式提交数据到服务器56、提交数据到服务器中文乱码问题的处理57、采用httpclient提交数据到服务器58、异步http框架简介&实现原理59、异步http框架提交数据到服务器60、上传文件到服务器61、smartimageview&常见开源代码62、多线程下载的原理63、多线程断点下载的原理64、多线程java代码移植到android65、多线程下载文本页面的更新66、显示意图激活另一个activity67、隐式意图激活另一个activity68、隐式意图的配置69、隐式意图和显示意图的使用场景70、在不同activity之间数据传递71、activity的声明周期72、activity的启动模式73、activity横竖屏切换的声明周期74、开启新的activity获取他的返回值75、请求码和结果码的作用76、利用广播实现ip拨号77、短信窃听器78、自定义广播时间&发送自定义广播&广播接受者优先级79、采用服务执行长期后台操作80、采用服务窃听电话&服务的声明周期81、android进程优先级&为什么使用服务82、绑定方式开启服务&调用服务的方法83、服务的声明周期(混合开启84、采用aidl绑定远程服务85、代码注册广播接受者&利用广播调用服务的办法86、加载大图片到内存87、获取图片exif信息88、从gallery获取图片89、图片画画板90、扒开美女衣服91、图片的缩放92、图片的旋转93、图片的平移&镜面&倒影效果94、图片的合成95、图片的颜色处理96、多媒体播放api简介97、人脸识别98、mediaplayer的生命周期99、soundpoo简介100、sufaceview的生命周期101、播放在线视频102、视频播放器进度的处理103、调用系统照相机拍照和录像104、采用camera拍照105、常见对话框106、notification入门107、菜单108、android下的样式109、android下的主题110、代码编写ui111、html创建ui112、帧动画113、代码创建创建的tween动画114、xml文件定义动画115、传感器简介116、117、杀死进程118、apk的安装119、应用程序的反编译120、动态创建fragment121、用fragment创建一个选项卡122、fragment的向下兼容性123、fragment的生命周期124、fragment之间的通讯125、应用程序国际化04、android的framewor简介Wap:wait and playWireless Makeup Language(WML)精简的html语言Applications:android自带的基本上层应用Aplication framework:应用程序框架Librarics:Linux lernel:05、两种虚拟机的比较编译后文件格式:jvm:.java->.class->.jardalvik vm:.java->.dex->.odex基于的架构:jvm:基于栈的架构dalvik vm:基于寄存器的架构Cpu直接访问寄存器因此dalvik虚拟机的效率比jvm高06、sdk的下载以及简介->获取sdk工具包(sdk:standard develope kits)->ADT(android develop tools,实际上是eclipse的插件)SDK具体内容Android->SDK Plateform:开发时使用到的jar包->Samples for sdk:->ARM EABI V7a System Image:模拟器运行时的镜像->Intel n86 Aton System:模拟器运行时的镜像->MIPS System Image:模拟器运行时的镜像->google APIs:google提供的jar包,可以直接使用google提供的一些API ->source for android SDK:SDK全部的源代码Extrals:->tools:开发的工具->support library:实现高版本的android向下的兼容->google Admed Ads SDK:gongle提供的广告插件->Analyties App Irackiong SDK:应用的用户分析->cloud message:云消息->gongle play service:收费服务->google USB Driver:真实的设备驱动开发时:基于4.0,兼容2.2、2.3.307、创建android模拟器avd:android virture developerVGA:480*640(电视的标准分辨率)QVGA:240*320(四分之一)HVGA:320*480(一半)WVGA:480*800(width)FWVGA:480*854(更宽)08、ddms简介ddms:模拟器不支持中文,因此发送中文会显示不出来09、platform-tools的简介及常见adb指令Android调试桥:内部实现就是socket让两个系统之间实现数据交互->reset adb:模拟器找不到时候可以重启->adb device:列出所有的连接的设备->adb kill-server:杀死adb调试桥->adb start-server 启动adb调试桥dx.bat:将.class文件打包10、android项目的目录结构一:SDK的目录结构->Samples->Api demo:根据API demo(模拟器上面可以看见)的效果可以在sample中看见相应的代码->Source:jar包所有的sdk源代码都在这个文件夹里->SystemImage:系统镜像->temp:下载更新临时存储的文件夹,一般是空的->tools:emulater.ext 不同版本的模拟器二:New Android Application->theme:留给以后作为扩展,现在并没有太大的作用->target SDK:一般选择高版本,因为高版本对下兼容->mark project as a library:一般不选择,意思是将这个项目提供一个jar包供别人使用三:文件夹目录.setting:设置目录assets:资产目录,存放一些文件,这些文件会被原封不动打包到应用程序的apk中bin:gen:自动生成的目录->builderConfig.java:生成的配置信息->R.java:Android 4.1.2->android.jar开发环境,jar包可以在properties中修改,jar包就是SDK011、Android下apk的安装过程一、Android安装过程分析:->setContentView:甚至view的对象,把里面的xml文件加载到->在project中选择build automaticly会自动把文件生成字节码文件,.class $代表的class文件生成的是内部类->dex.bat文件会把.class文件生成.dex文件->apk压缩文件解压内部内容->META-INF:应用程序的签名eclipse的调试签名文件->res:资源文件->classes.dex:class文件->resources.arsc:资源ID映射->android软件安装的过程:->拷贝xxx.apk带/data/app/xxx-1.apk->在/data/data目录下创建一个文件夹,文件夹名称当前应用程序的报名012、常见adb指令前提:->设备连接上电脑而且驱动安装正常,如果安装不正常的话,会有黄色的问号显示;->设备上打开USB调试;指令:->adb device(如果启动发现这个程序没有安装会自动安装)->adb kill-server->adb start-server->adb uninstall <包名>->adb -s emulator-5554 install c:\\users\\administrator\\hello.apk如果有多个设备的话,如果不指定安装的是哪个设备程序会报错->adb push haha.prop /sdcard/haha.txt 将文件移到(360管家,豌豆荚之类的软件他们也是用的adb指令,倘若电脑上装这些软件的话,会因为两个adb指令抢端口号而挂掉)(adb版本之间兼容不是很好,经常报错可以考虑下版本的问题)->adb shell:远程连接到了android的linux终端ls:显示文件夹ps:显示正在运行的程序ping:网络连通性013、创建模拟器遇到的常见错误->路径最好不要有中文:->应用安装不上,或者安装模拟器的时候开启一个新的模拟器:可能是模拟器的资源被占用,模拟器在运行的时候其实占用着硬盘上面的一个文件,这个文件位于工作空间.android/avd/iphone.avd 里面会有镜像文件,当一个模拟器开启起来了,就给你创建一个文件夹.knock的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。
Android.bp学习笔记1.Android.bp简介Android 7.0之后希望⽤Android.bp替换Android.mk,bp简单的配置更⽅便Ninja ⽂件的产⽣,⽽Blueprint和Soong 就此产⽣。
Android 利⽤Blueprint和Soong 来解析bp⽂件,经过最终转换为ninja files。
Blueprint和Soong都是由Golang写的项⽬。
从Android Nougat开始,prebuilts/go/ ⽬录下新增了Golang所需的运⾏环境,在编译时使⽤。
Android.bp以及相关⽀持,从Android Nougat开始加⼊,从Android Oreo(8.0)开始默认开启。
如果需要在Android Nougat的版本使⽤,需要在执⾏编译时添加变量: make 'USE_SOONG=true' Soong是以前Android基于make的编译系统的替代品。
它以Android.bp⽂件替代Android.mk,Android.bp⽂件⽤类似JSON的简洁声明来描述需要构建的模块。
2.例⼦1cc_binary { //编译成可执⾏⽂件,cc_library_shared编译成动态库name: "bt_test", //编译出的可执⾏⽂件的名字为bt_testvendor: true, //编译出来放在/vendor⽬录下(默认是放在/system⽬录下)srcs: ["bt_test.cpp"], //源⽂件,格式["a.cpp", "b.cpp"]cflags: ["-Wall","-Werror","-Wno-unused-parameter",], //编译flaginclude_dirs: ["hardware/interfaces/halnode/1.0/default", //⽤户值定的头⽂件查找路径],shared_libs: [ //编译依赖的动态库"liblog","libutils","libhidltransport","android.hardware.halnode@1.0","libhidlbase","libbase",],}2.其它可⽤选项subdirs = ["ndk"] //指定进⼊下层ndk⽬录进⾏编译export_include_dirs: [ //从其他模块添加头⽂件检索路径 "include", "include/camera" ],export_shared_lib_headers: ["libcamera_metadata"],local_include_dirs: ["aidl"], //如果从当前⽬录添加路径时使⽤,将./aidl⽬录加⼊头⽂件的搜索路径static_libs: ["libupdater"], //指定对库libupdater进⾏静态链接 static_executable: true,4.官⽅最全解释5.变量Android.bp⽂件可包含顶级变量赋值:test_srcs = ["src/test.c"],cc_binary {name: "test",srcs: test_srcs,}变量范围限定为声明它们的⽂件的其余部分,以及任何⼦蓝图⽂件。
第一行代码知识点总结1、Android四层架构:Linux内核层(提供底层驱动)、系统运行库层(提供特性支持,一些核心库)、应用框架层(提供各种API)和应用层2、Android四大组件:活动(activity)、服务(Service)、广播接收器(Broadcast Receiver)和内容提供器(Content Provider)3、Android应用特色开发:四大组件、丰富的系统控件、SQL数据库(轻量级,运算速度快的嵌入式关系型数据库)、强大的多媒体和地理位置定位(LBS)。
4、Android程序设计讲究逻辑和视图分离,通常在布局文件中编写在界面4.1Android的日志工具Log:Log.d()打印调试信息对应debug。
Log.v()打印琐碎、意义最小日志,对应verbose,Log.i()打印比较重要的数据对应info;Log.w()打印警告信息对应error;Log.e()打印错误信息对应error。
Log.d(类名,打印内容)4.2活动:主要用于和用户进行交互、基本用法4.3活动中的提醒方式Toast4.4、drawable存放图片,mipmap存放应用图标,values放字符串、样式,颜色等配置,layout放布局文件4.5、Android Studio是采用Gradle来构建项目5、Intent的使用:显式Intent和隐式Intent()6、活动的生命周期7、返回栈的定义8、Android是使用任务来管理活动的9、活动状态:运行、暂停、停止、销毁状态10、Activity类中的七个回调方法:onCreate()onStaart()、onResume()、onPause()、onStop()、onDestroy()和onRestart()11、活动的三种生存期:完整、可见、前台12、活动的四种启动模式:standard、singleTop、singleTask 和singleInstance13、常用控件:TextView、Button、EditText、ImageView、ProgressBar(进度条)、AlertDialog(对话框)、ProgressDialog (显示对话框时出现进度条)14、基本布局:线性布局(LinearLayout)、相对布局(RelativeLayout)、帧布局(FrameLayout)百分比布局、AbsoluteLayout、TableLayout15、常用和最难用的控件ListView16、滚动控件:RecyclerView17、碎片的定义、使用方式、碎片的生命周期、状态和回调18、广播主要的两种类型:标准广播和有序广播;注册广播的方式:静态注册和动态注册;广播接收器继承BroadcastReceiver19、本地广播(LocalBroadcastManager)20、Android系统中三种数据持久化方式:文件储存、SharedPreference储存及数据库储存,还有保存在手机SD卡中21、SQliteOpenHelper帮助类:SQliteOpenHelper中有两个抽象方法onCreate()和onUpgrade();两种重要的实例方法getReadableDatabase()和getWritableDatabase()22、LitePal操作数据库23、跨程序共享数据:内容提供器24、ContentResolver的基本用法:ContentResolver类、ContentResolver中提供给了一系列的方法用于对数据进行CRUD操作包括增删改查操作;ContentResolver增删改查方法不接收表名参数,而是用Uri参数代替。
Android开发⾃学笔记(AndroidStudio)—4.1布局组件⼀、引⾔Android的界⾯是有布局和组件协同完成的,布局好⽐是建筑⾥的框架,⽽组件则相当于建筑⾥的砖⽡。
组件按照布局的要求依次排列,就组成了⽤户所看见的界⾯。
在Android4.0之前,我们通常说Android开发五⼤布局和四⼤组件,这五⼤布局就是:1. LinearLayout 线性布局2. FrameLayout 单帧布局,也有中⽂翻译为帧布局、框架布局。
3. RelativeLayout 相对布局4. AbsoluteLayout 绝对布局5. TableLayout 表格布局⽽在Android4.0之后⼜新增了⼀种GridLayout⽹格布局。
⼆、LinearLayout线性布局线性布局是Android开发中最常见的⼀种布局⽅式,它是按照垂直或者⽔平⽅向来布局,通过“android:orientation”属性可以设置线性布局的⽅向。
属性值有垂直(vertical)和⽔平(horizontal)两种。
线性布局的排列在某⾏或者某列并不会⾃动换⾏或换列,就是说如果采⽤⽔平布局,控件宽度超过屏幕显⽰的话,后⾯的控件都将被隐藏,不会⾃动换⾏。
常⽤的属性有:1. android:orientation:可以设置布局的⽅向2. android:id - 为控件指定相应的ID3. android:text - 指定控件当中显⽰的⽂字,需要注意的是,这⾥尽量使⽤string.xml4. android:gravity - 指定控件的基本位置,⽐如说居中,居右等位置5. android:textSize - 指定控件当中字体的⼤⼩6. android:background - 指定控件所⽤的背景⾊,RGB命名法7. android:layout_width - 指定控件的宽度8. android:layout_height - 指定控件的⾼度9. android:layout_weight - 指定控件的占⽤⽐例10. android:padding - 指定控件的内边距,也就是说控件当中的内容11. android:sigleLine - 如果设置为真的话,则将控件的内容显⽰在⼀⾏当中layout_weight属性以控制各个控件在布局中的相对⼤⼩。
android移动应用开发技术课第一章笔记第一章:Android移动应用开发技术课笔记一、引言在当今移动互联网时代,Android系统以其开放性和普及率成为了最受欢迎的移动操作系统之一。
随着移动应用市场的不断扩大,对Android移动应用开发技术的需求也日益增加。
学习和掌握Android移动应用开发技术成为了越来越多人的选择。
二、Android移动应用开发技术概述1. 什么是Android?Android是一款基于Linux操作系统的开源移动设备操作系统,主要用于触摸屏移动设备,如智能手机和平板电脑。
Android操作系统的开放性使得开发者可以自由定制和开发应用,受到了广大用户的喜爱。
2. Android移动应用开发技术的重要性随着信息化和数字化的发展,移动应用成为了人们获取信息和进行交流的重要方式。
而Android作为最主流的移动操作系统之一,其应用的开发和推广具有巨大的市场潜力和商业价值。
掌握Android移动应用开发技术成为了许多开发者和从业者的追求目标。
三、学习Android移动应用开发技术的重要性1. 对于个人的意义学习Android移动应用开发技术可以提升个人的职业技能,并且在移动应用开发领域有更多的发展机会。
可以通过开发自己的应用来实现个人价值和创造财富。
2. 对于企业的意义随着移动互联网的发展,各类企业都希望拥有自己的移动应用,以提升品牌形象和服务用户。
懂得Android移动应用开发技术的人才对企业来说显得格外宝贵。
四、学习Android移动应用开发技术的途径1. 自学通过阅读相关书籍、网上教程和参加线上培训班,可以自学Android 移动应用开发技术。
这种方式需要具备较好的自学能力和毅力。
2. 参加培训班选择权威的培训机构进行系统的学习和培训,可以更快速、系统地学习Android移动应用开发技术。
五、Android移动应用开发技术的未来发展随着人工智能、物联网、区块链等技术的不断发展,Android移动应用开发技术也将不断拓展应用场景和技术深度。
AndroidMPermission运⾏时权限学习笔记Android M Permission 运⾏时权限学习笔记从Android 6.0开始, ⽤户需要在运⾏时请求权限, 本⽂对运⾏时权限的申请和处理进⾏介绍, 并讨论了使⽤运⾏时权限时新⽼版本的⼀些处理. Android应⽤权限简要介绍⼀个Android应⽤默认情况下是不拥有任何权限的, 这即是说, 在默认情况下, ⼀个应⽤是没有权利去进⾏⼀些可能会造成不好影响的操作的. 这些不好的影响可能是对其它应⽤,操作系统,或者是⽤户.如果应⽤需要⼀些额外的能⼒,则它需要在AndroidManifest.xml中静态地声明相应的权限.如果应⽤没有在manifest中声明权限, 却使⽤了相应的功能, 在调⽤到相应功能的时候, 将会抛出异常.⽐如程序要发送⼀个请求,却忘记加Internet权限, 那么在发送这个请求的时候程序就会抛出异常,⼀般不会catch这个异常,所以程序直接就崩溃了: Caused by: ng.SecurityException: Permission denied (missing INTERNET permission?)在Android 6.0 (API 23)发布之前, 所有的权限都在安装应⽤的时候显⽰给⽤户,⽤户选择安装则表⽰全部接受这些权限, 之后⽆法撤销对这些权限的授权. Android 6.0开始, ⼀部分⽐较危险的权限需要在程序运⾏时显式弹框,请求⽤户授权.⾄于什么时候弹这个框,由应⽤程序⾃⼰决定.对于其他权限,认为不是很危险,所以仍然保持原来的做法,在⽤户安装应⽤程序时就予以授权.还需要注意的是,在设置中,对于应⽤的危险权限,⽤户可以选择性地进⾏授权或者关闭.Permission的保护等级permission的保护等级通过protectionLevel属性设置, 共有4种: normal,dangerous,signature,signatureOrSystem.具体可以参见介绍:签名相关的⽐较不常⽤, 剩下的两种是normal和dangerous.Guides⾥⾯对这两种类型进⾏了讨论: 官⽹Guides:总结下来就是: 所有的权限仍然在manifest中静态声明, normal权限的在安装的时候⾃动授权, ⽽dangerous的权限需要应⽤明确地请求⽤户授权.当然对于Android 6.0以下的⼿机,或者以前开发的旧应⽤来说, dangerous权限也是安装时授权的, 具体看下⼀节的讨论.Dangerous Permissions:Table 1. Dangerous permissions and permission groups.Permission Group Permissions想要查看所有dangerous的权限, 也可以⽤命令:adb shell pm list permissions -g -d⼿机版本和程序版本的不同处理这⾥引⽤⼀段Guides⾥⾯的原⽂:If the device is running Android 6.0 (API level 23) or higher, and the app's is 23 or higher, the app requests permissions from the user at run-time.The user can revoke the permissions at any time, so the app needs to check whether it has the permissions every time it runs. For moreinformation about requesting permissions in your app, see the training guide.If the device is running Android 5.1 (API level 22) or lower, or the app's is 22 or lower, the system asks the user to grant the permissions when the user installs the app. If you add a new permission to an updated version of the app, the system asks the user to grant that permission when the user updates the app. Once the user installs the app, the only way they can revoke the permission is by uninstalling the app.这⾥头要注意and和or的使⽤,说明了只有满⾜targetSdkVersion和实际使⽤设备的版本都在23及以上的时候,才会采⽤新的动态权限机制. 其他情况, 跟之前⼀样, 在安装和升级应⽤的时候就授权了所有的权限.可以总结为:1.所有的权限都在manifest中声明.2.如果(1)你的app的targetSdkVersion是23及以上,并且(2)app运⾏在Android 6.0及以上的设备,危险权限必须动态请求.当权限被拒绝,app理应还是能够使⽤的,只不过权限相关的部分功能不能⽤.3.上⼀条中的两个条件(1)(2)没有同时满⾜,即属于其他情况, 所有权限在安装时请求,如果⽤户不接受,则不安装.特别注意这种情况: 旧应⽤新系统.如果targetSdkVersion⼩于23,即被认为是Android 6.0发布之前开发的应⽤, 还没有兼容6.0.这种应⽤即便是被装在Android 6.0的机器上,也是采⽤原来的安装即授予权限逻辑, 所有权限在应⽤安装时全部被授权.在Android 6.0的设备上安装targetSdkVersion⼩于23的应⽤之后, 可以在应⽤的设置中查看,发现所有的dangerous权限状态都是打开.所以不⽤担⼼⽼的应⽤在Android 6.0上会各种乱崩.但是⽤户仍然可以在系统设置中禁⽤权限:在模拟器上点击授权开关的时候弹出了以下提⽰:如果⽤户执意要取消授权, 应⽤虽然不会直接崩溃,但是功能变为默默⽆作为状态, 返回值可能变为null或者0,进⽽引起⽆法预料的⾏为或者崩溃.为什么要及时升级targetSdkVersion这是因为每⼀个版本的API有可能会产⽣新的权限,这些新增的权限, 对于targetSdkVersion⽐该API低的应⽤是⾃动获取的.所以targetSdkVersion最好是能及时写到最新,这样避免应⽤⾃动获取到新API新增的权限.结论: 对targetSdkVersion还不存在的权限是⾃动获取到的.可以参见: API Guides:其中”Automatic permission adjustments”那段.Permission group所有的权限都有⾃⼰的permission group.系统弹框请求某⼀个permission时也是只说明了它的类别,当⽤户同意,系统会给予它该条permission.(只有这⼀条).但是如果app已经有了该group下的另⼀条permission,系统将会⾃动授予权限(也即请求权限的callback直接返回),这过程中不与⽤户交互.动态权限请求的实现原⽂:因为权限动态检查相关的API是Android 6.0才加⼊的, 所以minSdkVersion不是23时,推荐使⽤SupportLibrary来实现,好处是: 程序⾥不必加if来判断当前设备的版本.1.检查权限状态如果执⾏的操作需要⼀个dangerous permission, 那么每次在执⾏操作的地⽅都必须check你是否有这个permission, 因为⽤户可以在应⽤设置⾥随意地更改授权情况, 所以必须每次在使⽤前都检查是否有权限.检查权限的⽅法: 两个参数分别是Context和权限名.返回值是: if you have the permission, or if not.⽐如:if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)) { //has permission, do operation directlyContactsUtils.readPhoneContacts(this);Log.i(DEBUG_TAG, "user has the permission already!");} else {//do not have permission2.动态请求权限如果上⾯权限检查的结果是DENIED, 那么就需要显式地向⽤户请求这个权限了.Android提供了⼏个⽅法来动态请求权限, 调⽤这些⽅法会显⽰出⼀个标准的Dialog, 这个Dialog⽬前是不能被定制的.2.1有时候可能需要解释为什么需要这个权限有时候你可能会需要跟⽤户解释⼀下权限的⽤途.注意不是每条权限都需要解释,显⽽易见的那种可以不解释,太多的解释会降低⽤户体验.⼀种⽅式是,当⽤户拒绝过这个权限,但是⼜⽤到了这个功能, 那么很可能⽤户不是很明⽩为什么app需要这个权限, 这时候就可以先向⽤户解释⼀下.为了发现这种⽤户可能需要解释的情形, Android提供了⼀个⼯具类⽅法:如果app之前请求过该权限,被⽤户拒绝, 这个⽅法就会返回true.如果⽤户之前拒绝权限的时候勾选了对话框中”Don’t ask again”的选项,那么这个⽅法会返回false.如果设备策略禁⽌应⽤拥有这条权限, 这个⽅法也返回false.注意具体解释原因的这个dialog需要⾃⼰实现, 系统没有提供.2.2请求权限请求权限的⽅法是: 传⼊⼀个Activity, ⼀个permission名字的数组, 和⼀个整型的request code.这个⽅法是异步的,它会⽴即返回, 当⽤户和dialog交互完成之后,系统会调⽤回调⽅法,传回⽤户的选择结果和对应的request code.代码:if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)) { //has permission, do operation directlyContactsUtils.readPhoneContacts(this);Log.i(DEBUG_TAG, "user has the permission already!");} else {//do not have permissionLog.i(DEBUG_TAG, "user do not have this permission!");// Should we show an explanation?if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,Manifest.permission.READ_CONTACTS)) {// Show an explanation to the user *asynchronously* -- don't block// this thread waiting for the user's response! After the user// sees the explanation, try again to request the permission.Log.i(DEBUG_TAG, "we should explain why we need this permission!");} else {// No explanation needed, we can request the permission.Log.i(DEBUG_TAG, "==request the permission==");ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);// MY_PERMISSIONS_REQUEST_READ_CONTACTS is an// app-defined int constant. The callback method gets the// result of the request.}}这个对话框是系统的,不能⾃定义.经验证, 请求权限对话框中的”Don’t ask again”的选项, 只有该条权限之前的状态是Denied的时候,才会出现.以前从未授权(即第⼀次弹框), 或者之前的状态是Granted(当然这种情况⼀般不会弹框询问), 出现的弹框都是不带该不再询问的选项的.2.3处理请求权限的响应当⽤户对请求权限的dialog做出响应之后,系统会调⽤⽅法,传回⽤户的响应.这个回调中request code即为调⽤时传⼊的参数,是app⾃定义的⼀个整型值.如果请求取消,返回的数组将会为空.代码:@Overridepublic void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {switch (requestCode) {case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {// If request is cancelled, the result arrays are empty.if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {// permission was granted, yay! Do the// contacts-related task you need to do.ContactsUtils.readPhoneContacts(this);Log.i(DEBUG_TAG, "user granted the permission!");} else {// permission denied, boo! Disable the// functionality that depends on this permission.Log.i(DEBUG_TAG, "user denied the permission!");}return;}// other 'case' lines to check for other// permissions this app might request}}系统⾃动回调的情况:有⼀些情形下,调⽤1.⾃动授权: 如果⽤户已经允许了permission group中的⼀条A权限,那么当下次调⽤⽅法请求同⼀个group中的B权限时, 系统会直接调⽤回调⽅法, 并传回的结果.2.⾃动拒绝: 如果⽤户选择了不再询问此条权限,那么app再次调⽤⽅法来请求同⼀条权限的时候,系统会直接调⽤回调,返回.Demo地址:Best Practices原⽂:Best Practices 总结:1.⽤Intent启动其他应⽤来完成功能.2.只⽤真的需要的权限.3.不要⼀次请求多个权限来烦⽤户,有的权限可以等到要⽤的时候再请求.4.向⽤户解释为什么需要这个权限.5.从Android6.0开始,每⼀条权限,都需要测试开关两种状态下是不是都能让应⽤正常运⾏,⽽不是崩溃.并且相关的权限可能会需要测试不同的组合.ADB命令可以⽤命令⾏来管理权限:Use the tool to manage permssions from the command line:List permissions and status by group:$ adb shell pm list permissions -d -gGrant or revoke one or more permissions:$ adb shell pm [grant|revoke] <permission-name> ...参考资料:API Guides:Training:Runtime permissions:permission element:设计Patterns -> Permissions:博客⽂章:第三⽅库:PermissionsDispatcher:RxPermissions:Grant:本⽂地址:本⽂Demo地址:。
Android开发笔记(一百四十一)读取PPT和PDF文件读取ppt文件读取纯文本HSLFSlideShow类就是poi中专门用于解析幻灯片的工具类,每张幻灯片又分别由单独的HSLFSlide类处理,幻灯片中的具体图文内容则由HSLFTextParagraph和HSLFTextRun进行分辨。
下面是使用poi解析ppt文件(2003格式)的效果图:不同版本的poi库在解析ppt的代码略有区别,下面是使用poi15读取ppt的代码:[java] view plain copypublic static ArrayList<String> readPPT(String path) {ArrayList<String> contentArray = new ArrayList<String>();try {FileInputStream fis = new FileInputStream(new File(path));HSLFSlideShow hslf = new HSLFSlideShow(fis);List<HSLFSlide> slides = hslf.getSlides();for (int i = 0; i < slides.size(); i++) {String content = "";HSLFSlide item = slides.get(i);// 读取一张幻灯片的内容(包括标题)List<List<HSLFTextParagraph>> tps = item.getTextParagraphs();for (int j = 0; j < tps.size(); j++) {List<HSLFTextParagraph> tps_row = tps.get(j);for (int k = 0; k < tps_row.size(); k++) {HSLFTextParagraph tps_item = tps_row.get(k);List<HSLFTextRun> trs = tps_item.getTextRuns();for (int l = 0; l < ize(); l++) {HSLFTextRun trs_item = trs.get(l);content = String.format("%s%s\n", content, trs_item.getRawText());}}}contentArray.add(content);}} catch (Exception e) {e.printStackTrace();}return contentArray;}读取图文样式poi方式只能有效读取ppt内部的文字信息,对于ppt内带的图片以及文字样式,便力有不逮了。
初次接触到android的clip有以下两点疑问:1.Clip(剪切)的时机2.Clip中的Op的参数的意思。
通常咱们理解的clip(剪切),是对已经存在的图形进行clip的。
但是,在android上是对canvas (画布)上进行clip的,要在画图之前对canvas进行clip,如果画图之后再对canvas进行clip不会影响到已经画好的图形。
一定要记住clip是针对canvas而非图形。
接下来通过android自带的APIdemo Clipping例子详细讲述Clip中的Op的参数的意思。
Android提供clipRect、clipPath和clipRegion剪切区域的API。
Op一共有DIFFERENCE,INTERSECT,UNION,XOR, REVERSE_DIFFERENCE, REPLACE六种选择。
例子:1.在canvas上剪切从(0,0)到(60,60)的方块。
下图蓝色区域加紫色区域。
2.在canvas上剪切从(40,40)到(100,100)的方块。
下图橄榄色区域加紫色区域。
3.在canvas上剪切从(0,0)到(100,100)的方块。
先在第二方块上加上Op参数例如:canvas.clipRect(40, 40, 100, 100, Region.Op. DIFFERENCE); 首先,需要搞清楚Op参数针对的对象。
接着了解其含义。
Op参数针对的对象是之前剪切的区域以及当前要剪切的区域。
在本例中涉及到区域是从(0,0)到(60,60)的方块和从(40,40)到(100,100)的方块。
那有哪些含义呢?就是表示当前要剪切的区域与之前剪切过的之间的关系。
DIFFERENCE:之前剪切过除去当前要剪切的区域(蓝色区域)。
INTERSECT:当前要剪切的区域在之前剪切过内部的部分(紫色区域)。
UNION:当前要剪切的区域加上之前剪切过内部的部分(蓝色区域+紫色区域+橄榄色区域)。
Bluetooth Low Energy——蓝牙低功耗Android4.3(API级别18)引入内置平台支持BLE的central角色,同时提供API和app应用程序用来发现设备,查询服务,和读/写characteristics。
与传统蓝牙(ClassicBluetooth)不同,蓝牙低功耗(BLE)的目的是提供更显著的低功耗。
这使得Android 应用程序可以和具有低功耗的要求BLE设备,如接近传感器,心脏速率监视器,健身设备等进行通信。
关键术语和概念下面是关键BLE术语和概念的总结:通用属性规范(GATT)—GATTprofile是一个通用规范用于在BLE链路发送和接收被称为―属性(attributes)‖的数据片。
目前所有的低功耗应用profile都是基于GATT。
蓝牙SIG定义了许多profile用于低功耗设备。
Profile(配置文件)是一个规范,规范了设备如何工作在一个特定的应用场景。
注意:一个设备可以实现多个profile。
例如,一个设备可以包含一个心脏监测仪和电池电平检测器。
属性协议(ATT )—GATT是建立在属性协议(ATT )的顶层,通常也被称为GATT/ ATT 。
ATT进行了优化用于在BLE设备上运行。
为此,它采用尽可能少的字节越好。
每个attribute 属性被UUID(通用唯一标识符)唯一标识,UUID是标准128-bit格式的ID用来唯一标识信息。
attributes 被ATT 格式化characteristics和services形式进行传送。
特征(Characteristics)—一个characteristics包含一个单独的value值和0 –n个用来描述characteristic 值(value)的descriptors。
一个characteristics可以被认为是一种类型的,类似于一个类。
描述符(descriptor)—descriptor是被定义的attributes,用来描述一个characteristic的值。
第四章管理Android系统桌面第一节管理壁纸初识Android壁纸在Android中,壁纸分为静态与动态两种。
静态壁纸是一张图片,而动态壁纸则以动画为表现形式,或者可以对用户的操作作出反应。
这两种形式看似差异很大,其实二者的本质是统一的。
它们都以一个Service的形式运行在系统后台,并在一个类型为TYPE_WALLPAPER 的窗口上绘制内容。
➢Android壁纸的实现与管理分为三个层次:⏹WallpaperService与Engine。
同SystemUI一样,壁纸运行在一个Android服务之中,这个服务的名字叫做WallpaperService。
当用户选择了一个壁纸之后,此壁纸所对应的WallpaperService便会启动并开始进行壁纸的绘制工作,因此继承并定制WallpaperService是开发者进行壁纸开发的第一步。
Engine是WallpaperService中的一个内部类,实现了壁纸窗口的创建以及Surface的维护工作。
另外,Engine提供了可供子类重写的一系列回调,用于通知壁纸开发者关于壁纸的生命周期、Surface状态的变化以及对用户的输入事件进行响应。
可以说,Engine类是壁纸实现的核心所在。
壁纸开发者需要继承Engine类,并重写其提供的回调以完成壁纸的开发。
这一层次的内容主要体现了壁纸的实现原理。
⏹WallpaperManagerService,这个系统服务用于管理壁纸的运行与切换,并通过WallpaperManager类向外界提供操作壁纸的接口。
当通过WallpaperManagaer的接口进行壁纸的切换时,WallpaperManagerService会取消当前壁纸的WallpaperService的绑定,并启动新壁纸的WallpaperService。
另外,Engine类进行窗口创建时所使用的窗口令牌也是由WallpaperManagerService提供的。
Android笔记
1.S haredPreferences
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置(如:窗口状态),Activity重载窗口状态一般在onSaveInstanceState中使用SharedPreferences完成,它提供了Android平台常规的数据类型,如:Long长整形、Int整形和String字符串型。
SharedPreferences类似之前Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,信息最终是以xml方式保存,整体效率不高,但对于轻量级存储而言比SQLite 要好不少。
这种方式是最简单的Android读写外部数据的方法。
他的用法基本上和J2SE(java.util.prefs.Preferences)中的用法一样,以一种简单、透明的方式来保存一些用户个性化设置的字体、颜色、位置等参数信息。
一般的应用程序都会提供“设置”或者“首选项”的这样的界面,那么这些设置最后就可以通过Preferences来保存,而程序员不需要知道它到底以什么形式保存的,保存在什么地方。
2.A chartengine
AChartEngine是一个针对Android程序开发的开源图表生成类库。
支持多种图标,如:折线图、气泡图、饼状图等等。
调用ChartFactory的get***()函数就能得到一个图表,以饼状图为例,ChartFactory.getPieChartIntent (android.content.Context context,CategorySeries dataset, DefaultRenderer renderer, ng.String activityTitle)可以返回一个饼状图表的Intent, 至于图表的内容是什么,就需要在dataset 和renderer中布置。
dataset里面是你的基本统计数据,例如每种元素的名称和数量。
Achartengine根据每种成分的数量统计其所占百分比。
renderer指明了图的样式,例如每个元素的颜色,标题的大小,背景颜色等等。
3.异步任务处理机制(Handler和AsyncTask)
Handler模式需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新,这种方式对于整个过程的控制比较精细,但也是有缺点的,例如代码相对臃肿,在多个任务同时执行时,不易对线程进行精确的控制。
为了简化操作,Android提供的轻量级的异步工具类AsyncTask,可以直接继承AsyncTask在类中实现异步操作。
它使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务。
AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。