Android Activity探究

1.活動(dòng)是什么

Activity 活動(dòng)是最容易吸引用戶的地方操禀,它是一種可以包含用戶界面的組件褂策,主要用于和用戶進(jìn)行交互。一個(gè)應(yīng)用程序中可以包含0個(gè)或者多個(gè)活動(dòng)颓屑,但不包含任何活動(dòng)的應(yīng)用程序很少見(jiàn)斤寂。

2.活動(dòng)的基本用法

由于AS在一個(gè)工作區(qū)間內(nèi)只允許打開一個(gè)項(xiàng)目,因此首先你需要將當(dāng)前的項(xiàng)目關(guān)閉揪惦。至于如何創(chuàng)建Activity我就不敘述了遍搞。

創(chuàng)建完之后就有一個(gè)Activity。項(xiàng)目中的任何活動(dòng)都應(yīng)該重寫Activity的Oncreate()方法器腋,而目前我們創(chuàng)建的活動(dòng)基本上已經(jīng)重寫了該方法溪猿,是由AS自動(dòng)幫我們完成的。

Public class MainActivity extends AppCompatActivity{

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

}

}

onCreate()方法非常簡(jiǎn)單蒂培,就是調(diào)用了父類的onCreate()方法再愈。當(dāng)然這知識(shí)默認(rèn)實(shí)現(xiàn)。后面還要在加入一些自己的邏輯

3.創(chuàng)建和加載布局

Android程序的設(shè)計(jì)講究邏輯和視圖分離护戳,最好每一個(gè)活動(dòng)都能對(duì)應(yīng)一個(gè)布局翎冲。布局就是用來(lái)顯示界面的內(nèi)容。因此我們要手動(dòng)來(lái)創(chuàng)建一個(gè)布局文件媳荒。

XML布局文件創(chuàng)建好之后抗悍,我們只需要在super.onCreate(savedInstanceState)下一行加入

setContentView(R.layout.main_layout);

這里調(diào)用了setContentView方法來(lái)給當(dāng)前活動(dòng)加載一個(gè)布局。钳枕,里面?zhèn)魅氲氖遣季治募腎D;

4.在頭文件中注冊(cè) (AndroidManifest)

活動(dòng)的注冊(cè)聲明要放在標(biāo)簽內(nèi)缴渊,這里是通過(guò)標(biāo)簽來(lái)對(duì)活動(dòng)進(jìn)行注冊(cè)的

5.在活動(dòng)中使用Toast

Toast 是ANdroid系統(tǒng)提供的一種非常好的提醒方式,在程序中可以使用它將一些短小的信息通知給用戶鱼炒,這些信息會(huì)在一段時(shí)間后自動(dòng)消失衔沼,并且不會(huì)占用任何屏幕空間。

首先要定義一個(gè)彈出Toast的觸發(fā)點(diǎn),我們定義個(gè)按鈕指蚁。

Public class MainActivity extends AppCompatActivity{

@Override

protected void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.main_layout);

//控件初始化

Button button1 =? (Button) findViewById(R.id.button_1);

//button1點(diǎn)擊事件

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Toast.makeText(MainActivity.this,"You clicked Button 1",Toast.LENGTH_SHORT).show();

}

})菩佑;

}

}

6.在活動(dòng)中使用Menu

手機(jī)和電腦不同,它的屏幕非常有限。Menu可以讓菜單展示的時(shí)候不占用屏幕空間

首先在res目錄下新建menu文件夾凝化,? 文件名輸入main

然后在main.xml文件中添加

android:id="@+id/add_item"

android:title="Add" />

然后回到MainActivity中來(lái)重寫onCreateOptionsMenu()方法稍坯,重寫可以使用Ctrl+0快捷鍵

public boolean onCreateOptionsMenu(Menu menu){

getMenuInflater().inflate(R.menu.main,menu);

return true;

}

通過(guò)getMenuInfalter(0方法能夠得到MenuInflater對(duì)象,在調(diào)用它的inflate()方法就可以給當(dāng)前活動(dòng)創(chuàng)建菜單了搓劫。

當(dāng)然瞧哟,僅僅讓菜單顯示出來(lái)是不夠的,我們定義菜單不僅是為了看的枪向,關(guān)鍵是要菜單真正能用才行勤揩,因此還要在定義菜單響應(yīng)事件。

在MainActivity中重寫OnOptionsItemSelected()方法:

public boolean onOptionsItemSelected(MenuItem item){

switch(item.getItemId()){

case R.id.add_item:

Toast.makeText(MainActivity.this,"You clicked ADD ",Toast.LENGTH_SHORT).show();

break;

default:

}

return true;

}

7.銷毀一個(gè)活動(dòng)

既然創(chuàng)建了活動(dòng)遣疯,當(dāng)然要銷毀了雄可。其實(shí)只要按下Back 鍵就可以銷毀了。

不過(guò)你想在程序中銷毀也可以

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

finish();

}

})缠犀;

