Android培训Android课堂重点内容汇总
Posted DennisJu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android培训Android课堂重点内容汇总相关的知识,希望对你有一定的参考价值。
android培训Android课堂重点内容汇总
一、Android Introduction
Android 是一个允许你在java环境下为手机设备开发应用和游戏的提供丰富应用框架。
二、四大组件
1、Activity
(1)定义:提供给用户一个与app进行交互的UI界面的组件
(2)创建
//步骤
(1 继承Activity或者其子类
(2 必须实现OnCreate()
(3 OnCreate()实现SetContentView(),为这个Activity提供的窗口,添加layout(布局)
(4 在配置文件AndroidManifest.xml中声明该Activity
(3)生命周期
(4)通过传递Intent对象启动,启动方式两种,一种不返回值startActivit(),另一种带返回值startActivityForResult()
2、Broadcast Receiver
(1)定义:用来应答全系统范围之内通知的组件,两种表现形式,一时系统组织的(例如:锁屏、电量低、截图),二是自定义的(例如:下载完成数据发送广播通知),广播通常只做非常小的事情。
3、Content Provider
(1)定义:管理app共享数据集合的组件,只要该组件允许,其他的app就可以对其进行读写操作,例如:通讯录、图库、视频、音频。
(2)通过ContentSolver,发送数据请求,接受请求结果并返回。
(3)使用ContentProvider会是应用的数据被其他应用共享,所以应谨慎使用,例如:搜索联想建议、copy/paste本应用的复杂数据到其他应用中。
4、Service
(1)定义:是一个不需要提供与用户进行交互UI的,运行在后台,进行长时间操作或者远程操作的组件。
(2)Service的两种使用类型:Started和Bound
Started在onStartCommend()方法中接受返回值操作,需要开发者自己管理的启动与停止。
Bound 是将服务绑定到某一个或某些特定的组件上,不需要开发者关心服务的停止,当该服务上的绑定的组件都解绑时该服务会自动销毁。
(3) StartService()启动会激活并将结果返回到onStartCommend()中;BindService()方法激活onBind()方法。
(4)使用技巧:在onCreate()实现服务初始化,针对不同的启动类型选择相应的回调方法处理Service信息,在onDestory()中回收资源,例如线程、监听、广播接受等等,最重要的一点你的服务需要在配置文件中声明,同时为了保证你app的安全性最好设置exported属性为false,但是你的谨慎设置你的enabled属性,他决定你的service能否被实例化,尤其在绑定服务。
(5)什么时候用Thread什么时候用Service?
前因:Service默认运行在当前app进程的主线程中,如果在Service做耗时操作,将有可能导致ANR的发生,耗时操作需要放到线程,但是Service适合执行在后台且不需要与用户进行交互和返回数据的情形,如果需要在Service中做耗时操作,则需要在Service中开启线程,其中有很多种选择:AsynTask、HandleThread或者继承自带工作线程的IntentService。
5 、总结
(1)Activity、Broadcast Receiver、Service通过传递意图参数启动(激活),并且这三者之间可以通过Intent互相交流,Content Provider不需要,它通过Content Resolver启动(激活)
(2)四大组件都需要被声明且都具有静态声明的方式,但是Broadcast Receiver提供了一种动态声明的方式:registerReceiver().
三、配置文件-mainfest
1、作用:声明app权限、组件、版本
2、在Android Studio中,版本控制等设置属性被迁移到了当前Gradle中,区别Eclipse Ant只能在配置文件内设置.
四、UI
1、手机坐标
默认的左上角坐标为(0,0),水平方向为x轴,垂直方向为y轴
2、布局
(1)LinearLayout-线性布局 属于ViewGroup类
(1 特点:子布局呈线性分布,在同一时间只能呈现出一个方向的显示效果,通过orientation设置
(2 layout_gravity:是指当前布局,在最靠近它的父布局中的位置
(3 gravity:设置当前布局内部,子布局的具体位置
(4 layout_weight为当前布局设置在父布局中的权重,但是要注意要将相应方向的属性值设置为0dp,例如:设置水平方向等分,应将layout_width设置为0dp,默认values是0。
(2)RelativeLayout-相对布局 也属于ViewGroup类
(1:当出现多个LinearLayout嵌套的时候,可以采用RelativeLayout提高效率(具体用布局分析工具查看)
(2:具有两种设置位置的方式:一是根据与父布局的相对关系确定;二根据父布局内以确定子布局的位置的相对位置确定;
(3)FrameLayout-帧布局
(4)GridView+ListView
3、计量单位
(1)px、sp(设置文字大小的)、dp(除了文字大小以外的尺寸)
4、TextView、Button、EditView、ImageView
5、R文件
6、View类
(1)onMeasure()\onLayout()\onDraw();
7、回调机制之OnClickListener
8、沙盒
(1)app安装到设备之后,系统便会为app分配一块安全区域的“空间”,称之为sandbox(沙盒)
(2)作用:
(1:首先Android OS是一个多用户的Linux系统,是每个app成为了多用户的一份子
(2:系统通过一个独一无二的Linux user ID管理app,但是app本身并不知道它自己的ID
(3:保证了每一个app都独立运行在自己的进程中,而且app之间运行过程互不影响。
(4:Android 系统在app中的组件需要被执行的时候,通过ID开启他们的进程,当app长时间不执行或者系统需要回收内存为其他app提供资源的时候回关掉当前app。
(5:通过最小权限原则保证用户的可以正常运行的权限,其他权限交由用户自己选择是否开启,这样营造了一个Android所谓的安全稳固的环境。
(3)提供了两种方式,打破沙盒限制,实现多个app之间的数据共享以及app可以接入到系统的服务。
(1:通过设置相同的Linux user ID,是多个app运行在一个进程里,可以互相访问彼此文件,相同的Linux 进程可以共享具有相同证书签名的VM里。
(2:在app首次安装的时刻,会让用户准许需要的权限,实现用户接入到系统权限(通讯录,摄像头、蓝牙、SD等等)的目的。
9、设备适配
(1)主要通过App Resource文件下的内容,达到适配的效果.
(2)分类:语言适配、SDK 平台的适配、屏幕尺寸的适配,如果要兼容不能适配的设备,根据以上三种分类,在代码中动态的判断。
(3)语言适配:通常的做饭为应用提供支持的语言包,并将语言包存放的合适路径的strings.xml中,比如我要支持在中文的基础上额外的支持英文,可创建一个values-en文件夹,将values里面strings.xml的中文内容对应的翻译到该文件夹下的strings.xml中,需要注意的是string的name属性应该保持一致。
(4)屏幕适配:又分为尺寸small、normal、large、xlarge,对应着布局的文件夹layout,其中layout-land对应的是横屏状态的屏幕布局。另外,还通过密度区分,主要作用域图片的文件夹drawable-ldpi、mdpi、hdpi、xdpi等等。
(5)平台适配:主要值得是v系列包的向下兼容,例如
android.app.Activity.Fragment和android.app.Activity.v4.Fragment的使用问题,前者只能在3.0之后使用,二后者可以兼容3.0之前的版本,让其可以使用Fragment。
10、权限系统
(1)安全证书(认证)
(2)应用签名(非对称加密+证书认证):用来区分应用开发者。可以允许操作系统授权或者拒绝应用程序使用签名级别权限和操作系统授予或者拒绝应用程序请求或者拒绝应用程序使用相同的Linux身份。
(3)通过Linux进程ID实现应用间的文件共享
(4)自定义权限:
<permission android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY"
android:label="@string/permlab_deadlyActivity"
android:description="@string/permdesc_deadlyActivity"
android:permissionGroup="android.permission-group.COST_MONEY"
android:protectionLevel="dangerous" />
11、Intents and Intent Filters
(1)定义:Android通知其他组件的执行某种行为操作的信息对象。
(2)使用:启动Activity(两种方式)、启动Service(两种方式)、deliver Broadcast(两种方式)
(3)Intent 分类:
(1直接(显式)意图:当你启动一个直接意图时,系统会立即在当前app根据意图携带的内容,执行相应的操作。
(2 间接(隐式)意图:当启动一个叫间接意图时,系统会找到合适的组件去启动,所谓合适的组件就是在当前设备上所有app符合Intent Filter所过滤的内容的组件,如果只有一个符合要求的会直接启动,如果存在多个符合要求的组件,系统会弹出dialog让用户自己选择哪个组件去执行意图操作。
(4)Intent Filter
(1 定义:在配置文件里面指定你当前的组件能够接受的Intent Type,例如,你为你的组件声明了Intent Filter,其他的应用就可通过该Filter启动你的组件了。
(2 注意: 如果你想确保你的程序组件是安全的,尽量不要为你的app 组件设定Intent Filter,而是用直接(显式)意图实现Intent Filter的功能。
(3 针对Service的 bindService(),5.0以后不允许通过间接(隐式)意图的方式调用。
(5)Intent
(1 Note: When starting a Service, you should always specify the component name. Otherwise, you cannot be certain what service will respond to the intent, and the user cannot see which service starts.
(2 三种指定Intent组件的方式:完整的类名(含包名);调用setComponent(),setClass(), setClassName();用 Intent 构造函数。
(6)Note:如果使用隐式意图,设备上的app无法响应你的意图,你的app 将会终止,所以需要判断自己设定的Action是否有应答,通过该方法intent.resolveActivity(params);
12、Common Intents(通用的意图)
(1)具体Intents:
(2)现在Google支持在自己的app 中添加intent-filter,接受其他app请求的Common Intents
13、Loaders
(1)定义:3.0以后引入的,为Activity和 Fragment简化异步加载数据的工具。主要作用:自动更新最新的内容,向显示器及时更新显示最新数据,通常获取到的都是CursorLoader对象,例如,通讯录搜索联系人结果列表;
(2)主要方法:
(1 启动Loader加载器:initLoader()
(2 重新刷新数据restartLoader()
(3 监听Loader的状态(创建、完成加载、重置加载内容)
(4 读取通讯录的源码查看开发文档
14、Tasks and Back Stack
(1)Task是Activity的集合,用户与这Task里的Activity进行交互、并且这些Activity是有序的存储在Back Stack里面的。
(2)Task进入后台,它的Activity全部停止,但是Back Stack存储了各个Activity的状态,等待Task重新执行的时候,重新resume Activity
(3)管理Task--launchMode
(1 standard(默认方式):在Task中Activity数量随创建的次数增加,及一个Task中可以存在多个“重复”的Activity。
(2 singleTop:当在当前Task的Back Stack的栈顶存在需要被调用的Activity时,将不会在重新创建该Activity,而是将Intent的内容交于onNewIntent()方法处理。与FLAG_ACTIVITY_SINGLE_TOP作用一致。
(3 singleTask: 当前的或者其他Task中存在某个将要被调用的Activity,该Activity不会再创建,而是将Intent的内容交于onNewIntent()方法处理。与FLAG_ACTIVITY_NEW_TASK作用一致。
(4 singleInstance:跟singleTask类似,唯一区别是这种模式下允许多个Task可以拥有该Activity实例
(4)taskAffinity可以指定当前Activity期望存在的Task名称,
即如果两个Activity的Task的taskAffinity相同以singleTask方式启动Activity时,会将这两个Activity放到同一个Task中。
(5) 如果一个 .apk 文件中包含了多个“application”,你可能需要用 taskAffinity 属性来指定每个“application”中 activity 的 affinity 值。
(6)生命周期图略
(7)
对于那些不想让用户返回的 activity,把 <activity> 元素的 finishOnTaskLaunch 设为 "true" 即可。
15.Fragment
(1)生命周期常用方法
(2)与Activity生命周期的关系
(3)为Activity添加一个没有UI的Fragment
(1 Tag是其唯一的标示
(2 可以执行以下不需要交互的后台操作,比如开启线程更新进度条实例:FragmentRetainInstanceSupport.java位于:(sdk\extras\android\support\samples\Support4Demos\src\com\example\android\supportv4\app)
· Fragment之间一些比较有趣的方法:setTargetFragment()\setRetainInstance(true)该方法对Fragment生命周期有这很大的影响:onDestroy() will not be called (but onDetach() still will be, because the fragment is being detached from its current activity).
· onCreate(Bundle) will not be called since the fragment is not being re-created.
后者可以配合没有UI的Fragment进行数据量较大的现场保存公共,实现类似onRestoreInstanceState()等恢复现场的方法。
(4)通过回调实现Activity和Fragment的通信,具体步骤:在Fragment中定义接口,在Activity中实现该接口
(5)Fragment经典用法,为横屏和竖屏设置两套布局,横屏有一个Activity两个fragment,二竖屏情况下两个Activity+两个Fragment组成。第一种情况下,屏幕横屏状态布局显示为左边是列表状态,而右边是详细内容。
三、实战:青岛美食城项目
(1)SharedPerferences数据存取
(1:匿名的SharedPerferences.getPerference(String)通过String参数只在Activity内部中使用。
(2:SharedPerferences.getSharedPerferences(String, int)通过String参数,在app范围内使用,通过int控制使用范围是否可以与其他app共享,api17之后只建议在app内容使用即int参数只支持MODE_PRIVATE;
(3:拓展Android的常见的五种存储方式
<1>键值对的存储方式:SharePerferences,如上面介绍的那样。
<2>内部存储器特点:对app是私有化访问的,app卸载内容清空,内存不够系统会自动回收该部分的内存。
<3>外部存储:分为两种一种设备自带的,另一种常用的SD卡,对于设备来说可以被其他app共享的存储器。
注意:
<manifest ...>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
...
</manifest>
:操作外部存储器需要获取读写权限,但是在4.4以后访问app自己的私有文件是不需要权限的。
getExternalStorageState():使用的时候要先判断存储器的状态,如果存在存储器再进一步进行操作。
getExternalStoragePublicDirectory():想要将自己的数据与其他app共享,需要存储到系统提供的公共的文件目录下,比如:图库、音乐、零食等文件夹下(Music/, Pictures/, Ringtones/)传递的参数分别为:DIRECTORY_MUSIC, DIRECTORY_PICTURES,DIRECTORY_RINGTONES
<4>数据库存储:数据库存储的是结构化的数据,对于app来说是私有的。
<5>网络请求(云存储):需要流量请求的数据。使用的操作方法:
Java.net.*/Android.net.*
(2)Json数据手动与自动解析
(3)网络请求_Volley
(4)RecyclerView列表
(5)WebView
<1><WebView>控件:是Android提供给开发者的一个加载网页的控件。可以用来加载web页面,添加js方法实现交互、添加接口实现web页面与原生控件的交互,同时也可以监听网页的加载全过程信息反馈,最重要的的
四、动画
1、动画分类:属性动画、视图动画;视图动画又分为补间动画、帧动画。
补间动画(View Animation)
定义:只针对View及其子类的动画。
常用属性:位移、缩放、透明度、旋转。通过在res/anim中添加xml文件来实现,常用的标签<set><alpha><rotate><scale><translate>,通过AnimationUtils来加载xml动画,并返回Animation对象。View通过该对象设置动画。实例:Animation hyperspaceJumpAnimation
= AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
2、帧动画(Drawable Animation)
定义:针对res/drawable的图片资源实现类似幻灯片切换的动画。该动画的设置同样是通过xml来设置的。同时该xml动画文件是应该存放在res/drawable文件目录下的。
特点:逐帧播放,每一帧对应一张图片,在xml中常用的标签<animation-list><item>
3、属性动画(Property Animation)
定义: 3.0 API11之后加入,不局限于View的动画,所有的对象都可以使用该动画,这就决定了具备动画的控件不一定要在屏幕上显示,它还可以是“幕后”对象。
以上是关于Android培训Android课堂重点内容汇总的主要内容,如果未能解决你的问题,请参考以下文章