Android《第一行代码》第1~3章 笔记

来源:互联网 发布:车载网络硬盘录像机 编辑:程序博客网 时间:2024/04/30 13:22

安卓之前学过一些,现在想要重新的系统学习一下。这几天开始看《第一行代码》,并详细地敲了敲里面的相关代码。已经看了前三章的内容,下面就对前三章的知识点进行一下梳理,使自己更加熟悉这些知识点,增强对其的掌握。

第一章

第一章对Android各个方面做了简单的介绍。首先是安卓的系统架构。四层架构:Linux内核层,为Android设备的个各种硬件提供了底层驱动;系统运行库层,通过一些C/C++库来为Android系统提供了主要的特性支持,在这一层的还有Android运行时库,允许开发者用Java语言编写Android应用;应用框架层, 提供构建应用程序的各种API;应用层,手机上的应用程序。

并介绍了Android的四大组件:活动(Activity),服务(Service),广播接收器(Broadcast Receiver)和内容提供器(Content Provider)。

也传授了我们如何搭建开发环境,Android SDK是Android开发工具包;ADT,即Android Development Tools,是高度集成的Android开发环境。

以及日志工具Log的使用,例如,Log.d方法有两个参数,第一个参数是tag,用于对打印信息进行过滤,第二个参数是msg,即想要打印的具体内容。简单介绍了过滤器,我们可以自己添加过滤器方便我们进行日志查看。LogCat的日志级别控制从低到高分别是verbose,debug,info,warn,error。

第二章

第二章对活动进行了详细的介绍。活动(Activity)是一种包含用户界面的组件,主要用于和用户进行交互。

布局中一些元素的属性:android:id 是给元素定义唯一标识符;android:layout_width指定当前元素的宽度;android:layout_height指定当前元素的高度。高度为wrap_content指高度刚好包含里面的内容,宽度为match_parent指当前元素和父元素一样宽。

在Activity类的代码中,setContentView()方法是给当前的活动加载一个布局,传入的参数为布局文件的id。

所有活动需要在AndroidManifest文件中注册。

可以用requestWindowFeature(Window.FEATURE_NO_TITLE)来隐藏标题栏,要注意它要在setContentView前执行。

活动中可以使用Toast,可以将短小的信息提示给用户。例如Toast.makeText(FirstActivity.this,"You clicked Button 1",Toast.LENGTH_SHORT).show(),通过makeText方法创建一个Toast对象,调用show()将Toast显示出来。makeTest方法的三个参数分别为Context,即Toast要求的上下文;要显示的文本内容和Toast的显示时长。

findViewById()方法可以获得在布局文件中定义的元素。

关于Menu的使用,先创建menu的XML文件,可以通过重写onCreateOptionsMenu()方法,getMenuInflater().inflate(R.menu.main,menu) 来创建菜单,通过getMenuInflater()得到MenuInflater对象,再调用它的inflate()方法来给当前活动创建菜单,重写onOptionsItemSelected()方法可以定义菜单响应事件。

销毁活动可以Back键,或者在代码中用finish()方法。

之后详细介绍了使用Intent在活动中不断地跳转。Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent);上述是一种显式Intent的跳转方式,构建出一个Intent,以FirstActivity.this作为启动活动的上下文, 以SecondActivity.class作为想要启动的目标活动,再通过startActivity()方法来启动活动。隐式Intent指不明确指出想要启动的活动,而是指定一系列更抽象的action和category等信息,由系统进行分析并找出合适的活动启动。隐式Intent还可以启动其他程序的活动,可以调用系统的浏览器、系统拨号界面等等。也可以利用Intent向下一个活动传递数据,通过putExtra()方法将想要传递的数据暂存在Intent,在另一个活动中用getStringExtra()等方法取出即可。并且可以通过startActivityForResult()来启动活动,该方法接受两个参数,第一个为Intent,第二个参数是请求码,用于在回调中判断数据来源,然后通过setResult()方法来向上一个活动返回数据,第一个参数用于向上一个活动返回处理结果,一般使用RESULT_OK和RESULT_CANCELED两个值,第二个参数是把带有数据的Intent传递回去,之后会调用上一个活动重写的onActivityResult()方法,第一个参数为请求码,第二个参数为处理结果,第三个参数为携带返回数据的Intent,先判断数据来源,再判断处理结果是否成功,再对返回的数据进行相关处理。可以通过重写onBackPressed()方法来处理按Back键返回时要返回数据的情况。