8.使用Intent在活動(dòng)之間穿梭

Intent大致可以分為兩種:顯示和隱式

8.1 顯示Intent

Intent有多個(gè)構(gòu)造函數(shù)的重載,其中一個(gè)是Intent(Context packageContext, Classcls).這個(gè)構(gòu)造函數(shù)接受兩個(gè)參數(shù)聪舒,第一個(gè)參數(shù)是

context要求提供一個(gè)活動(dòng)的上下文辨液,第二個(gè)參數(shù)就是指定要啟動(dòng)的活動(dòng)了,通過(guò)這個(gè)構(gòu)造函數(shù)就可以構(gòu)建出Intent的意圖.Actvity類中提供了一個(gè)startActivity()的方法,這個(gè)方法是專門用于啟動(dòng)活動(dòng)的箱残,它接受一個(gè)Intent參數(shù)滔迈,這里是我們將構(gòu)建好的Intent傳入startActivity()方法就可以啟動(dòng)目標(biāo)活動(dòng)了。

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent(MainActivity.this, OtherActivity.class);

StartActivity(intent);

}

})被辑;

我們首先構(gòu)建出了一個(gè)Intent燎悍,傳入MainActivity.this作為上下文,傳入OtherActivity為活動(dòng)目標(biāo)盼理。

這樣我們的意圖就非常明顯了谈山。然后通過(guò)StartActivity方法來(lái)執(zhí)行Intent

就可以實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)了。

ps:OtherActivity必須在頭文件中注冊(cè)

8.2 隱式Intent

相比于顯示Intent,隱式Intent則含蓄了許多宏怔,它并不明確指出我們想要啟動(dòng)哪一個(gè)活動(dòng)奏路,而是指定了一系列更為抽象的action和category等信息,然后交由系統(tǒng)去分析這個(gè)Intent,并幫我們找出合適的活動(dòng)去啟動(dòng)

什么叫做合適的活動(dòng)呢臊诊?

通過(guò)在標(biāo)簽配置的內(nèi)容鸽粉,可以指定當(dāng)前活動(dòng)能夠響應(yīng)的action 和 category,打開AndroidManifest.xml,添加如下代碼:

在標(biāo)簽中我們知名了當(dāng)前活動(dòng)可以響應(yīng)ACTION_START這個(gè)action抓艳,而標(biāo)簽則包含了一些附加信息触机,更精確地指明了當(dāng)前的活動(dòng)能夠響應(yīng)的Intent中還可能帶有的category.只有和中的內(nèi)容同時(shí)能夠匹配上Intent中指定的action和category時(shí),這個(gè)活動(dòng)才能響應(yīng)該intent

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent("com.example.activitytest.ACTION_START";

StartActivity(intent);

}

});

可以看到儡首,我們使用了Intent的另一個(gè)構(gòu)造函數(shù),直接將action的字符串傳了進(jìn)去销斟,表面我們想要啟動(dòng)能夠響應(yīng)這個(gè)action活動(dòng),那category, DEFAULT是一種默認(rèn)的category.在調(diào)用startActivity()方法的時(shí)候會(huì)自動(dòng)將這個(gè)category添加到Intent中椒舵。

每個(gè)Intent中只能指定一個(gè)Action蚂踊,但卻能指定多個(gè)category。

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent("com.example.activitytest.ACTION_START ";

intent笔宿。addCategory("com.example.activitytest.MY_CATEGORY");

StartActivity(intent);

}

})犁钟;

可以調(diào)用Intent中的 addCateg()方法來(lái)添加一個(gè)category,這里我們指定了一個(gè)自定義的category,值為com.example.activitytest.MY_CATEGORY..

然后在頭文件聲明MY_CATEGORY.

8.3更多隱式的用法

使用隱式Intent,我們不僅可以啟動(dòng)自己程序內(nèi)的活動(dòng)泼橘,還可以啟動(dòng)其他程序的活動(dòng)涝动。比如需要展示一個(gè)網(wǎng)頁(yè)。

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("http://www.baidu.com"));

StartActivity(intent);

}

})炬灭;

這樣就可以啟動(dòng)系統(tǒng)自帶的瀏覽器了

比如電話撥號(hào)器:

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent(Intent.ACTION_DIAL);

intent.setData(Uri.parse("10086"));

