资源描述
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
展开阅读全文