收藏 分销(赏)

Android技术总结.doc

上传人:二*** 文档编号:4747325 上传时间:2024-10-11 格式:DOC 页数:31 大小:2.70MB 下载积分:5 金币
下载 相关 举报
Android技术总结.doc_第1页
第1页 / 共31页
本文档共31页,全文阅读请下载到手机保存,查看更方便
资源描述
Android进修条记(1)-永久稳定的HelloWorld Google的AndroidSDK宣布也有一段时间了,不断想研讨一下却苦于寻不到时间。应用谁人周未, 开场逼迫本人再次进退进修形态,缘故非常庞杂:我看好开放的 gPhone。 SDK的下载与装置并不庞杂,网上也有很多同窗曾经进入形态了,我就不再反复了吧。 明天要紧探讨的,依然永久稳定的话题:HelloWorld. 1.最庞杂的HelloWorld 装置了SDK后,直截了当天生一个AndroidProject,一句代码不必写,就能跑出一个最庞杂的HelloWorld 例程。咱们看一下它的代码: publicvoidonCreate(Bundleicicle) super.onCreate(icicle); { setTheme(android.R.style.Theme_Dark); setContentView(R.layout.main); } 看上去真实非常庞杂,只要两句话罢了。要害在谁人R.layout.main上,凭直觉,这应当是界说的资本。 的确,在R.java中只是界说了一个staticint罢了,真正的资本描绘在res/layout/main.xml文件里〔留意: 这里的R.java不要手工编纂,每次buildproject时它都市依照res下的资本描绘被主动修正〕。 <xmlversion="1.0" encoding="utf-8"> <LinearLayout xmlns:android="://schemas.android/apk/res/android" android:orientation ="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextViewid="+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="HelloWorld" /> </LinearLayout> 谁人文件非常好读,一个描绘了这是一个线性陈列的规划, android:orientation=vertical表现所有组件 将纵向排布。而经典的HelloWorld是用一个TextView来展现的。 由此,咱们清楚,Android的顺序从一个Activity派生出来,同时从它的onCreate开场启动;Android 里要表现的组件用XML文件描绘而不必在代码中硬编码〔这是一个好的习惯,咱们应当从一开场就坚 持下去〕; 2.让Button来说HelloWorld 下面的例子是ADT主动天生的代码,年夜概与咱们一点关联也不。那咱们来改一下代码,因为在windows 平台上的Helloworld常常是由一个按钮触发的,因而,咱们想第二个Helloworld应当是如斯的:加一 个按钮跟文本输入框,单击按钮后在本来的TextView前面加上输入框中输入的笔墨。 第一步是,增加一个Button跟一个EditText,与TextView一样,它们也在main.xml里描绘一下: <EditTextid="+id/edt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Buttonid="+id/go" android:layout_width="wrap_content" android:layout_height="wrap_content " android:text="string/go"> <requestFocus/> </Button> 这里有两个地点要留意:id=+id/go,这表现需要一个独一的UID来作为Button的ID,它的援用名是 go。另有一个是android:text=string/go表现谁人按钮的文本不是直截了当写有main.xml里了,而是来 源于另一个资本描绘文件strings.xml里,本例中的strings.xml如下: <xmlversion="1.0" <resources> encoding="utf-8"> <string <string name="app_name">helloTwo</string> name="tit_dialog">提醒</string> name="msg_dialog">你好,中国</string> name="ok_dialog">断定</string> name="go">阅读</string> <string <string <string </resources> 而后,在代码里〔onCreate函数中〕咱们加上以下代码〔庞杂起见,用了嵌套类〕: Buttonbtn=(Button)findViewById(R.id.go); btn.setOnClickListener { (newView.OnClickListener() publicvoidonClick(View v) { EditText edt=(EditText)helloTwo. this.findViewById(R.id. edt); d.txt); ); TextViewtxt=(TextView)helloTwo.this.findViewById(R.i txt.setText(getString(R.string.msg_dialog)+edt.getText() } }); 为铵钮增加一个onClick事情处置器,在点击事情中,设置txt的文本为 R.string.msg_dialgo+edt.getText() 。 这里的要害是两个函数的运用:findViewById(R.id.go) 能够依照资本的称号加载View范例的资 源,异样用函数getString(R.string.msg_dialog) 编译,run一下看看后果。 能够加载字符串资本。 3.再让菜单SayHello 从API文档中咱们看到Activity中有两个函数:onCreateOptionsMenu跟onOptionsItemSelected, 表现,谁人OptionsMenu的确是所谓的高低文菜单〔在GPhone的模仿器上,有个键公用于弹出谁人菜单〕。 下面咱们就为谁人HelloWorld例子加上一个菜单,同时让它能够Sayhello。 此次,咱们不触及到资本的描绘文件了,而是直截了当运用这两个函数来实现,理想上代码也非常庞杂,所 以,咱们再增加一个加入运用的功用〔否那么每次基本上按撤消键加入运用表现太不专业了〕。 代码如下: publicbooleanonCreateOptionsMenu(Menumenu) { super.onCreateOptionsMenu(menu); menu.add(0,1,"say menu.add(0,2,"exit"); returntrue; hello"); } publicbooleanonOptionsItemSelected(Item item) { super.onOptionsItemSelected(item); intid=item.getId(); switch(id){ case1: AlertDialog.show(this,getString(R.string.app_name), getString(R.string.msg_dialog), g etString(R.string.ok_dialog), case2: true); break; finish(); break; } 在CreateOptionsMenu时,咱们庞杂地增加两个菜单项,menu.add(组ID,项ID,表现文本),〔注 意:这里我直截了当将笔墨写在代码里,这并不倡导〕。而后,在 OptionsItemSelected事情中,咱们依照 选中的菜单项做响应处置,假如选中1,那么弹出一个对话框表现资本文件中的“你好,中国〞,假如选 中2那么加入运用。 AlertDialog.show是一个静态办法,相似于咱们在WIN平台上常常运用的MessageBox一样,非常方 便的。 起源:://sf.org/Android/lumen/20976.html Android进修条记(2)-初识Activity 依照文档的说明,Activity是Android开辟中特不主要的一个根底类。我把它想像成 J2ME中的 Display类,或者是Win32平台上的Form类,兴许不精确,然而它的主要性我感到应当是一样的〔所以, 假如咱们写的是一个不界面的运用,比方后盾运转的效劳之类的,能够不必 Display的〕。 1.在一个Activity中运用多个View 假如把Activity看作MVC中的Control?它担任治理UI跟承受事情〔包含用户的输入〕,尽管说 一个Activity平日对应一个屏幕,但理想上,咱们是能够只用一个 实现庞杂的逻辑。 Activity治理多个差其余View来 起首,咱们增加一个新的资本描绘layout/second.xml。 <xmlversion="1.0" encoding="utf-8"> <LinearLayout xmlns:android="://schemas.android/apk/res/android" android:orientation ="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextViewid="+id/txt" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello中国" /> <Buttonid="+id/go2" android:layout_width="wrap_content" android:layout_height ="wrap_content " android:text="back"> <requestFocus/> </Button> </LinearLayout> 除了一个“Hello中国〞以外,增加一个按钮能够前往前一个界面。而后,在代码中咱们要为 helloTwo增加两个办法,setViewOneCommand跟setViewTwoCommand,分不处置一下在差别界面时,从 资本里加载组件并为组件绑定一个事情处置器。 publicvoidsetViewOneCommand() { Buttonbtn=(Button)findViewById(R.id.go); btn.setOnClickListener( { newView.OnClickListener() publicvoidonClick(View v) { helloTwo.this.setContentView(R.layout.second); helloTwo.this.setViewTwoCommand(); } }); ButtonbtnExit=(Button)findViewById(R.id.exit); newView.OnClickListener(){ publicvoidonClick(View helloTwo.this.finish(); btnExit.setOnClickListener( v){ } }); } publicvoidsetViewTwoCommand() { ButtonbtnBack=(Button)findViewById(R.id.go2); newView.OnClickListener(){ voidonClick(Viewv){ btnBack.setOnClickListener( public helloTwo.this.setContentView(R.layout.main); helloTwo.this.setViewOneCommand(); } }); } 最后,咱们需要在onCreate的时候,也的确是启动后的main界面上设置一下按钮事情处置器。新的 onCreate办法如下: publicvoidonCreate(Bundleicicle) super.onCreate(icicle); { setTheme(android.R.style.Theme_Dark); setContentView(R.layout.main); setViewOneCommand(); } 编译,运转,OK。 2.依然回到邪道上,多个Activity之间的跳转 Android中供给一个叫Intent的类来实现屏幕之间的跳转,按文档的说法,年夜概他们也倡议采纳这 种办法,Intent的用法比拟庞杂,如今我先看看它最庞杂的用法。 先在运用中增加两个Activity,这需要修正AndroidManifest.xml文件了,如下: <xmlversion="1.0" encoding="utf-8"> <manifestxmlns:android="://schemas.android/apk/res/android" package="cn.sharetop.android.hello.three"> <application android:icon="drawable/icon"> class=".HelloThree"android:label="string/app_name"> <activity <intent-filter > <actionandroid:value="android.intent.action.MAIN" /> <categoryandroid:value="android.intent.category.LAUNCH ER"/> </intent-filter > </activity> <activity class=".HelloThreeB" android:label="string/app_name"> </activity> </application> </manifest> 非常庞杂,的确是加一个标签罢了,新标签的class是.HelloThreeB,表现的运用题目与前一个Activity 一样罢了,而后第二步的确是修正一个HelloThree类的实现,在onCreate办法中绑定按钮的事情处置器: publicvoidonCreate(Bundleicicle) super.onCreate(icicle); { setTheme(android.R.style.Theme_Dark); setContentView(R.layout.main); setViewOneCommand(); } publicvoidsetViewOneCommand() { Buttonbtn=(Button)findViewById(R.id.go); btn.setOnClickListener( { newView.OnClickListener() publicvoidonClick(View v) { Intent intent =newIntent(); intent.setClass(HelloThree. startActivity(intent); finish(); this,HelloThreeB.class); } }); ButtonbtnExit=(Button)findViewById(R.id.exit); newView.OnClickListener(){ publicvoidonClick(Viewv){ HelloThree.this.finish(); btnExit.setOnClickListener( } }); } 这里的跳转功用用Intent来操纵,它的最庞杂用法的确是用函数 Activity类的实例,而后挪用Activity本人的startActivity(intent) setClass()设置跳转前后两个 即可。最后一句finish()表现 将以后Activity关掉落〔假如不关掉落会怎样?你能够本人试一下看后果,理想上偶然咱们是不需要关掉落 以后Activity的〕。 而后,咱们异样弄一个Activity类HelloThreeB,代码与前面的差未多少,只是将setClass的两个 参数反一下,如斯就能够庞杂地实如今两个Activity界面中往返切换的功用了。 3.假如我想在两个Activity之间进展数据交流,怎样办? 前例中的startActivity() 只要一个参数,假如需要向新翻开的Activity通报参数,咱们得换一个 函数了,Android供给了startSubActivity(Intent,int) 谁人函数来实现谁人功用。 函数原型为:publicvoidstartSubActivity(Intentintent,intrequestCode) 这里的requestCode用来标识某一个挪用,普通由咱们界说一个常量。 怎样把参数传过去呢?Intent类在供给setClass()函数的同时也供给了一个setData()函数。 函数原型为:publicIntentsetData(ContentURIdata) 参数范例是ContentURI,它的具体内容下回再剖析,如今就把它当成一个 String范例来用吧。 参数带到新的Activity后,异样用Activity.getIntent() 而后用getData()就取到参数了。 函数能够掉掉落以后过去的Intent工具, 把参数带返来的办法是Activity.setResult() ,它有多少个方法,如今先看最庞杂的一个吧。 函数原型是:publicfinalvoidsetResult(intresultCode,Stringdata) resultCode是前往代码,异样用来标识一个前往范例,而 data那么是它要前往的参数。 在本来的Activity中的事情处置回调函数onActivityResult,会被零碎挪用,从它的参数里能够 掉掉落前往值。 函数原型为:protectedvoidonActivityResult(intrequestCode,intresultCode,String data,Bundleextras) 这里的requestCode的确是前面启动新Activity时的带过去的requestCode,而resultCode那么关联上了 setResult中的resultCode,data是参数,extras也是一个非常主要的货色,前面再研讨一下它的感化。 下面,咱们来看一下代码吧,先看看HelloThree中的代码: publicvoidsetViewOneCommand() { Buttonbtn=(Button)findViewById(R.id.go); btn.setOnClickListener( { newView.OnClickListener() publicvoidonClick(View v) { try { Intent intent.setClass(HelloThree. intent =newIntent(); this,HelloThreeB.cl ass); intent.setData(new ContentURI("One")); startSubActivity(intent,REQUEST_TYPE_A); } catch(Exceptionex){} } }); ButtonbtnExit=(Button)findViewById(R.id.exit); newView.OnClickListener(){ publicvoidonClick(Viewv){ HelloThree.this.finish(); btnExit.setOnClickListener( } }); } protectedvoidonActivityResult(intrequestCode,intresultCode, Stringdata,Bundleextras) { if(requestCode==REQUEST_TYPE_A){ if(resultCode ==RESULT_OK){ Log.v(TAG,data); TextViewtxt=(TextView)findViewById(R.id.txt); txt.setText(data); } } } 这里的REQUEST_TYPE_A是咱们界说的一个常量。在onActivityResult TextView表现值换成传来的字串。 再来看看另一个HelloThreeB类的实古代码: 顶用它与RESULT_OK一同作 为前提推断如那边置前往值,这里只是庞杂将 private Intent i; protected voidonCreate(Bundleicicle) { super.onCreate(icicle); setContentView(R.layout.second); i=getIntent(); android.util.Log.v(TAG,"onCreate"); Buttonbtn=(Button)findViewById(R.id.go); newView.OnClickListener(){ publicvoidonClick(View btn.setOnClickListener( v){ String result=HelloThreeB.this.i.getData().toString()+" AndTwo"; HelloThreeB.this.setResult(RESULT_OK,result); finish(); } }); TextViewv=(TextView)findViewById(R.id.txt); v.setText("Paramis"+i.getData().toString()); } 在按钮处置事情中,从Intent掏出参数,处置一下再用setResult前往给前一个Activity即可。 编译运转即可。 起源:://sf.org/Android/lumen/20977.html Android进修条记(3)-Activity的性命周期 留意到在Activity的API中有少量的onXXXX方法的函数界说,除了咱们前面用到的onCreate以 外,另有onStart,onStop以及onPause等等。从字面上看,它们是一些事情回调,那么次第又是怎样 的呢?理想上这种状况,本人做个试验最清楚只是了。在做谁人试验之前,咱们先得寻到在 Android中的 Log是怎样输入的。 显然,咱们要用的是android.util.log 类,谁人类相称的庞杂易用,因为它供给的满是一些静态 办法: Log.v(String Log.d(String Log.i(String Log.w(String Log.e(String tag,Stringmsg); tag,Stringmsg); tag,Stringmsg); tag,Stringmsg); tag,Stringmsg); //VERBOSE //DEBUG //INFO //WARN //ERROR 前面的tag是由咱们界说的一个标识,普通能够用“类名_办法名“来界说。 输入的LOG信息,假如用Eclipse+ADT开辟,在LogCat中就能够看到,否那么用adblogcat也行, 只是我是历来都依附于IDE情况的。 好了,如今咱们修正前面的HelloThree代码: publicvoidonStart() { super.onStart(); Log.v(TAG,"onStart"); } publicvoidonStop() { super.onStop(); Log.v(TAG,"onStop"); } publicvoidonResume() { super.onResume(); Log.v(TAG,"onResume"); } publicvoidonRestart() { super.onRestart(); Log.v(TAG,"onReStart"); } publicvoidonPause() { super.onPause(); Log.v(TAG,"onPause"); } publicvoidonDestroy() { super.onDestroy(); Log.v(TAG,"onDestroy"); } publicvoidonFreeze(BundleoutState) { super.onFreeze(outState); Log.v(TAG,"onFreeze"); } 在HelloThreeB中也异样增加如斯的代码,编译,运转一下,从logcat中剖析输入的日记。 在启动第一个界面ActivityOne时,它的次第是: onCreate(ONE)-onStart(ONE)-onResume(ONE) 尽管是第一次启动,也要走一遍谁人resume事情。而后,咱们点goto跳到第二个ActivityTwo中〔前 一个不封闭〕,这时走的次第是: onFreeze(ONE)-onPause(ONE)-onCreate(TWO)-onStart(TWO)-onResume(TWO)-onStop(ONE) 阐明,第二个ActivityTwo在启动前,One会阅历一个:解冻、停息的过程,在启动Two后,One 才会被停顿? 而后,咱们再点back回到第一个界面,这时走的次第是: onPause(TWO)-onActivityResult(ONE)-onStart(ONE)-onRestart(ONE)-onResume(ONE)- onStop(TWO)-onDestroy(TWO) 阐明,前往时,Two不阅历解冻就直截了当停息了,在One接纳参数,重启后,Two就停顿并被烧毁 了。 最后,咱们点一下Exit加入运用,它的次第是: onPause(ONE)-onStop(ONE)-onDestroy(ONE) 阐明假如咱们用了finish的话,不会有freeze,然而仍会阅历pause-stop才被烧毁。 这里有点疑咨询的是:什么原因返来时先是Start才是Restart?然而文档中的图上画的倒是先restart再 start的啊?只是,前面的表格中的描绘好象是准确的,start前面老是随着resume〔假如是第一次〕 或者restart〔假如本来被stop掉落了,这种状况会在start与resume中插一个restart〕。 下面不跑例子了,看看文档吧。 1.Android用ActivityStack来治理多个Activity,因而呢,统一时辰只会有最顶上的谁人Activity 是处于active或者running形态。其余的Activity都被压鄙人面了。 2.假如非运动的Activity还是可见的〔即假如下面压着的是一个非全屏的 Activity 或通明的 Activity〕,它是处于paused形态的。在零碎内存缺乏的状况下,paused形态的Activity是有可被系 统杀掉落的。只是不清楚,假如它被干掉落了,界面上的表现又会酿成什么容貌?看来下回有须要研讨一下 这种状况了。 3.多少个事情的配对能够比拟清晰地了解它们的关联。Create与Destroy配成一对,叫entrielifetime, 在创破时调配资本,那么在烧毁时开释资本;往上一点另有Start与Stop一对,叫visiblelifetime , 表白的是可见与非可见这么一个过程;最顶上的的确是Resume跟Pause这一对了,叫foregroundlifetime, 表白的了能否处于激活形态的过程。 4.因而,咱们实现的Activity onPause()保管以后操纵的后果。 派生类,要重载两个主要的办法:onCreate()进展初始化操纵, 除了ActivityLifecycle 以外,Android另有一个ProcessLifecycle的阐明: 在内存缺乏的时候,Android是会主动清算流派的,那它又是怎样推断哪个 process是能够清掉落的 呢?文档中也提到了它的主要性排序: 1.最轻易被清掉落的是emptyprocess,空过程是指那些不Activity与之绑定,也不任何运用程 序组件〔如Services或者IntentReceiver〕与之绑定的过程,也的确是说在谁人process中不任何 activity或者service之类的货色,它们仅仅是作为一个cache,在启动新的Activity时能够进步速 度。它们是会被优先清掉落的。因而倡议,咱们的后盾操纵,最好是作成 Service的方法,也的确是说应当 在Activity中启动一个Service去履行这些操纵。 2.接上去的确是backgroundactivity 了,也的确是被stop掉落了那些activity所处的process,那些 弗成见的Activity被清掉落的确是平安的,零碎保持着一个LRU列表,多个处于background的activity 都在这外面,零碎能够依照LRU列表推断哪些activity是能够被清掉落的,以及此中哪一个应当是开始 被清掉落。只是,文档中提到在谁人已被清掉落的Activity又被从新创破的时候,它的onCreate会被挪用, 参数的确是onFreeze时的谁人Bundle。只是这里有一点不清楚的是,岂非谁人Activity被killed时, Android会帮它保管着谁人Bundle吗? 3.而后就轮到serviceprocess了,这是一个与Service绑定的过程,由startService办法启动。 尽管它们不为用户所见,但普通是在处置一些长时间的操纵〔比方 的确不内存可用了。 MP3的播放〕,零碎会爱护它,除非 4.接着又轮到那些visibleactivity了,或者说visibleprocess。前面也谈到谁人状况,被Paused 的Activity也是有能够会被零碎清掉落,只是绝对来说,它曾经是处于一个比拟平安的地位了。 5.最平安应当的确是谁人foregroundactivity 不只包含resume之后的activity,也包含那些onReceiveIntent之后的IntentReceiver实例。 在AndroidApplication 了,不到心甘情愿它是不会被清掉落的。这种process 的性命周期的探讨中,文档也提到了一些需要留意的事项:因为 Android 运用顺序的生活期并不是由运用自身直截了当操纵的,而是由 Android零碎平台进展治理的,因而,对于我 们开辟者而言,需要了解差其余组件Activity、Service跟IntentReceiver的性命,牢记的是:假如 组件的选择不当,非常有能够零碎会杀掉落一个正在进展主要任务的过程。 起源:://sf.org/Android/lumen/20978.html Android进修条记(4)-进修Intent的运用 刚看到Intent的时候,我的确有点迷惑:从字面下去说,它表现一种用意跟目标;从运用上看, 它年夜概老是用于Activity之间的切换;而从它地点包android.content来看,它年夜概与内容有关。所 以,我想或答应以如斯了解它:Intent类绑定一次操纵,它担任携带此次操纵所需要的数据以及操纵 的范例等。 假如是如斯的话,能否能够将它与事情处置遐想起来?即一个Intent相似于一个Event。从Intent 的两个最主要的成员操纵范例〔Action〕跟数据〔Data〕来看,年夜概是有情理的。文档中说,Intent的 Action的取值要紧是一些界说好了的常量,比方PICK_ACTION,VIEW_ACTION,EDIT_ACTION之类的,而 Data那么是一个ContentURI范例的变量,这一点,咱们前面提到过。 并且文档中说Intent分为两年夜类,显性的〔Explicit〕跟隐性的〔Implicit〕。在前面的例子中, 咱们在两个Activity之间跳转时开端运用了Intent类,事先是用setClass来设置Intent的发动方与 接纳方,它被称为显性的Intent,而隐性的Intent那么不需要用setClass或setComponent来指定事情 处置器,应用AndroidMenifest.xml中的设置就能够由平台定位事情的花费者。 普通来说,intent要定位事情的目标地,无外乎需要以下多少个信息: 1.品种〔category〕,比方咱们罕见的LAUNCHER_CATEGORY的确是表现这是一类运用顺序。 2.范例〔type〕,在前面的例子中没用过,表现数据的范例,这是隐性 Intent定位目标的主要依 据。 3.组件〔component〕,前面的例子顶用的是setClass,只是也能够用setComponent来设置intent 跳转的前后两个类实例。 4.附加数据〔extras〕,在ContentURI之外还能够附加一些信息,它是Bundle范例的工具。 Implicit Intent的运用绝对有点费事,咱们来做一个例子。起首,咱们需要增加一个类: HelloThreeProvider,它必需实现于ConentProvider接口,因而代码如下: publicclassHelloThreeProvider extendsContentProvider { publicbooleanonCreate(){ returntrue; } publicintdelete(ContentURI return0; url, Stringwhere,String[] whereArgs){ } } publicContentURIinsert(ContentURI returnurl; url, ContentValuesinitialValues){ publicC
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 应用文书 > 报告/总结

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服