android自己做的一些基础笔记
- 格式:docx
- 大小:200.44 KB
- 文档页数:28
一,android 四大组件Activity、Service、BroadcastReceiver 、ContentProvider 二,Activity生命周期三,横竖屏切换时的生命周期1、新建一个Activity,并把各个生命周期打印出来2、运行Activity,得到如下信息10-23 02:35:54.261: INFO/chenys(4385): onCreate-->10-23 02:35:54.271: INFO/chenys(4385): onStart-->10-23 02:35:54.286: INFO/chenys(4385): onResume-->3、按crtl+f12切换成横屏时10-23 02:36:58.331: INFO/chenys(4385): onSaveInstanceState--> 10-23 02:36:58.411: INFO/chenys(4385): onPause-->10-23 02:36:58.462: INFO/chenys(4385): onStop-->10-23 02:36:58.481: INFO/chenys(4385): onDestroy-->10-23 02:36:58.622: INFO/chenys(4385): onStart-->10-23 02:36:58.632: INFO/chenys(4385): onRestoreInstanceState-->10-23 02:36:58.642: INFO/chenys(4385): onResume-->4、再按crtl+f12切换成竖屏时,发现打印了两次相同的log10-23 02:38:14.172: INFO/chenys(4385): onSaveInstanceState-->10-23 02:38:14.172: INFO/chenys(4385): onPause-->10-23 02:38:14.172: INFO/chenys(4385): onStop-->10-23 02:38:14.172: INFO/chenys(4385): onDestroy-->10-23 02:38:14.281: INFO/chenys(4385): onCreate-->10-23 02:38:14.301: INFO/chenys(4385): onStart-->10-23 02:38:14.312: INFO/chenys(4385): onRestoreInstanceState-->10-23 02:38:14.331: INFO/chenys(4385): onResume-->10-23 02:38:14.812: INFO/chenys(4385): onSaveInstanceState-->10-23 02:38:14.852: INFO/chenys(4385): onPause-->10-23 02:38:14.861: INFO/chenys(4385): onStop-->10-23 02:38:14.892: INFO/chenys(4385): onDestroy-->10-23 02:38:14.921: INFO/chenys(4385): onCreate-->10-23 02:38:15.021: INFO/chenys(4385): onStart-->10-23 02:38:15.031: INFO/chenys(4385): onRestoreInstanceState-->10-23 02:38:15.111: INFO/chenys(4385): onResume-->5、修改AndroidManifest.xml,把该Activity添加android:configChanges="orientation",执行步骤310-23 02:42:32.201: INFO/chenys(4875): onSaveInstanceState-->10-23 02:42:32.232: INFO/chenys(4875): onPause-->10-23 02:42:32.301: INFO/chenys(4875): onStop-->10-23 02:42:32.311: INFO/chenys(4875): onDestroy-->10-23 02:42:32.471: INFO/chenys(4875): onStart-->10-23 02:42:32.471: INFO/chenys(4875): onRestoreInstanceState-->10-23 02:42:32.481: INFO/chenys(4875): onResume-->6、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged10-23 02:44:41.151: INFO/chenys(4875): onSaveInstanceState-->10-23 02:44:41.151: INFO/chenys(4875): onPause-->10-23 02:44:41.151: INFO/chenys(4875): onStop-->10-23 02:44:41.151: INFO/chenys(4875): onDestroy-->10-23 02:44:41.371: INFO/chenys(4875): onCreate-->10-23 02:44:41.421: INFO/chenys(4875): onStart-->10-23 02:44:41.521: INFO/chenys(4875): onRestoreInstanceState-->10-23 02:44:41.541: INFO/chenys(4875): onResume-->10-23 02:44:42.002: INFO/chenys(4875): onConfigurationChanged-->17、把步骤5的android:configChanges="orientation" 改成android:configChanges="orientation|keyboardHidden",执行步骤3,就只打印onConfigChanged 10-23 02:46:43.762: INFO/chenys(5193): onConfigurationChanged-->28、执行步骤410-23 02:47:27.652: INFO/chenys(5193): onConfigurationChanged-->210-23 02:47:27.902: INFO/chenys(5193): onConfigurationChanged-->1总结:1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法四service以及service的生命周期两种用处:后台运行和跨进程访问两种模式:startService()/bindService()模式场合:调用者与服务之间没有关连,即使调用者退出了,服务仍然运行即用startService(),调用者与服务绑定在了一起,调用者一旦退出,服务也就终止则用bindService()生命周期:service的生命周期没有像activity里的onstop,主要经历创建、开始、销毁三个阶段,由于有两种模式的存在,其生命周期有两种体现方式如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。
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的文件夹,代表着这个模拟器被锁定了,如果把模拟器关掉,就没有程序占据这几个镜像资源了,那么这几个程序就会被自动删除。
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地址:。
对于5.0的系统是要求的ubuntu 12.041 新代码第一步执行:source build/envsetup.sh (此命令完成一些命令的初始化,配置了android编译的环境)2 执行lunch 命令(选择平台编译选项,用来让用户选择编译项,类似于旧框架的./mk listp)3 输入所需要编译的工程(这里需要编译82平台输入20),会显示相关的一些信息(1)A: ProjectConfig.mk路径:alps\device\farsighted\fars6582_wt_l(2)B: Drvtool路径:alps\kernel-3.10\tools\dct(3)C: Codegen.dws路径alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\dct\dct(4)D: flash时序表路径:alps\device\mediatek\build\build\tools\emigen\MT6582(5)E: flash配置文路径:alps\bootable\bootloader\preloader\custom\fars6582_wt_l\inc(6)F: 背光,键盘灯配置文路径:kernel :alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\leds\ mt65xxlk:alps\bootable\bootloader\lk\target\fars6582_wt_l(7)G: TP驱动路径:alps\kernel-3.10\drivers\input\touchscreen\mediatekTP 用户头文件配置路径:alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\touchpanel\ GT9XX新增TP还需要在以下文件增加编译路径:***新增TP还需要在以下文件增加编译路径:alps\kernel-3.10\drivers\input\touchscreen\mediatek\ Makefilealps\kernel-3.10\drivers\input\touchscreen\ KconfigTP mk文件配置(8)H: LCM驱动存放路径lk:alps\bootable\bootloader\lk\dev\lcm\ mt65xx_lcm_list.c配置文件:Lk部分mk文件配置:alps\bootable\bootloader\lk\project\ fars6582_wt_l.mkBOOT_LOGO有两处alps\bootable\bootloader\lk\project\ fars6582_wt_l.mkalps\bootable\bootloader\lk\dev\logo\ rules.mkKernel部分:lcm驱动:alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\lcm\此目录下只放.c文件,不需要文件夹alps\kernel-3.10\drivers\misc\mediatek\lcma:链接obj alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\lcm\ MakefileB:编译路径alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\lcm\ mt65xx_lcm_list.cC:kernel mk文件配置路径:alps\kernel-3.10\arch\arm\configs\ fars6582_wt_l_defconfigKerner config配置建议使用menuconfig命令make dir outmake O=out fars6582_wt_l_debug_defconfig(这是对应的项目配置文件)make O=out menuconfig(进不去的同学可看看后面的补充)(9)I: CAMERA 配置:1 alps\device\farsighted\fars6582_wt_l\ProjectConfig.mk2 hal目录3 驱动目录4 涉及修改的文件MT6582_L0\alps\kernel-3.10\drivers\misc\mediatek\imgsensor\inc\kd_imgsensor.hMT6582_L0\alps\kernel-3.10\drivers\misc\mediatek\imgsensor\src\mt6582\kd_sensorlist.hMT6582_L0\alps\vendor\mediatek\proprietary\custom\fars6582_wt_l\hal\imgsensor_src\sensorlist .cppalps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\camera\camera\kd_camera_hw.calps\vendor\mediatek\proprietary\custom\common\kernel\imgsensor\inc\kd_imgsensor.h(10)J: Gsensor,alps配置:1 1 alps\device\farsighted\fars6582_wt_l\ProjectConfig.mk2 驱动目录MT6582_L0\alps\kernel-3.10\drivers\misc\mediatek\alspsMT6582_L0\alps\kernel-3.10\drivers\misc\mediatek\ accelerometer3 custom文件alps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\accelerometeralps\kernel-3.10\arch\arm\mach-mt6582\fars6582_wt_l\ alsps4 makefilealps\kernel-3.10\drivers\misc\mediatek\alsps\Makefilealps\kernel-3.10\drivers\misc\mediatek\ accelerometer \Makefilealps\kernel-3.10\drivers\misc\mediatek\Kconfig.drivers此makefife加了后menuconfig后才有选项(11)K: Sound 配置1 1 alps\device\farsighted\fars6582_wt_l\ProjectConfig.mk2alps\vendor\mediatek\proprietary\custom\fars6582_wt_l\hal\audioflinger\audio\audio_custom_exp .h3编pl模块需先把项目名赋值我拿到的代码是需要做如下修改才能正常运行menuconfig,如果你们的正常可以忽略以下:Menuconfig需修改的地方:1 MT6582_L0\alps\kernel-3.10\Makefile修改如下:2 安装sudo apt-get install libncurses5 libncurses5-dev3 make O(大写字母O)=out menuconfig****需注意的是,如果编完后关闭了窗口再重新打开编译都要运行一次source build/envsetup.sh lunch一些常用编译命令:make –j24 2>&1 | tee build.log (相当于new命令,编译过程会生成build.log文件在alps目录下)-j后面通常是编译主机CPU支持核数2>&1, 表示将标准错误重定向到标准输出tee :同时将LOG输出到控制台和文件preloadermake –j24 pl 2>&1 | tee pl.loglkmake –j24 lk 2>&1 | tee lk.logkernelmake –j24 kernel 2>&1 | tee kernel.log clean commondm ,mm ,mmm,mma打包命令。
Android开发⾃学笔记(AndroidStudio)—4.2TextView及其⼦类⼀、引⾔TextView是我们最常⽤的⼀个控件了,它类似于C# Winform程序中的Lable,Java Swing编程中的JLable,不过相对功能更强⼤些,但从功能上看,它其实就是个⽂字编辑器,只是默认关闭了编辑功能,⽽EditText这个编辑框控件就是它的直接⼦类。
我们查看⼀下API(API Level23)中关于TextView的继承关系:从API⽂档我们可以看出,TextView直接继承了View类,同时⼜是我们常⽤的EditText、Button、CheckBox、RadioButton的⽗类。
直接⼦类有:AppCompatTextView、Button、CheckTextView、Chronometer、DigitalClock、EditText、RowHeaderView、TextClock间接⼦类有:AppCompatAutoCompleteTextView、AppCompatRadioButton、AutoCompleteTextView、CheckBox、CompoundButton、ExtractEditText、MultiAutoCompleteTextView、RadioButton、SearchEditText、Switch、SwitchCompat、ToggleButton下⾯我们着重说⼀下TextView的属性,其它的⼦类过⼀下基本的使⽤⽅法。
⼆、TextViewTextView提供了⼤量的XML属性,这些属性不仅适⽤于TextView,同样适⽤于他的⼦类,下⾯给出这些属性及其属性的说明(基于API LEVEL23):(本想把API中的属性都弄过来翻⼀下,太多了啊啊啊啊啊啊啊,这⾥借⽤疯狂讲义的截图。
够⽤了。
)下⾯通过代码简单演⽰⼀下使⽤⽅法,其他的⾃⾏琢磨吧。
说明:1.text1是使⽤textColor属性设置了字体颜⾊,textSize属性设置了字体⼤⼩2.text2使⽤layout_margin设置组件的外边距,上下左右都是20dp,autoLink是为了让组件将超链接直接识别成地址3.text3使⽤layout_marginLeft设置了组件的左边距,maxLength设置组件中⽂字的最⼤长度,我们可以看到超过7个字符后⾯的就不显⽰了三、EditText的功能和⽤法EditText与TextView⾮常类似,它与TextView共⽤了绝⼤部分的属性和⽅法。
初次接触到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:当前要剪切的区域加上之前剪切过内部的部分(蓝色区域+紫色区域+橄榄色区域)。
Android开发笔记TableLayout常⽤的属性介绍TableLayout经常⽤到的属性有:
android:collapseColumns:以第0⾏为序,隐藏指定的列:
android:collapseColumns该属性为空时,效果如下图:
把android:collapseColumns=0,2--------------》意思是把第0和第2列去掉,如下图:
android:shrinkColumns:以第0⾏为序,⾃动延伸指定的列填充可⽤部分:
当LayoutRow⾥⾯的控件还没有布满布局时,shrinkColumns不起作⽤,如下图:
设置了shrinkColumns=0,1,2,布局完全没有改变,因为LayoutRow⾥⾯还剩⾜够的空间。
当LayoutRow布满控件时,如下图:
设置设置了shrinkColumns=2,则结果如下图,控件⾃动向垂直⽅向填充空间:
android:stretchColumns:以第0⾏为序,尽量把指定的列填充空⽩部分:
设置stretchColumns=1,则结果如下图,第1列被尽量填充(Button02与TextView02同时向右填充,直到TextView03被压挤到最后边)。
Android JNI/NDK 学习笔记likunarmstrong@JNI,全称Java Native Interface,是用于让运行在JVM中的Java代码和运行在JVM外的Native代码(主要是C或者C++)沟通的桥梁。
代码编写者即可以使用JNI从Java的程序中调用Native代码,又可以从Native程序中调用Java代码。
这样,编程人员可以将低阶的代码逻辑包装到高阶的程序框架中,获得高性能高效率的同时保证了代码框架的高抽象性。
在Android中,仅有以下类库是允许在JNI中使用的:●libc (C library) headers●libm (math library) headers●JNI interface headers●libz (Zlib compression) headers●liblog (Android logging) header●OpenGL ES 1.1 (3D graphics library) headers (since 1.6)● A Minimal set of headers for C++ supportJNI本身仅仅是一个把两者融合的工具,作为编程者需要做的,就是在Java代码和Native代码中按照固定的格式告诉JNI如何调用对方。
在Android中,有两种方式可以调用JNI,一种是Google release的专门针对Android Native开发的工具包,叫做NDK。
去Android网站上下载该工具包后,就可以通过阅读里面的文档来setup一个新的包含Native代码的工程,创建自己的Android.mk文件,编译等等;另一种是完整的源码编译环境,也就是通过git从官方网站获取完全的Android源代码平台。
这个平台中提供有基于make的编译系统。
更多细节请参考这里。
不管选择以上两种方法的哪一个,都必须编写自己的Android.mk文件,有关该文件的编写请参考相关文档。
Android开发学习笔记小魏CQUAndroid是Google于2007年11月05日宣布的基于Linux平台的开源手机操作系统的名称,该平台由操作系统、中间件、用户界面和应用软件组成。
它采用软件堆层(Software Stack,又名软件叠层)的架构,主要分为三部分。
底层以Linux内核工作为基础,由C语言开发,只提供基本功能;中间层包括函数库Library和虚拟机Virtual Machine,由C++开发。
最上层是各种应用软件,包括通话程序,短信程序等,应用软件则由各公司自行开发,以Java作为编写程序的一部分。
(/index.php?title=Main_Page)进行Android开发,首先要搭建开发环境。
实验室为我们搭建的环境:JAVA JDK 1.5 (C:\Program Files\Java\jdk1.5.0_11)MyEclipse 6.5ADT 0.9.7 (C:\android\ADT-0.9.7)Android SDK-windows 1.6 (C:\android\android-sdk-windows-1.6_r1)进行Android开发需要安装Android SDK. (使用Android SDK Manager 工具进行安装。
实验室的电脑可以找到Manager的位置C:\android\android-sdk-windows-1.6_r1\SDK Manager.exe)安装之后还应在IDE中进行一定的配置。
(实验室MyEclipse6.5也帮我们都配置好了。
可以打开MyEclipse->Windows->Android SDK and AVD Manager查看)Android开发系统主要集中在两种环境中,分别是基于Android SDK的开发和基于Android 源代码的开发。
前者可以在Linux或者Windows两种环境中使用IDE完成,后者需要在Linux 环境中进行开发。
四⼤大组建是什什么?1. activity:Activity是所有程序的根本,所有程序的流程都运⾏行行在Activity 之中2. service:Service 是没有界⾯面的⻓长⽣生命周期的代码3. BroadcastReceiver:⼴广泛运⽤用的在应⽤用程序之间传输信息的机制4. Content Provider:是Android提供的第三⽅方应⽤用数据的访问⽅方案
四⼤大组件的⽣生命周期和简单⽤用法
1. Activity 七个⽣生命周期⽅方法,Activity之间的通信⽅方式
1. 在Intent跳转时携带数据(bundle exatra)2. 借助类的静态变量量来实现3. 借助全局变量量来实现/Application4. 借助外部存储来实现通讯i. 使⽤用SharedPreference实现Activity之间的数据通信ii. 使⽤用SQLite来实现数据共享通信iii. 直接使⽤用File来实现iv. 借助Service来实现(bindservice)
Activity各种情况下的⽣生命周期
参考Android 基础⾯面试题.pdfActivity与Fragment之间⽣生命周期⽐比较activity有7个⽣生命周期,Fragment有11个⽣生命周期 参考:http://blog.csdn.net/u012702547/article/details/50253955
在创建的过程中,是Activity带领Fragment执⾏行行⽣生命周期中的⽅方法,所以⽣生命周期⽅方法的执⾏行行顺序是这样的:
1. Activity--onCreate();2. Fragment--onAttach();3. Fragment--onCreate();4. Fragment--onCreateView();5. Fragment--onActivityCreated();接着是这样的:6.Activity--onStart();7.Fragment--onStart();8.Activity--onResume();9.Fragment--onResume();我们知道,⽆无论对于Activity还是对于Fragment,onResume这个⽣生命周期都是他们执⾏行行时间最⻓长的,当我们的Activity或者Fragment打开之后,它就⼀一直处于这个⽣生命周期中。
安卓学习笔记问:1.Android使用的字符集是iso-8859-1,意味着什么getBytes()默认是什么编码??2.配置文件中的标签和属性可以配置哪些内容,是通过什么查看??xml的约束文件还是类的属性,还是其他的???ViewGroup:所有布局的超类===================Intent中有很多常量,对应intent.setAction()方法的参数intent.setData(Uri.parse("tel:"+phoneNum));Manifest列出所有的权限清单,这个类需要自己导入.===================通过activity.openFileOutput(文件名,模式)可以将数据写入手机的当前应用程序对应的目录的文件中.具体路径是:data/data/包名/files/文件名通过activity.openFileInput(String 文件名)可以读取当前应用程序对应中的目录的文件.注意:这个不指定模式.同一台手机的不同应用程序之间,通过绝对路径读取另一个应用程序的文件中.需要被读取的应用程序调用activity.openFileOutput(文件名,模式)方法时指定其他人有读取的权限.同一台手机的不同应用程序之间,通过绝对路径写入另一个应用程序的文件中.写入的权限在自己身上,不需要被写入的程序指定????需要吗???也需要别人给写入的权限.FileOutputStream类的构造方法的第二个参数可以指定是追加还是覆盖.测试用例需要配置的Manifest.xml:<uses-library android:name="android.test.runner" /><instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="cn.itcast.other"android:label="Tests for My App" />view.xml中的组件可以添加android:onclick="方法名",如android:onclick="click"day01Android底层是linux不同的SDK版本对应不同的API版本SDK(target name),如android2.0API版本,如5API的jar包在/android-sdk-windows/platforms中DDMS:==>透视图可以设置来电显示,打电话,发短信...eclipse==>windows-->prefrences-->open DDMS来电显示,打电话,发短信...==>eclipse==>windows-->prefrences-->open DDMS==>Emulator Control中同一台主机之间的模拟器之间可以打电话(直接输入对方的端口号),但是不同机器不能模拟器的bug,中文乱码.已经写死了不能改,真机没问题.软件部署到真机-->先下载官方驱动(b_device..)-->设备管理器-->ADB...run as-->android application修改eclipse的项目的API版本:AndroidManifest.xml中==>项目的目录结构/gen/..../R.java:不由我们管理,资源文件在这里对应一个内部类.内部类的常量对应的整数值(0x7f020000):1.方便查找文件,如果删除就会在这删除2.map中的key,查找速度快/assets:有ogg文件,如需要播放的音频文件,比较大的文件/res:存放小文件资源文件/drawble-hdpi/drawble-ldpi/drawble-mdpi:存放高中低分频的文件,做不同手机屏幕自适应的/layout:布局,如main.xml<LinearLayout>:线性布局,容器类.ViewGroup:所有布局的超类/valuesstrings.xml==>存放字符,如应用的名称default.propertiestarget:指定API的版本AndroidManifest.xml==>清单文件,相当于struts的配置文件(struts.xml)可以更改显示的图标:==>会根据手机屏幕自适应<application android:icon="@drawable/donkey"...>可以更改应用程序名称(在手机上的):这个不行(bug):<application android:label="......>需要改这个:<activity ... android:label="...">可以更改最低运行版本的API<uses-sdk android:minSdkVersion="8" />文件中访问资源文件的方式@string/name==>读取string.xml中指定name的值.项目导出为.apk文件,以便发布.export==>android....apk文件可以直接传到手机上,然后进行安装.但是只有真机才可以,模拟机不行.File Exporer==>文件结构(没有盘符的概念,底层是linux,根目录是/)1.看到的文件夹不全2.发布到手机:1.eclipse中发布到手机上DDMS-->File Exporer/sdcard-->push a...2.手机上安装==================帮助文档中(what is android):功能(Features):开发出来的程序不运行在jvm里面,运行在谷歌自己的dalvik虚拟机上dalvik vm:谷歌自己开发的高度优化的虚拟机==>对移动设备进行优化的.基于寄存器的(更高的访问性能)register-based.Integrated browser==>集成浏览器基于WebKit引擎(不是IE,和苹果的一致)Optimized graphics架构图1.应用程序层(我们可以开发的)2.框架层(一堆管理器,以服务的组件方式运行)和android Runtime使用JNI与类库交互.3.类库(c语言写的)4.linux的内核(驱动)底层不可能用java,因为声音图像处理需要性能要求.只能用c.可以用JNI实现java和c的通信.固件开发==>....android Runtimeandroid的进程是linux的进程之一.因为dalvik vm是linux进程之一.dex:dalvik的可执行文件..apk文件时一个压缩包,它里面就有.dex文件..dex可以反编译成java文件,不能直接解压缩..apk可以用压缩文件打开.dx工具==>tools/dx.bat==>把编译后的class文件翻译成dex文件==================================下午DNK:本地开发工具,支持C等语言的开发.我们使用的是SDK.1.6版本(Donut)把facebook继承进来了.1.adb.exe命令行工具==>android的调试桥adb devices//列出所有的设备adb install someapplication.apk//安装adb uninstall cn.itcast.helloworld //卸载指定包名adb -s emulator-554 uninstall cn.itcast.helloworld!! 注意:安装完的应用程序在文件中的名字是:包名-数字.apkadb rm /data/app/Chapter2.apk//删除文件adb –s emulator-5556 shell //连接到指定的模拟器telnet localhost 5554//telnet连接到模拟器控制台注:模拟器运行监听于端口(5555),则控制器就是5554(-1).2.linux的命令#ls 显示有哪些目录,和DDMS-->File Exporer类似,但更全3.android的运行机制yout.xml(资源文件)被预编译成R.java,2.R.java和我们自己编写的*.java被编译成*.class,3.*.class被编译成.dex文件,4.*.dex加上其他文件(如清单文件Manifest.xml和资源文件layout.xml)被打包成.apk文件.4.模拟器模拟网速和延迟14:265.打电话的功能布局的内部类布局参数LayoutParam中有常量1.布局LinearLayout内部类LayoutParams(MarginLayoutParams的子类)MarginLayoutParams2.控件:ViewGroupTextViewEditTextButton3.控件的参数:1.布局参数(以layout开头)==>约束当前控件处在父元素的行为layout_width="fill_parent" //fill_parent指填充父元素layout_height="fill_parent"layout_height="wrap_content" //wrap_content指包裹内容(和子元素一样)layout_gravity="right" //在父元素中的重心(上下左右)!! layout_weight="1" //比重,添加比重后就可以被拉伸了.1指占剩余空间的的几分之一.!! 注意:控件自己也有gravity,用于指定孩子的重心.如Button可以指定它上面的文字的重心.2......:text="@string/inputPhoneNumber"gravity="left" //指定孩子的重心.如Button可以指定它上面的文字的重心.id="@+idsss/btnCall" //指定id,会在R类生成一个内部类,名叫idsss4.填充方式:fill_parent:填充父元素match_parent:填充父元素和fill_parent一样的功能,2.2后建议使用wrap_content:包裹内容(和子元素一样)5.使用R.java中的内容==>yout.main在R.java中增加内部类==>@+idsss/btnCall使用资源文件string.xml中的内容==>@string/app_name6.在activity中使用API进行打电话...7.声明打电话的权限<uses-permission android:name="..."/>具体的权限可以查看Manifest.java,这个文件需要自己拷贝.7.发短息注意:1.容器嵌套2.添加比重3.文本从左上角开始==>EditText的android:gravity="left|top"支持二进制的或运算.4.内部类做监听器class ButtonListener implements View.OnClickListener{public void onClick(View v){//呼叫//发短信,可以用意图来做,但是麻烦,可以用SmsManager来做}}5.发短信的权限SEND_SMS,加到清单文件中6.发送完成后,用吐司提示Toast toast = Toast.makeText(this,"发送完成",1);? toast.setGravity(Gravity.TOP|Gravity.RIGHT,....);==>设置显示的位置(左上角是屏幕的原点)//还可以设置吐司的显示界面toast.setView(layout);toast.show();7.超过字数线之后分割成多条短信,然后循环发送smsManager.divideManage(text);3种通知方式:吐司通知/状态栏通知/?8.android的单元测试1.清单文件中//需要在清单文件中配置<users-library ....>//声明测试套件<instrumentation ...>targetPackage="包名" ==>设置需要测试的包名2.测试类继承AndroidTestCase然后就可以定义测试的方法了.System.out.println();==>System类是android的,不是JDK的ng的!! 所以这句话不会显示到Console中,而是显示在Logcat中.但是输入日志一般不用他.而是用Log9.数据存储每个目录都有权限问题,data对应的程序有所有的读写权限在data中.但是其他程序不一定.权限分为3组:owner所在组/owner/读写可执行d=>目录-=>文件r=>读w=>写x=>可执行1.内部保存==>直接操作程序对应的文件(data/包名/files文件夹)activity.openFileOutput(...);会在data/包名中新建一个files文件夹保存数据如果直接通过绝对路径访问其他应用程序对应的文件,需要加入权限控制.==>打开文件输出流的时候,设置Mode2.通过绝对路径读取其他应用程序对应的文件3.布局文件中可以给控件添加一个android:onclick="click",从而就不需要在MainActivity 的onCreate()方法中为控件逐个添加监听器.!!! 就不需要实现监听器类了,而是可以直接在MainActivity中添加一个onclick(View view)方法APIActivity的方法findViewById(R.id.btnCall);==>找到...startActivity(intent);==>开始活动openFileOutput(名称,操作模式);==>打开一个输出流,这个输出流指向程序对应的文件夹中的一个文件.名称由第一个参数指定,如果文件不存在就创建.即,写入程序(当前应用程序)对应的文件夹中的文件.注意:名称不能有分隔符/操作模式:Context.MODE_PRIVITE=>覆盖、MODE_APPEND=>追加MODE_WORLD_READABLE别人可写、MODE_WORLD_WRITEABLE别人可读openFileInput(...);==>View是所有控件的超类ButtonsetOnclickListener(View.OnclickListener)View.OnclickListeneronClick(View v)EditTextgetText()==>返回一个EditablesetText()==>设置内容EditabletoString()Intent==>意图,相当于请求request常量:ACTION_CALL==>android.intent.action.CALLsetAction(ACTION_CALL);==>设置动作名称setData(Uri.parse("tel:"+phoneNum));==>设置意图的数据Manifest==>权限清单,列出所有的权限CALL_PHONE==>打电话的权限SmsManagerSmsManager.getDefault()==>返回默认的短信管理器sendTextMassage(...);==>divideManage(text)==>分割成多条短信Toast==>吐司,临时性通知.(状态栏的通知时持久性通知).makeText(上下文,显示的消息,显示时间)==>返回一个Toast 时间可以用Toast的常量...setGravity(...)==>设置显示位置setView(Layout);===>自己定义吐司的显示界面Context==>上下文.可以访问全局信息.(Activity和Service是他的子类) 这时一个抽象类,允许访问应用程序特有的资源和类.Context.getResource();Context.getAssets();Context.getMainLooper();System==>android的类Log==>输入日志的工具类d()==>调试e()==>错误i()==>注意参数中标签一般定义成常量v()w()==>警告ContextContext.MODE_APPENDContext.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLEYour data storage options are the following:Shared PreferencesStore private primitive data in key-value pairs.Internal StorageStore private data on the device memory.External StorageStore public data on the shared external storage.SQLite DatabasesStore structured data in a private database.Network ConnectionStore data on the web with your own network server.模拟器:320*480Activity.getFileOutput()content.openFileInput()xml的3种解析方式SQLite的两种增删改查方式事务处理ContentProvider和ContentResolverday021.文件读取(数据存储)========================(一)内部存储:存在内存卡上/data/data/xxx/files/xxx.txt1.(昨天)内部存取.内部存取(Activity.getFileOutput();)时,可以指定模式.1.模式默认模式为Context.MODE_PRIV ATE==>覆盖形式.Context.MODE_APPEND==>追加的形式Context.MODE_WORLD_READABLE==>全局可读.即别人可以读.Context.MODE_WORLD_WRITEABLE==>全局可写.使用这个方法对应的是自己工程所对应的文件夹==>/data/data/包名/files/文件名,即项目相关上下文.但如果项目的包名相同,就可以相互访问,是为一个项目.2.内部存储之Context==>核心代码:!!! Context ctx = activity.getContext().createPackageContext(要访问的包名,标识);!!! FileInputStream fis = ctx.openFileInput("itcast.txt");通过包相关上下文Context访问写入远程文件.每次返回新的Context对象,但是多个对象访问的资源时相同的.每次返回新的,所以是轻量级的??activity.getContext().createPackageContext(要访问的包名,标识);标识:1.Context.CONTEXT_INCLUDE_CODE==>包含代码.可以获取指定包(项目)的资源(classLoader和resource),可以实例化任何该项目中的类,像本地访问一样.但是需要两个程序具有相同的uid,还需要有相同的证书.如果加载不了就抛安全异常.uid:每个应用程序的唯一的.如果两个程序具有相同的uid就认为是同一个程序.证书:导出时需要指定一个密钥库.开发时没有设置,是因为IDE已经内置了一个证书(在Android-build-Default debug keystore指定的路径中).所以在一个开发环境中的密钥库(证书)是相同的.配置程序的uid,在清单文件manifest.xml中<manifest android:shareUserUid=""注意:要有一个点.9:35 加载的loader为:delvik.system.PathClassLoader[/data/app/cn.itcast.datastore.datastore-1.apk]总结:在一个开发环境中如果想得到另一个程序的资源的前提:相同的证书:同一个开发环境(同一个eclipse)中的证书相同.相同的uid:可以通过manifest.xml修改两个程序的uid为相同的.2.Context.CONTEXT_IGNORE_SECURITY==>忽略安全性.可以得到指定包的上下文Context.但是通过这个上下文得到的资源(类加载器)是自己的,而不是指定包(项目)的.9:27 通过打断点能看出来==>delvik.system.PathClassLoader[.],其中"."代表当前项目.所以我们得到的是当前项目通过classLoader.loadClass("cn.itcast.datastore.MainActivity").newInstance()==>会抛出类找不到异常.所以再次说明我们不能得到通过这个context得到指定程序中的类.总结:Context.CONTEXT_INCLUDE_CODE可以加载不同应用程序的资源和classLoaderContext.CONTEXT_IGNORE_SECURITY不能加载不同应用程序的资源和classLoader==========================(二)外部存储:==>SD卡,在硬盘上的位置如:/mnt/sdcard/itcast,这个路径会因为平台不同而不同.SD卡,没有安全权限.!!! 虽然没有安全权限,但是需要写入SD卡的权限:android.permission.WRITE_EXTERNAL....==>不需要别人指定,但是需要自己配置到清单文件.!!! 核心代码:File dir = Environment.getExternalStorageDirectory();FileOutputStream fos = new FileOutputStream(new File(dir,"itcast.txt"),true);外部存储可以被挂载(Unmout SD card)和卸载.1.直接通过SD卡的绝对路径存取.......2.不同平台的SD卡的目录的位置不同.所以需要动态获取.Environment.getExternalStorageState()==>获取外村设备的状态.不支持多个卷标,所以过时了.通过该方法返回的状态判断是否挂载了SD卡:Environment.MEDIA_MOUNTED==>挂载了SD卡Environment.getExternalStorageDirectory(...)==返回一个指定路径的File对象.可以通过它获取SD卡的绝对路径.3.卸载和挂载SD卡的权限:android.permission.MOUNT_UMMOUNT_FILESYSTEMS==========================(三)首选项存储方式==>/data/data/<package name>/shared_prefs/itcast.xml获得项目的共享首选项sharedpreference==>主要是为了存储手机的参数,如夜间模式需要的参数1.sharedpreference是单例的,对应的文件是xml,以键值对存储!!!! 注意:现在不支持跨进程(Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE),说是以后加.? ==>所以现在就只支持Context.MODE_PRIV ATE一种???2.获取sharedpreferenceSharedPreferences sf = getSharedPreferences("itcast",Context.MODE_PRIV ATE);==>直接通过activity获取.因为是ContextWrapper的子类.这个itcast会自动加上.xml后缀.模式中没有追加的方式,因为是以键值对(map)的形式,所以键相同就会被覆盖.//修改!!!!!!!! 3.必须通过Editor来修改首选项的数据.必须commit才能持久化存储,不然只在内存中.Editor editor = sharedPreferences.edit();//获取编辑器editor.putString("name", "传智播客");editor.putInt("age", 4);mit();//提交修改,以便持久存储4.路径:/data/data/<package name>/shared_prefs/itcast.xml<map><string name="name">tom</string> //文本值可能很长所以不作为属性存在,不然太乱<int name="age" value="12"/> //数值以属性存在<map>//读取!!!!!!!!! 5.读取首选项数据SharedPreferences sp = this.getSharedPreferences("itcast", Context.MODE_PRIV A TE);String name = sp.getString("name", "nobody");boolean married = sp.getBoolean("married", false);==================================================================解析xml()|||||||==>通过3种方式读取外部SD卡上的xml文件.!!!! xml文件的3个重要部分:标签名、标签的属性、文本,所以务必记住获取这3个元素的方法.1.sax==>推模式(由服务器控制)基于事件的,一次加载.当所有节点都触发完后才结束.2.domdocument object model,两次加载(第一次把文档载入内存,第二次形成树)3.pull10:20?? 拉模式(web访问就是典型的这种模式).==>指定想要的资源,有自己控制.(推模式如:服务器自动发送推销、广告等)网络中没有真正的推模式,ajax就是通过轮询的方法以拉模式来实现推模式.注意:xml文件标签结束后的的下一个元素可能是回车换行,也可能是一个子元素.=============具体过程:(使用了ListView)domain包中的javabean对象通常没有getter和setter,而且成员是public.以节省资源service包中新建接口ParseService,接口添加方法doParse(inputStream)显示ListView的核心代码:ListView lvList = (ListView) findViewById(R.id.lvList);SimpleAdapter sa = new SimpleAdapter(this, data,yout.listviewitem, new String[]{"id","name","age"}, new int[]{Id,Name,Age});lvList.setAdapter(sa);1.通过sax解析==>基于事件的查看老师的SaxParseServiceImpl.java2.Dom解析==>基于对象的!!! 查看老师的DomParseServiceImpl.java3.pull解析==>基于事件的,可以控制下一个事件是否触发,Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理.当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值!!! 4.修改外观<TextView android:layout_width:50dip android:backgroup:"#ffff0000"/>rgb:fffargb:其中a是alpha(透明头)rrggbb:ffffffaarrggbb:ffff0000<ListView>中的<TextView android:textSize="25sp"/>=========================(四)SQLite==>结构化数据存储.只能在内部访问,别人不能访问!!! SQLite存储:存储结构化数据.数据库是独占的,不能跨进程访问.14:8 最大的特点是可以把任何类型的数据保存在任何字段中.SQLiteOpenHelper构造方法的几个参数.getWritableDatabase()==>类似于单例的getReadableDatabase()onCreate(SQLiteDatabase db)==>被创建时执行的代码,如创建数据库String sql = "create table customers(id int primary key autoincrement,name...)";==>注意:autoincrement没有下划线db.execSQL(sql);onOpen(SQLiteDatabase db)!! onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)==>升级数据库,当创建SQLiteOpenHelper的构造方法中的版本发生变化是,会调用这个方法.close();==>Close any open database object.SQLiteDatabaseexeSQL(sql,Object[])==>增删改rawQuery(sql,String[] selectionArgs)==>查询,返回一个游标insert(String table, String nullColumnHack, ContentValues values)update(String table, ContentValues values, String whereClause, String[] whereArgs)beginTransaction();==>开启事务,事务可以被嵌套.外层结束,里层也会被提交或回滚.setTransactionSuccessful();==>设置事务的成功标记endTransaction();==>结束事务.如果有成功标记就提交,没有成功标记就回滚.Cursor游标==>while(cursor.moveToNext())c.id = cur.getInt(cur.getColumnIndex("id")); = cur.getString(cur.getColumnIndex("name"));1.注意:1.autoincrement没有下划线2.主键必须是Integer2.创建成功后:/data/data/cn.itcast.db/databases/itcast.db3.使用SQLite的软件查看数据其中还有一张元数据的表,记录语言.查看老师的代码(对SQLite进行增删改查)....===>MainActivity.java/DBHelper.java/CustomerDao.java/Customer.java4.使用SQLite3查询数据cd toolsadb shell==>进入linux环境cd data/data/cn.itcast.db15:06 ls -l==>查看所有文件sqlite3 itcast.db==>挂上(进入这个数据库文件).schema==>.tables==>查看有那些表select *from customers;.headers on==>显示表头.mode column==>格式化select *from customers;5.将查询的所有数据利用listView显示.游标适配器==>CursorAdapter/SimpleCursorAdapter构造方法中的参数:!!? .....String[]=>和数据库的查询结果的字段名一致Object[]=>和layout中的id一致!!!! 注意:游标适配器查找时,必须有一个字段叫_id,否则无法工作.可以通过别名来解决.select id as _id,name,age from customs;6.SQLiteDatabase的其他方法insert(String table, String nullColumnHack, ContentValues values)!!! 这个方法是给ConentProvider使用的.1.table表名/nullColumnHack防止这种情况insert into customers() values();如果是控制列就将指定的列名设置为null2.ContentValues是HashMap的包装类.update(String table, ContentValues values, String whereClause, String[] whereArgs)7.ScollView视图==>只能竖直滚动HorizotalScrollView==>可以水平滚动15:55 8.事务注意:SQLite不支持语句中的;默认是不带事务.开启事务的方式:db.beginTransaction();开启事务,事务可以被嵌套.外层结束,里层也会被提交或回滚.db.setTransactionSuccessful();==>设置事务的成功标记db.endTransaction();==>结束事务.如果有成功标记就提交,没有成功标记就回滚.2.ContentProvider和ContentResolver目前为止,我们可以通过两种方式访问其他程序的内部数据:绝对路径/context.createPackageContext()但是需要知道位置或者包名、还要具有权限.但是不方便.我们可以用ContentProvider,更方便.A(服务端)对外做一个内容提供者ContentProvider,具有insert/update/delete/query方法,B(客户端)利用ContentResolver和服务端交互.==>具有insert/update/delete/query1.客户端和服务端的应用程序都有Uri!!! 但是,如果A和C都想将自己的数据共享,那客户端怎么才能将数据传递给指定的提供者呢,于是我们可以用Uri.在增删改查中都有一个参数是Uri.与此对应,客户端也有Uri.2.ContentProvider==>服务端对外提供数据新建一个CustomerProvider extends ContentProvider1.Manifest中配置16:25 android:authority...2.URI的规则:16:38 3.提供者的onCreate()方法不能在构造方法中实例化dao,因为上下文还没有被实例化.!!! 4.URI的匹配器UriMatcher==>可以完成URI的判断工作.UriMatcher matcher = new UriMatcher();16:42 matcher.addURI("授权的...",...,code);matcher.addURI("授权的...",...,code);==>#匹配数字5.ContentUris工具类ContentUris.withAppendedId(uri,id);==>ContentUris.parseId(uri)==>取出uri最后的那个id值(.../id)16:50 注意:更新需要返回影响的行数..............3.ContentResolver==>客户端调用数据..............!!! 提供者不在线也可以插入.===============================16:30 (补前面的内容:版本的升级)1.当调用getWritableDatabase()或getReadableDatabase()时才能真正更新版本.2.问:我们没有显示的调用onUpgrader()方法,为什么SQLiteOpenHelper(子类)会执行这个方法???(我们只是在创建SQLiteOpenHelpe时指定了一个新版本,系统怎么知道他的老版本是什么从而判断是否要升级的,即是否要执行onUpgrader()方法的)??难道老版本存在一个什么地方??答:在SQLiteOpenHelpe的getWritableDatabase()方法中,会通过SQLiteDataBase 的getVersion()方法获取老版本,我们我们创建SQLiteOpenHelpe时传递的version和这个版本不同时,就调用onUpgrader()方法,所以不需要我们显示地调用升级方法,系统会自动判断.但是这个老版本具体存到哪的就不知道了(最后是SQLiteStatement调用了一个native_1x1_long()方法来获取版本)。
安卓笔记第一章:安卓的相关知识:一:3G1.3G的概念3G全称为:3rd Generation,中文含义即为第三代数字通信,是指将无线通信与国际互联网等多媒体通信结合的新一代移动通信系统2. 符合3G标准的技术CDMA2000WCDMATD-SCDMA速度快、融入了多媒体(图片视频等等)二、智能手机苹果ios、android、黑莓、塞班、meego、乌邦图(ubuntu---linux)、火狐os、miui、wp 7、锤子系统三、android特点?开源、linux内核、可自定义性强、dalvik虚拟机、OHA联盟缺点:碎片化(版本太杂了)、屏幕适配问题四、dalvik虚拟机1..java--->.dex .java--->.class2.速度快(基于寄存器的)慢(内存中运算)3.文件更小4.自身对硬件要求低对资源做了优化五、framwork四层application javaapplication framwork javalibraries类库、android runtime (c语言)linux六、安装JDKEclipseADT(插件)SDK(android开发工具adb.exe ddms 模拟器、sqlite、draw9patch)七、安卓项目的文件说明:例如:helloworld包名:com.公司名.应用名继承activity 重写oncreate方法,setContentView(yout.main)工程有哪些文件src,gen,res,assets,binres:drawable(h/l/m),layout,values,raw(图片,音乐,数据),menu,values-v11 v14,anim(animation动画)package=“com.jky”包名是一个软件的唯一标识(同包名的软件会替换原来的程序)android:versionCode=“1”;版本号android:versionName="1.0"版本名android:minsdkversion=“8”Sdk最小支持的版本号(project.properties文件里的#Project target target=android-8标是当前开发使用的版本)android:icon 软件的图标android:lable 软件的名字<activity>“<activity>是android的四大组件之一,作用:专门用于显示,做一些逻辑控制name名字lable:一般的一个软件的名字是根据application的lable决定的,但是如果activity里设置了lable,那么软件的名字就会跟随此名字”<intent-filter>“<intent-filter>是意图过滤器,让别人能调用此activity,隐式调用”</intent-filter></activity>安卓四大组件:Activity,BroadcastReeiver(广播接收者),ContentProvider(内容提供者),Service(服务)。
=------------重要一些异常:res下定义的id无法映射到R.Java文件下处理方法:res/layout下的xml名不能有大写字母,命名规范为【a-z0-9】和。
选中项目,右键Crean重新编译一下第二章:电话、短信常用布局一:电话拨号器:1.findViewById()有什么样作用通过布局文件中的属性id拿对象怎样去激活系统拨号组件Intent intent=new Intent(); //创建一个意图intent.setAction(Intent.ACTION_CALL); //传参数intent.setData(Uri.parse("tel:"+number));//设置动作数据startActivity(intent); //激活电话拨号权限:<uses-permission android:name="android.permission.CALL_PHONE"/>二:短信发送器器:发短信需要使用什么类SmsManager smsManager=SmsManager.getDefault();//获得短信管理器smsManager.sendTextMessage(number, null, smg, null, null); //设置数据Toast.makeText(getApplicationContext(),R.string.success,Toast.LENGTH_LONG).Show();//吐司提示,查看发送状态短信发送权限:<uses-permission android:name="android.permission.SEND_SMS"/>注意:权限的作用是什么?在哪里加作用:防止恶意软件侵犯用户的隐私,维护手机的安全性在AndroidManifest.xml里加<uses-permission ></uses-permission >(电话与短信都需获取权限:)三:各种简单布局Activity的方法和生命周期:--onCreate 一个activity启动时运行(第一次)--onStart 当activity处于可见状态时运行--onResume 当activity可以得到用户焦点时(可以被操作)运行--onPause 当activity处于暂停状态时(例如弹出其他activity而原activity未被完全覆盖),可在此保存数据,以便此activity释放时恢复原状--onStop 当activity完全不可见时--onRestart 当activity未被销毁而在此被调用时--onDestory 当activity被销毁时当调用finish();语句时,Activity被销毁。
Task一个包含多个Activity的栈。
(栈具有后进先出的结构)。
其中栈的动作只有弹出和压入两个动作,不能进行重新排序。
建立一个对话框风格的Activity要在Activity的注册文件AndroidManifest中注册时在注册语句后加入代码:<activity android:name=".SecondActivity"android:label="@string/second"android:theme="@android:style/Theme.Dialog"/>Activity的布局方法:--LinearLayout的使用方法(线性)其中带有滚动条的线性布局为ScrollView滚动条的方向属性:scrollbars带有滚动条的表格布局为GridView<?xml version="1.0" encoding="utf-8"?> --声明版本和使用的编码<LinearLayout --整个LinearLayout的根标签xmlns:android="/apk/res/android"--xml的命名空间控制线性布局本身的属性:android:orientation="vertical" --布局的方向(水平,垂直)android:layout_width="fill_parent" --宽android:layout_height="fill_parent" --高>常用标签:<!--android:id ——为控件指定相应的IDandroid:text ——指定控件中显示的文字,需要注意点是,这里尽量使用string.xmlandroid:grivity —-子控件的对齐方式-top ——上-bottom ——下-center_vertical ——垂直方向的居中-fill_.. ——垂直方向充满-center_horizontal ——水平方向居中-fill_.. ——水平方向充满-center ——居中-fill ——充满-clip_vertical ———.._horizontal ——android:textSize ——指定控件中字体的大小(单位磅pt)android:backgroud ——指定该控件所使用的背景色,RGB命名法——?android:backgroud = “@drawable/背景图片的名字”android:width ——指定控件的宽度-fill_parent ——充满父控件-wrap_content ——恰好适应内容android:height ——指定控件的高度android:padding* ——指定控件的内边距(上下左右)(单位dip或像素),也就是说控件中的内部控件距外部控件的距离android:layout_marginLeft --指定控件的外边距,两个相邻控件之间的间隙android:sigleLine ——设置为真(true),则将控件在同一行当中进行显示(不能完全显示时用..表示),假(false),时一行不够延续到下一行,内容太时会导致控件的向下延伸android:layout_weight ——可与下一个标签中的weight联合起来界定标签的相对大小-->--TableLayout的使用方法(表格)<?xml version="1.0" encoding="utf-8"?><TableLayout xmlns:android="/apk/res/android"--同上android:layout_width="fill_parent"android:layout_height="fill_parent"android:stretchColumns="1" --表格无法充满左右宽度时,拉伸的列。
java中“0”表示第一列。
><TableRow> --行标签<TextView --行标签以下,每一个标签是一列android:id="@+id/row01_text01"android:text="@string/text01"android:background="#aa0000"android:padding="3dip" --表示前后左右的内边距/><TextViewandroid:…………/></TableRow><TableRow><TextView……../><TextView…../></TableRow></TableLayout>两个标签嵌套使用可以实现更复杂的Activity。