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)給用戶