StartActivity(intent);

}

})醋粟;

9.活動(dòng)傳遞數(shù)據(jù)

Activity跳轉(zhuǎn)時(shí)并且傳遞數(shù)據(jù),或者返回?cái)?shù)據(jù)給上一個(gè)活動(dòng)

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

String data = "hellow world"

Intent intent = new Intent(MainActivity.this,OtherActivity.class);

intent.putExtra("extra_data",data);

StartActivity(intent);

}

})重归;

注意:putExtra()方法接收兩個(gè)參數(shù)米愿。第一個(gè)參數(shù)是鍵。第二個(gè)參數(shù)才是你要傳的值鼻吮。

然后在第二個(gè)活動(dòng)中接收所傳遞的數(shù)據(jù)

在Oncreate方法中接收

Intent intent =getIntent();

String data = intent.getStringExtra("extra_data");

Log.d("OtherActivity",data)

返回?cái)?shù)據(jù)給上一個(gè)活動(dòng)

startActivityForResult()方法接收兩個(gè)參數(shù)育苟,第一個(gè)是 Intent,第二個(gè)參數(shù)是請(qǐng)求碼.

用于之后的回調(diào)判斷數(shù)據(jù)的來(lái)源。

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent(MainActivity.this,OtherActivity.class);

StartActivityForResult(intent,1);

}

})椎木;

//在第二個(gè)Activity中

.? button2.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v){

Intent intent = new Intent();

intent.putExtra("data_return","Hello MainActivity");

setResult(RESULT_OK,intent);

finish();

}

})违柏;

然后在MainActivity中接收返回的數(shù)據(jù)

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

switch (requestCode){

case 1:

if (resultCode ==RESULT_OK){

String returneData = data.getStringExtra("data_return");

Log.d("MainActivity",returneData);

}

break;

default:

}

}

如果用戶是通過(guò)Back 來(lái)返回的 可以在第二個(gè)活動(dòng)中重寫onBackPressed()方法來(lái)解決這個(gè)問(wèn)題

@Override

public void onBackPressed() {

Intent intent = new Intent();

intent.putExtra("data_return","Hellwo");

setResult(RESULT_OK,intent);

finish();

}

10.活動(dòng)的生命周期

10.1返回棧

棧是一種后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),在默認(rèn)的情況下香椎,每當(dāng)我們啟動(dòng)了一個(gè)新的活動(dòng)漱竖,它會(huì)在返回棧中入棧,并處于棧頂位置畜伐。而每當(dāng)我們按下Back鍵或調(diào)用finish()方法去銷毀一個(gè)活動(dòng)時(shí)馍惹,處于棧頂?shù)幕顒?dòng)就會(huì)出棧。這時(shí)前一個(gè)入棧的活動(dòng)就會(huì)重新處于棧頂?shù)奈恢每窘浮O到y(tǒng)總是會(huì)顯示處于棧頂?shù)幕顒?dòng)給用戶

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讼积,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子脚仔,更是在濱河造成了極大的恐慌勤众,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鲤脏,死亡現(xiàn)場(chǎng)離奇詭異们颜,居然都是意外死亡吕朵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門窥突,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)努溃,“玉大人,你說(shuō)我怎么就攤上這事阻问∥嗨埃” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵称近,是天一觀的道長(zhǎng)第队。 經(jīng)常有香客問(wèn)我,道長(zhǎng)刨秆,這世上最難降的妖魔是什么凳谦? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮衡未,結(jié)果婚禮上尸执,老公的妹妹穿的比我還像新娘。我一直安慰自己缓醋,他們只是感情好如失,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著改衩,像睡著了一般岖常。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葫督,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音板惑,去河邊找鬼橄镜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冯乘,可吹牛的內(nèi)容都是我干的洽胶。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼裆馒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姊氓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起喷好,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤翔横,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后梗搅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禾唁,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡效览,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荡短。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丐枉。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖掘托,靈堂內(nèi)的尸體忽然破棺而出瘦锹,到底是詐尸還是另有隱情,我是刑警寧澤闪盔,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布弯院,位于F島的核電站,受9級(jí)特大地震影響锭沟,放射性物質(zhì)發(fā)生泄漏抽兆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一族淮、第九天 我趴在偏房一處隱蔽的房頂上張望辫红。 院中可真熱鬧,春花似錦祝辣、人聲如沸贴妻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)名惩。三九已至,卻和暖如春孕荠,著一層夾襖步出監(jiān)牢的瞬間娩鹉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工稚伍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弯予,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓个曙,卻偏偏與公主長(zhǎng)得像锈嫩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垦搬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容