【网学网提醒】:网学会员为大家收集整理了android考试复习资料提供大家参考,希望对大家有所帮助!
Unit4.Android生命周期Android系统中的进程优先级由高到低
高优先级前台进程
可见进程中优先级服务进程
后台进程低优先级空进程
Android组件组件是可以调用的基本功能模块,Android应用程序就是由组件组成的Android系统有四个重要的组件,分别是Activity、Service、BroadcaseReceiver和ContentProviderActivity是Android程序的呈现层,显示可视化的用户界面,Android应用程序可以包含一个或多个Activity,一般在程序启动后会呈现一个Activity。Service用于没有用户界面,但需要长时间在后台运行的应用BroadcaseReceiver是用来接受并响应广播消息的组件ContentProvider是Android系统提供的一种标准的共享数据的机制,应用程序可以通过ContentProvider访问其他应用
程序的私有数据,私有数据可以是存储在文件系统中的文件,也可以是SQLite中的数据库Activity表现为四种状态,分别是活动状态、暂停状态、停止状态和非活动状态
Activity事件的回调函数:protectedvoidonStart();protectedvoidonRestart();protectedvoidonResume();protectedvoidonPause();protectedvoidonStop();
protectedvoidonDestroy();Activity:
123
onRestoreInstanceState
4
5
onSaveInstanceState
7
onPause
8
9
onResume
onStartonCreate
onStop
6
onRestart
onDestroy
活动生命周期可视生命周期全生命周期
Android系统提供了两种调试工具LogCat和DevTools,用于定位、分析及修复程序中出现的错误LogCat程序调试原理1.引入android.util.Log包2.使用Log.v(),Log.d(),Log.i(),Log.w()和Log.e()五个函数在程序中设置“日志点”3.当程序运行到“日志点”时,应用
程序的日志信息便被发送到LogCat中4.判断“日志点”信息与预期的内容是否一致E.g.finalstaticStringTAG="LOGCAT";Log.v(TAG,"Verbose");DevTools是用于调试和测试的工具,包括了一系列用户各种用途的小工具Unit5.Android用户界面常见的系统控件包括TextView、EditText、Button、ImageButton、Checkbox、RadioButton、Spinner、ListView和TabHostTextView:显示字符串,EditText是一个具有编辑功能的TextView:相应的XML文件:
Test.java:TextViewtxv=(TextView)findViewByID(R.id.TextView01);txv.setText("User:");ImageButton:将img1拷贝到/res/drawable文件夹下(R.java中自动更新)imageButton.setImageResource(R.drawable.img1);
按钮响应点击事件:添加点击事件的监听器imageButton.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewview)点击事件的回调函数{txv.setText("ImageButton按钮");}})每个View仅可以注册一个点击事件的监听器,如果使用setOnClickListener()函数注册第二个点击事件的监听器,之前注册的监听器将被自动注销.多个按钮注册到同一个点击事件的监听器上,代码如下:Button.OnClickListenerbuttonListener=newButton.OnClickListener(){@OverridepublicvoidonClick(Viewv){switch(v.getId()){caseR.id.Button01:textView.setText("Button按钮");return;caseR.id.ImageButton01:textView.setText("ImageButton按钮");return;}}};button.setOnClickListener(buttonListener);imageButton.setOnClickListener(buttonListener);CheckBox和RadioButton:怎样定义同组中的RadioButton?XML中:
Test.java中:RadioButtonradioButton1=(RadioButton)findViewById(R.id.RadioButton01);RadioButton.OnClickListenerrblistener=newRadioButton.OnClickListener(){publicvoidOnClick(Viewv){//process;}};radioButton1.setOnClickListener(rblistener);Spinner:(similartoComboBox)Test.java:Spinnerspinner=(Spinner)findViewById(R.id.Spinner01);Listlist=newArrayList();list.add("item1");list.add("item2");ArrayAdapteradapter=newArrayAdapter(this,android.R.layout.simple_spinner_item,list);//数组适配器能够将界面控件和底层数据绑定在一起adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);spinner.setAdapter(adapter);ListView:(垂直显示的列表控件垂直显示的列表控件)垂直显示的列表控件ListViewlistv=(ListView)findViewById(R.id.ListView01);Listlist=newArrayList();List.add("item1");List.add("item2");ArrayAdapteradapter=newArrayAdapter(this,android.R.layout.simple_list_item_1,list);listv.setAdapter(adapter);AdapterView.OnItemClickListenerlistvListener=newAdapterView.OnItemClickListener(){publicvoidonItemClick(AdapterView>arg0,Viewarg1,intarg2,longarg3){Stringmsg=””;textView.setText(msg);}};
}TabHost:实现多个分页之间的快速切换(SimilartoTabControl)有几个tabpage就建立几个xmlTest.java:publicclassTabDemoextendsTabActivity{//普通的都是extendsActivity//与以往继承Activity不同,TabActivity支持内嵌多个Activity或ViewpublicvoidonCreate(BundlesavedI
nstanceState){super.onCreate(savedInstanceState);TabHosttabHost=getTabHost();//获得Tab标签页的容器LayoutInflater.from(this).inflate(R.layout.tab1,tabHost.getTabContentView(),true);//LayoutInflater将tab1.xml文件中的布局转换为Tab标签页可以使用的View对象LayoutInflater.from(this).inflate(R.layout.tab2,tabHost.getTabContentView(),true);LayoutInflater.from(this).inflate(R.layout.tab3,tabHost.getTabContentView(),true);tabHost.addTab(tabHost.newTabSpec("TAB1").setIndicator("线性布局").setContent(R.id.layout01));//使用addTab()函数在tabHost上添加了第1个标识为"TAB1"的分页tabHost.addTab(tabHost.newTabSpec("TAB2").setIndicator("绝对布局").setContent(R.id.layout02));tabHost.addTab(tabHost.newTabSpec("TAB3").setIndicator("相对布局").setContent(R.id.layout03));}界面布局:声明Android程序的界面布局有两种方法:使用XML文件描述界面布局在程序运行时动态添加或修改界面布局用户既可以独立使用任何一种声明界面布局的方式,也可以同时使用两种方式使用XML文件声明界面布局的特点:将程序的表现层和控制层分离在后期修改用户界面时,无需更改程序的源代码可视化界面加快设计线性布局LinearLayout::如果垂直排列,则每行仅包含一个界面元素如果水平排列,则每列仅包含一个界面元素框架布局FrameLayout表格布局TableLayout:添加行为TableRow
相对布局(相对布局(RelativeLayout):)e.g.android:layout_below="@id/label"android:layout_alignParentRight="true"android:layout_toLeftOf="@id/cancel"android:layout_alignTop="@id/cancel"//声明与ID为cancel的元素在相同的水平位置绝对布局(绝对布局(AbsoluteLayout))android:layout_x="40dip"android:layout_y="40dip"菜单:Android系统支持三种菜单:选项菜单(OptionMenu)子菜单(Submenu)快捷菜单(ContextMenu)选项菜单分为图标菜单(IconMenu)&;扩展菜单(ExpandedMenu)。图标菜单能同时显示文字和图标的菜单,最多支持6个子项,但不支持单选框和复选框扩展菜单是在图标菜单子项多余6个时才出现,是垂直的列表型仅有文字菜单重载Activity的onCreateOptionMenu()函数,才能在Android应用程序中使用选项菜单publicbooleanonCreateOptionsMenu(Menumenu){menu.add(0,MENU_DOWNLOAD,0,"下载设置");//MENU_DOWNLOAD=1//MenuItemandroid.view.Menu.add(intgro
upId,intitemId,intorder,CharSequencetitle)menu.add(0,MENU_DOWNLOAD,0,"下载设置").setIcon(R.drawable.download);.setShortcut(’,’d’);//快捷键returntrue;}重载onPrepareOptionsMenu()函数,能够动态的添加、删除菜单子项,或修改菜单的标题、图标和可见性等内容
E.g.下面的代码是在用户每次打开选项菜单时,在菜单子项中显示用户打开该子项的次数publicbooleanonPrepareOptionsMenu(Menumenu){MenuItemuploadItem=menu.findItem(MENU_UPLOAD);uploadItem.setTitle("上传设置:"+String.valueOf(MenuUploadCounter));returntrue;}onOptionsItemSelected()函数能够处理菜单选择事件,且该函数在每次点击菜单子项时都会被调用publicbooleanonOptionsItemSelected(MenuItemitem){switch(item.getItemId()){//获取到被选择菜单子项的IDcaseMENU_DOWNLOAD:MenuDownlaodCounter++;returntrue;caseMENU_UPLOAD:MenuUploadCounter++;returntrue;}returnfalse;}子菜单子菜单不支持嵌套,添加是使用addSubMenu()函数实现SubMenuuploadMenu=(SubMenu)menu.addSubMenu(0,MENU_UPLOAD,1,"上传设置").setIcon(R.drawable.upload);uploadMenu.setHeaderIcon(R.drawable.upload);uploadMenu.setHeaderTitle("上传参数设置");uploadMenu.add(0,SUB_MENU_UPLOAD_A,0,"上传参数A");uploadMenu.add(0,SUB_MENU_UPLOAD_B,0,"上传参数B");快捷菜单选项菜单中的onCreateOptionsMenu()函数仅在选项菜单第一次启动时被调用一次快捷菜单的onCreateContextMenu()函数每次启动时都会被调用一次菜单选择事件的处理需要重载onContextItemSelected()函数,该函数在用户选择快捷菜单中的菜单子项后被调用,与onOptionsItemSelected()函数的使用方法基本相同菜单在XML中的实现:
界面事件按键事件将传递给onKey()函数进行处理触摸事件将传递给onTouch()函数进行处理是否继续传递事件给其他处理函数是由事件监听器处理函数的返回值决定的,取决于监听处理函数返回值。按键事件:按键事件:entryText.setOnKeyListener(newOnKeyListener(){@OverridepublicbooleanonKey(Viewview,intkeyCode,KeyEventkeyEvent){intmetaState=keyEvent.getMetaState();intunicodeChar=keyEvent.getUnicodeChar();Stringmsg="";msg+="按键动作:"+String.valueOf(keyEvent.getAction())+"\n";msg+="按键代码:"+String.valueOf(keyCode)+"\n";msg+="按键字符:"+(char)unicodeChar+"\n";msg+="UNICODE:"+String.valueOf(unicodeChar)+"\n";msg+="重复次数:"+String.valueOf(keyEvent.getRepeatCount())+"\n";msg+="功能键状态:"+String.valueOf(metaState)+"\n";msg+="硬件编码:"+String.valueOf(keyEvent.getScanCode())+"\n";msg+="按键标志:"+String.valueOf(keyEvent.getFlags())+"\n";labelView.setText(msg);if(checkBox.isChecked())returntrue;elsereturnfalse;}触摸事件:触摸事件:重载onTouch
()函数touchView.setOnTouchListener(newView.OnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){//过程代码……returntrue/false;})TextViewtouchView=(TextView)findViewById(R.id.touch_area);touchView.setOnTouchListener(newView.OnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){intaction=event.getAction();switch(action){case(MotionEvent.ACTION_DOWN):
...break;case(MotionEvent.ACTION_UP):...break;case(MotionEvent.ACTION_MOVE):...break;}returntrue;}});Unit6组建通信与广播消息简述Intent的定义和用途。Define:Intent可称为一个在不同组件之间传递的消息,这个消息在到达接收组件后,接收组件会执行相关的动作Intent的用途:1.启动Activity和Service2.在Android系统上发布广播消息Intent可以实现不同Activity之间的切换和数据传递方式:启动Activity方式显式启动,必须在Intent中指明启动的Activity所在的类Intentintent=newIntent(IntentDemo.this,ActivityToStart.class);startActivity(intent);AndroidManifest.xml中注册这两个Activity:隐式启动,Android系统根据Intent的动作和数据来决定启动哪一个Activity,也就是说在隐式启动时,Intent中只包含需要执行的动作和所包含的数据,而无需指明具体启动哪一个Activity,选择权有Android系统和最终用户来决定Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse("google"));startActivity(intent);如果需要将子Activity的部分信息返回给父Activity(先启动的),则可以使用Sub-Activity的方式去启动子Activity(后启动的)E.g.父Activity::setContentView(R.layout.main);
btn1.setOnClickListener(newOnClickListener()//注册子启动Intent方式到btn1{PublicvoidonClick(Viewv){Intentintent=newIntent(ActivityComunication.this,SubActivity1.class);//第一个参数为当前应用程序上下文startActivityForResult(intent,Sub_index1);}})ProtectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata)//当子Activity关闭时,启动它的父Activity的onActivityResult()函数将被调用;{super.onActivityResult(requestCode,resultCode,data);switch(requestCode){//检测是哪个Intent发回来的caseSub_index1:if(resultCode==RESULT_OK){UriuriData=data.getData();textView.setText(uriData.toString());}break;caseSub_index2:break;}SubActivity1.java中:setContentView(R.layout.subactivity1);btnOK
.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewview){StringuriString=editText.getText().toString();Uridata=Uri.parse(uriString);Intentresult=newIntent(null,data);setResult(RESULT_OK,result);//将Intent作为返回值,RESUIT_OK作为结果码,传递给父Activityfinish();//关闭当前的子Activity}SubActivity2.java中:btnReturn.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewview){setResult(RESULT_CANCELED,null);finish();}});
简述Intent过滤器的定义和功能。Define:Intent过滤器是一种根据Intent中的动作(Action)类别、(Categorie)和数据(Data)等内容,对适合接收该Intent的组件进行匹配和筛选的机制Function:Intent过滤器可以匹配数据类型、路径和协议,还包括可以用来确定多个匹配项顺序的优先级(Priority)应用程序的Activity组件、Service组件和BroadcastReceiver都可以注册Intent过滤器,则这些组件在特定的数据格式上就可以产生相应的动作
3.简述Intent解析的匹配规则。Intent到Intent过滤器的映射过程称为“Intent解析”Intent解析可以在所有的组件中,找到一个可以与请求的Intent达成最佳匹配的Intent过滤器Intent解析的匹配规则:1.Android系统把所有应用程序包中的Intent过滤器集合在一起,形成一个完整的Intent过滤器列表2.在Intent与Intent过滤器进行匹配时,Android系统会将列表中所有Intent过滤器的“动作”和“类别”与Intent进行匹配,任何不匹配的Intent过滤器都将被过滤掉。3.把Intent数据Uri的每个子部与Intent过滤器的标签中的属性进行匹配.4.如果Intent过滤器的匹配结果多于一个,则可以根据在标签中定义的优先级标签来对Intent过滤器进行排序,优先级最高的Intent过滤器将被选择.
Unit8.数据存储与访问简单存储SharedPreferences是一种轻量级的数据保存方式通过SharedPreferences可以将NVP(Name/ValuePair,名称/值对)保存在Android的文件系统中,而且SharedPreferences完全屏蔽的对文件系统的操作过程SharedPreferences支持三种访问模式:私有、全局读、全局写读写都用getSharedPreferences()函数publicstaticfinalStringPREFERENCE_NAME="SaveSetting";publicstaticintMODE=Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE;//读&;写SharedPreferencessharedPreferences=getSharedPreferences(PREFERENCE_NAME,MODE);//写SharedPreferences.Editoreditor=sharedPreferences.edit();editor.putString("Name","Tom");editor.putInt("Age",20);editor.putFloat("Height",);editormit();//读Stringname=sharedPreferences.getString("Name","DefaultName");
intage=sharedPreferences.getInt("Age",20);floatheight=sharedPreferences.getFloat("Height",);//第二个值
是缺省值SharedPreferences文件就保存在/data/data//shared_prefs目录下数据库中信息以xml格式存储文件存储内部存储1.openFileOutput()2.openFileInput()外部存储外部存储Android的外部存储设备指的是SD卡(SecureDigitalMemoryCard),是一种广泛使用于数码设备上的记忆卡SD卡使用的是FAT(FileAllocationTable)的文件系统,不支持访问模式和权限控制使用/tools目录下的mksdcard工具创建SD卡映像文件资源文件将原始格式文件和XML文件分别存放在/res/raw和/res/xml目录下,供应用程序在运行时进行访问E.g.读取/res/raw/raw_file.txt文件,并将内容显示在界面上inputStream=resources.openRawResource(R.raw.raw_file);byte[]reader=newbyte[inputStream.available()];while(inputStream.read(reader)!=-1){displayView.setText(newString(reader,"utf-8"));};E.g.读取XML格式文件XmlPullParserparser=resources.getXml(R.xml.people);Stringmsg="";try{while(parser.next()!=XmlPullParser.END_DOCUMENT){Stringpeople=parser.getName();Stringname=null;Stringage=null;Stringheight=null;if((people!=null)&;&;people.equals("person")){intcount=parser.getAttributeCount();for(inti=0;i }elseif((attrName!=null)&;&;attrName.equals("height")){height=attrValue;}}if((name!=null)&;&;(age!=null)&;&;(height!=null)){msg+=":"+name+",年龄:"+age+",身高:"+height+"\n";数据库存储---SQLiteDatabase代码建库:重载onCreate()&;onUpgrade(),不由程序开发人员调用,由SQLiteOpenHelper类决定何时调用。SQLiteDatabase提供了SQLiteOpenHelper类提供对数据库的操作(就不用手写sql语句了)在Android系统中,数据库查询结果的返回值并不是数据集合的完整拷贝,而是返回数据集的指针,这个指针就是Cursor类privatePeople[]ConvertToPeople(Cursorcursor){intresultCounts=cursor.getCount();if(resultCounts==0||!cursor.moveToFirst()){returnnull;}People[]peoples=newPeople[resultCounts];for(inti=0;i 过URI间接调用ContentProvider。在使用者看来,数据提供者通过ContentProvider提供了一组标准的数据操作接口,却无法得知数据提供者的数据存储方法。URI是通用资源标志符(UniformResourceIdentifier),用来定位任何远程或本地的可用资源程序开发人员通过继承ContentProvider类可以创建一个新的数据提供者,过程可以分为三步:继承ContentProvider,并重载六个函数(增改删查之类的)声明CONTENT_URI,实现UriMatcher(判断URI是单条数据or多条数据)注册ContentProvider(在AndroidManifest.xml文件中进行注册授权名)
Unit9.位置服务位置服务(Location-BasedServices,LBS)。Android平台支持提供位置服务的API,在开发过程中主要用到LocationManager和LocationProviders对象LocationManager可以用来获取当前的位置,LocationProviders是能够提供定位功能的组件集合,集合中的每种组件以不同的技术提供设备的当前位置,区别在于定位的精度、速度和成本等方面位置服务:获取LocationManager以提供位置服务:StringserviceString=Context.LOCATION_SERVICE;LocationManagerlocationManager=(LocationManager)getSystemService(serviceString);LocationManager支持的定位方法有两种GPS定位:更加精确,但定位速度和质量受到卫星数量和环境情况的影响网络定位:提供的位置信息精度差,但速度较GPS定位快getLastKnowLocation()方法获取当前位置E.g.Stringprovider=LocationManager.GPS_PROVIDER;Locationlocation=locationManager.getLastKnownLocation(provider);//currentlocadoublelat=location.getLatitude();//经纬度doublelng=location.getLongitude();locationManager.requestLocationUpdates(provider,2000,10,locationListener);//位置监视,可以根据位置的距离变化和时间间隔设定产生位置改变事件的条件为了使GPS定位功能生效,还需要在AndroidManifest.xml文件中加入用户许可Google地图应用首先向Google申请一组经过验证的“地图密钥”(MapAPIKey),然后使用MapView(com.google.android.maps.MapView)就可以将Google地图嵌入到Android应用程序中在建立工程时将com.google.android.maps的扩展库添加到工程中,这样就可以使用Google地图的所有功能(添加com.google.android.maps扩展库的方式是在创建工程时,在BuildTarget项中选择GoogleAPIs)
这样就可以在布局中加入一个MapView控件并设置刚获取的“地图密钥了。 android:apiKey="0mVK8GeO6WUz4S94z52CIGSSlvlTwnrE4DsiA"/>仅在布局中添加MapView控件
,还不能够直接在程序中调用这个控件,还需要将程序本身设置成MapActivity(com.google.android.maps.MapActivity)importcom.google.android.maps.GeoPoint;importcom.google.android.maps.MapActivity;importcom.google.android.maps.MapController;importcom.google.android.maps.MapView;importandroid.os.Bundle;publicclassGoogleMapDemoextendsMapActivity{privateMapViewmapView;privateMapControllermapController;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);mapView=(MapView)findViewById(R.id.mapview);mapController=mapView.getController();Doublelng=126.676530486*1E6;Doublelat=45.7698895661*1E6;GeoPointpoint=newGeoPoint(lat.intValue(),lng.intValue());//GeoPoint经纬度类mapController.setCenter(point);mapController.setZoom(11);//放大层级mapController.animateTo(point);//中心移动到pointmapView.setSatellite(false);}@OverrideprotectedbooleanisRouteDisplayed(){//是否显示路径//TODOAuto-generatedmethodstubreturnfalse;}}由于获取Google地图是需要使用互联网的,所以在运行前还需要在AndroidManifest.xml文件中,添加允许访问互联网的许可:使用Overlay::通过在MapView上添加覆盖层,可以在指定的位置加添加注解、绘制图像或处理进行鼠标事件等
创建覆盖层继承Overlay类的子类,并通过重载draw()方法为指定位置添加注解,重载onTap()方法处理用户的点击操作Projection类提供了物理坐标和屏幕坐标的转换功能,可在经度和纬度表示的GeoPoint点和屏幕上Point点进行转换toPixels()方法将物理坐标转换为屏幕坐标;fromPixels()方法将屏幕坐标转换为物理坐标textOverlay=newTextOverlay();//实例化TextOverlay对象(自己建的覆盖层类)Listoverlays=mapView.getOverlays();//获取MapView已有的覆盖层overlays.add(textOverlay);Unit10.综合应用:移动警务通:Server端:1.Server端加载数据库需加载驱动jdbcDBUtil类的连接函数中:Stringdriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";Stringurl="jdbc:sqlserver://localhost:1433;databaseName=TEST1;integratedSecurity=true";try{Class.forName(driver);//加载数据库引擎,返回给定字符串名的类returnDriverManager.getConnection(url);}catch(Exceptione){e.printStackTrace();}在DAL层实现增改删查时,先Stringsql="selectid,username,passwordfromUserTblwhereusername=?andpassword=?";2.DBUtilutil=newDBUtil();Connectionconn=util.openConnection();try{PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setString(1,username);pstmt.setString(2,password);ResultSetrs=pstmt.executeQuery();if(rs.next()){intid=rs.getInt(1);Useru=newUser();u.setId(id);u.setPassword(passw
ord);u.setUsername(username);returnu;
3.4.Client端:
}}catch(SQLExceptione){e.printStackTrace();创建servlet(extendsHttpServlet)实现对DAL中函数的调用。