之后介绍了活动的生命周期,Android是使用任务来管理活动的,一个任务即一组放在返回栈(Back Stack)的活动的集合,启动新活动后新活动入栈顶,销毁活动时栈顶活动出栈,系统显示栈顶活动给用户。活动在其生命周期中可能会有四种状态:运行状态,当一个活动位于返回栈栈顶时;暂停状态,一个活动位于返回栈栈顶但仍然可见时;停止状态,一个活动不再处于返回栈栈顶且完全不可见时;销毁状态,一个活动从返回栈移除后。Activity类定义了七个回调方法:onCreate(),活动第一次被创建时调用;onStart()活动由完全不可见变为可见时调用;onResume(),活动在栈顶准备好和用户交互时调用;onPause(),系统准备去启动或者回复另一个活动时调用;onStop(),活动完全不可见时调用;onDestroy(),活动被销毁前调用;onRestart(),活动由停止状态变为运行状态前调用。活动分为三个生存期:完整生存期,onCreate()和onDestroy()之间;可见生存期,onStart()和onStop()之间;前台生存期,onResume()和onPause()之间。

Activity中提供了onSaveInstanceState()方法,可以用来解决活动被回收时临时数据得不到保存的问题。会携带一个Bundle类型的参数用于保存数据。通过putString()方法保存字符串,putInt()方法保存整型,每个保存方法两个参数,第一个为键,第二个为真正保存的内容。通过在onCreate()方法中取出之前保存的数据。

活动有四种启动模式,可以通过在AndroidManifest.xml中给<activity>标签指定android:launchMode属性来选择启动模式。standard是默认的启动模式,每次启动都会创建该活动的一个新的实例;singleTop在启动时若返回栈栈顶已经是该活动,则不会再创建新的实例;singleTask是返回栈中若已经存在该活动的实例,则直接使用该实例,并把在这个活动之上的所有活动统统出栈;singleInstance是为了实现其他程序和我们的程序共享一个活动的实例,用一个单独的返回栈来管理该活动。

可以通过自己新建BaseActivity,重写onCreate方法,在其中通过getClass().getSimpleName()的方式打印当前活动类名,再让所有现在的活动都继承自BaseActivity,这样就能通过程序当前界面就判断出是哪个活动。

可以通过新建一个ActivityCollector类作为活动管理器,用List暂存活动,写一个addActivity()方法添加活动,removeActivity()方法移除活动,finishAll()方法销毁List中所有活动,再修改BaseActivity的onDestory()方法,让其调用removeActivity()方法。这样就实现了随时随地地可以退出程序,在想要退出的地方调用finishAll()方法即可。

可以在活动中添加actionStart()方法来获得启动时需要的数据,解决项目开发中的对接问题。

第三章

第三章对UI控件进行了介绍。

TextView使用android:id给控件指定唯一标识符,使用android:layout_width指定控件宽度,android:layout_height指定控件高度,可选值有match_parent、fill_parent和wrap_content,fill_parent和match_parent表示控件大小和父布局一样,官方推荐用match_parent,wrap_content是控件内容决定当前控件大小,android:text指定TextView显示的文本内容。TextView文本默认居左上角对齐,可以使用android:gravity来指定文字的对齐方式。通过android:textSize指定文字大小,android:textColor指定文字的颜色。

Button可以在活动中为其的点击事件增加监听器,即setOnClickListener,可以采用匿名类以及实现接口两种方式。

EditText允许用户在控件里输入编辑内容,可以用android:hint来指定一段提示性内容,可以用android:maxLines指定EditText的最大行数,当输入内容超过最大行数时文本会向上滚动,EditText不会继续拉伸。

ImageView用于在界面上展示图片,在xml布局文件中通过android:src指定图片的路径,也可以在程序中通过代码动态更改图片,即imageView.setImageResourse()方法。

ProgressBar用于在界面中显示进度条。可以通过android:visibility指定控件是否可见,有三个可选值,visible表示可见,默认值即为visible,invisible表示控件不可见但仍然占据原来的位置和大小,gone表示不可见且不占据屏幕任何空间。也可以通过代码setVisibility()方法来设置控件的可见性。可以用getVisibility()方法来判断是否可见。通过style="?android:attr/progressBarStyleHorizontal"可以将原来的圆形进度条指定成水平进度条,android:max可以设置进度条的最大值,getProgess()能获得当前的进度,setProgress()能动态地更改进度。

AlertDialog可以在当前界面弹出一个对话框,置顶于所有界面元素之上,屏蔽掉其他控件的交互能力,一般提示非常重要的内容或者警告信息。通过AlertDialog.Builder创建一个AlertDialog的实例,setTitle()设置标题,setMessage()设置内容,setCancelable()设置可否取消,setPositiveButton()设置确定按钮的点击事件,setNegativeButton()设置取消按钮的点击事件,用show()显示出对话框。

ProgressDialog会在对话框显示一个进度条,一般表示当前操作比较耗时,让用户耐心等待。

Android有四种最基本的布局:LinearLayout线性布局,即所有控件在线性方向上依次排列,通过android:orientation属性指定排列方向,vertical为垂直,horizontal为水平,默认的排列方向为水平。如果排列方向为horizontal,则内部控件的宽度不能指定为match_parent,这样会将整个水平方向占满。排列方向为vertical时内部控件不能将高度指定为match_parent。android:layout_gravity用于指定控件在布局的对齐方式,之前的android:gravity是指定文字在控件中的对齐方式。当LinearLayout的排列方向是horizontal时,只有垂直方向上的对齐方式才会生效,同样的,vertical时只有水平方向上的对齐方式才会生效。android:layout_weight允许我们使用比例的方式指定控件的大小。比如在使用了layout_weight后,规范的写法是将不起作用的android:layout_width指定为0。

RelativeLayout是相对布局,可以通过android:layout_alignParentLeft、android:layout_alignParentTop、android:layout_alignParentRight、android:layout_alignParentBottom、android:layout_centerInParent来使控件相对于父布局进行定位。可以通过android:layout_above让一个控件位于另一个控件的上方,一个控件引用另一个控件的id时,该控件需定义在引用控件的后面,android:layout_toLeftOf、android:layout_toRightOf、android:layout_below也是相对于另一个控件的左边、右边、下方。android:layout_alignLeft是让一个控件的左边缘和另一个控件的左边缘对齐,layout_alignRight、layout_alignTop、layout_alignBottom分别是右边缘,上边缘,下边缘对齐。

FrameLayout没有任何定位方式,所有控件都摆放在布局的左上角。

TableLayout是使用表格的方式排列控件,每一个TabliRow就是在表格上添加一行,在TableRow中每添加一个控件就是在该行加了一列,android:layout_span可以指定控件占据的列数。android:stretchColunmns可以指定让TableLayout的某一列进行拉伸,达到自动适应屏幕宽度的作用,0为第一列,1为第二列,以此类推。

所有控件直接或间接继承自View,所有布局直接或间接继承自ViewGroup。View是Android中最基本的UI控件,可以在屏幕上绘制一块矩形区域,并响应这块区域的各种事件。

很多个活动需要同一个布局时可以采用引用布局的方式,比如新建一个布局文件title.xml,在其他要引用该布局的布局中用include语句,<include layout = "@layout/title"/>即可引用。

android:layout_margin属性可以指定控件在上下左右方向偏移的距离。也可以用android:layout_marginTop 或 android:layout_marginLeft单独指定控件在某个方向上偏移的距离。

可以创建自定义控件来解决控件注册事件需要重复注册的问题。比如新建一个TitleLayout继承自LinearLayout,重写其带两个参数的构造函数TitleLayout(Context context,AtrributeSet attrs),在构造函数中借助LayoutInflater对布局进行动态加载。通过LayoutInflater的from()方法构建出一个LayoutInflater对象,然后调用inflate()方法动态加载一个布局文件,inflate()方法接收两个参数,第一个参数是要加载的布局文件id,第二个参数是给加载好的布局再添加一个父布局。再在布局文件中添加这个自定义控件即可,添加时要指明控件的完整类名。并在TitleLayout中为控件注册事件即可。

ListView用于展示大量的数据,允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。可以通过ArrayAdapter将适配的数据传递给ListView。向ArrayAdapter的构造函数中传入当前上下文,ListView子布局的id以及适配的数据,再调用ListView的setAdapter()方法即可建立ListView和数据之间的关联。

可以通过自己定义一个实体类作为ListView适配器的适配类型,再为ListView的子项指定一个自定义的布局。再创建一个自定义的适配器,继承自ArrayAdapter,重写父类的构造函数,并重写getView()方法,这个方法在每个子项被滚动到屏幕内的时候被调用。在getView方法中通过getItem(position)得到当前项的实例,使用LayoutInflater为这个子项加载传入的布局,并获得布局中对应控件的实例,进行相应设置即完成了适配器。再在活动中创建该适配器传递给ListView即可。这样做的运行效率比较低,英文getView()方法会每次将布局重新加载一遍,所以可以利用getView()方法中的convertView参数,用于将之前加载好的布局进行缓存,之后可以重用。并可以创建一个内部类ViewHolder来对布局中控件的实例进行缓存,将控件实例保存在ViewHolder中用View的setTag()方法将ViewHolder对象存储在View中,当convertView不为空时,调用getTag()方法取出,这样就不用每次都通过findViewById()方法来获取控件实例了。ListView也可以通过setOnItemClickListener方法来注册监听器的点击事件。

px是像素,即屏幕中显示的最小元素单元。pt是磅数,用于作为字体的单位。但是手机的分辨率各不相同,就会导致同样px的控件在不同屏幕上显示的效果完全不同。所以Android引入了新的单元dp和sp。dp是密度无关像素,也被称作dip,在不同密度的屏幕中显示比例保持一致。sp是可伸缩像素,解决文字大小的适配问题。Android中的密度是屏幕每英寸包含的像素数,以dpi为单位,密度值越高屏幕显示的效果就越精细。在160dpi的屏幕上,1dp为1px,在320dpi的屏幕上,1dp为2px。所以使用dp指定控件的宽和高可以保证控件在不同密度的屏幕中显示比例保持一致。sp原理和dp一样。

Nine-Patch图片是被特殊处理过的png图片,可以指定图片在需要拉伸时只拉伸指定区域。


0 1
原创粉丝点击