初來學(xué)習(xí)Activity,基本用法
活動是Android的四大組件之一统扳,它是一種可以包含用戶界面的組件喘帚,主要用于和用戶進行交互
創(chuàng)建活動
- Activity是Android系統(tǒng)提供的一個活動基類,所有的活動都必須直接或間接繼承此類才能擁有活動的特性
- Android程序的設(shè)計講究邏輯和視圖的分離咒钟,最好一個活動都能對應(yīng)一個布局吹由,布局就是用來顯示界面內(nèi)容的
布局文件
- 創(chuàng)建布局文件: Android中布局文件是XML文件類型,當(dāng)布局文件創(chuàng)建時朱嘴,R.java文件會自動對此布局文件生成一個唯一標(biāo)識符(資源ID,在內(nèi)部類Layout中)倾鲫,當(dāng)在布局文件內(nèi)部組件添加時,R.java文件不會對組件自動生成資源ID萍嬉,需要手動生成資源ID乌昔,方式:
android:id="@+id/id_name"
(在內(nèi)部類Id中) - 加載布局文件: 在活動中調(diào)用方法:
setContentView()
,將布局文件的資源ID作為參數(shù)壤追,即實現(xiàn)了在此活動中加載此布局文件磕道。資源ID在R.java文件中的所屬的類都是靜態(tài)的,資源ID也是靜態(tài)的成員
//在代碼中引用資源ID
setContentView(R.layout.activity_main);
//在XML文件中引用資源ID
@string/hello_world
在清單文件中注冊活動
-
活動的注冊聲明要放在
application
標(biāo)簽內(nèi)行冰,通過標(biāo)簽activity
來對活動進行注冊<activity <!-- 具體注冊哪一個活動 --> android:name="com.example.databasetest.MainActivity" <!-- 指定活動標(biāo)題欄的內(nèi)容(app快捷方式的名字) --> android:label="@string/app_name" > <!-- 可以定義action和category子標(biāo)簽 --> <intent-filter> <!-- 指定當(dāng)前活動可以響應(yīng)的action --> <action android:name="android.intent.action.MAIN" /> <!-- 指定當(dāng)前活動可以響應(yīng)的category --> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
-
注意:
<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
活動在注冊時溺蕉,
action
標(biāo)簽內(nèi)和category
標(biāo)簽內(nèi)若以上內(nèi)容,代表此活動是此應(yīng)用程序的主活動(程序啟動時资柔,首先打開此活動)
隱式啟動活動
-
一個活動若想被隱式啟動焙贷,需要在此活動的
<Activity>
標(biāo)簽下配置<intent-filter>
標(biāo)簽<intent-filter > <action android:name="com.array.second"/> <data android:scheme="array" android:mimeType="aa/bb"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter>
-
action
標(biāo)簽指定動作 -
data
標(biāo)簽指定操作的數(shù)據(jù)-
android:scheme
:用于指定數(shù)據(jù)的協(xié)議部分 -
android:mimeType
:用于指定可以處理的數(shù)據(jù)類型,允許使用通配符的方式進行指定
-
-
category
標(biāo)簽指定類別
-
隱式意圖啟動
Activity
贿堰,需要為intent
設(shè)置以上三個屬性,且值必須與該Activity
在清單文件中對三個屬性的定義匹配intent-filter
節(jié)點及其子節(jié)點都可以同時定義多個啡彬,隱式啟動時只需與任意一個匹配即可
隱式啟動活動傳遞以及獲取數(shù)據(jù)
-
隱式啟動活動羹与,通過
setData(Uri uri)
傳遞數(shù)據(jù)/*啟動系統(tǒng)打電話應(yīng)用,通過setData傳遞數(shù)據(jù)庶灿,tel就是Data標(biāo)簽中的scheme約束*/ intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:911"));
-
獲取
setData
中傳遞過來的數(shù)據(jù)//獲取啟動此Activity的intent對象 Intent intent = getIntent(); Uri uri = intent.getData();
啟動活動時傳遞數(shù)據(jù)
-
Activity
通過Intent
啟動時纵搁,可以通過Intent
對象攜帶數(shù)據(jù)到目標(biāo)Activity
Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("maleName", maleName); intent.putExtra("femaleName", femaleName); startActivity(intent);
-
在目標(biāo)
Activity
中取出數(shù)據(jù)Intent intent = getIntent(); String maleName = intent.getStringExtra("maleName"); String femaleName = intent.getStringExtra("femaleName");
Intent
還可以結(jié)合Bundle
一起用于傳遞數(shù)據(jù),首先可以把需要傳遞的數(shù)據(jù)都保存在Bundle
對象中往踢,然后再將Bundle
對象存放在Intent
里腾誉。都了目標(biāo)活動之后先從Intent
中取出Bundle
,再從Bundle
中一一取出數(shù)據(jù)
返回數(shù)據(jù)給上一個活動
從A界面打開B界面峻呕, B界面關(guān)閉的時候利职,返回一個數(shù)據(jù)給A界面
-
在A界面:
Activity
中有一個startActivityForResult()
方法,此方法也是用于啟動活動的瘦癌,但這個方法期望在活動銷毀的時候能夠返回一個結(jié)果給上一個活動猪贪。/** * startActivityForResult(Intent intent, int requestCode) * intent:意圖對象 * requestCode:請求碼,用來區(qū)分是從哪個Activity返回的數(shù)據(jù) * * 用這個api啟動的Activity讯私,在銷毀時热押,系統(tǒng)會回調(diào)活動的onActivityResult */ startActivityForResult(intent, MainActivity.RESULT);
-
在B界面:
//構(gòu)建一個用于傳遞數(shù)據(jù)的Intent對象 Intent intent = new Intent(); //存儲數(shù)據(jù) intent.putExtra("name", name); /** * setResult(int resultCode, Intent data):這個方法是專門向上一個活動返回數(shù)據(jù)用的 * resultCode:用于向上一個活動返回處理結(jié)果西傀,一般只是用 RESULT_OK 或 RESULT_CANCELED * data:帶有數(shù)據(jù)的Intent對象 */ setResult(RESULT_OK, intent); //將此活動銷毀 finish();
-
在A界面: 回調(diào)方法
onActivityResult
/** * requestCode:請求碼,和startActivityForResult方法中讀取請求碼對應(yīng)桶癣,判斷是從哪個Activity返回的數(shù)據(jù) * resultCode:返回的處理結(jié)果 * data:攜帶著返回數(shù)據(jù)的Intent */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //通過requestCode判斷是從哪一個Activity傳遞過來的數(shù)據(jù) switch (requestCode) { case MainActivity.RESULT: if (resultCode == RESULT_OK) { //取出數(shù)據(jù) String name = data.getStringExtra("name"); textView.setText(name); } break; default: break; } }
活動的啟動模式
每一個應(yīng)用程序都有一個屬于自己的任務(wù)棧
活動的啟動模式一共有四種拥褂,分別是standard
、singleTop
牙寞、singleTask
和singleInstance
饺鹃,可以在AndroidManifest.xml
中通過給<activity>
標(biāo)簽指定android:launchMode
屬性來選額啟動模式
-
standard
模式:活動默認的啟動模式,對于以此模式啟動的活動碎税,系統(tǒng)不會在乎這個活動是否已經(jīng)在返回棧中存在尤慰,每次啟動都會創(chuàng)建該活動的一個新的實例 -
singleTop
模式:當(dāng)活動的啟動模式指定為singleTop
,在啟動活動時如果發(fā)現(xiàn)返回棧的棧頂已經(jīng)是該活動雷蹂,則認為可以直接使用它伟端,不會再創(chuàng)建新的活動實例。不過當(dāng)活動未處于棧頂位置時匪煌,這時再啟動該活動责蝠,還是會創(chuàng)建新的實例 -
singleTask
模式:當(dāng)活動的啟動模式指定為singleTask
,每次啟動該活動時系統(tǒng)首先會在返回棧中檢查是否存在該活動的實例萎庭,如果發(fā)現(xiàn)已經(jīng)存在則直接使用該實例霜医,并把這個活動之上的所有活動統(tǒng)統(tǒng)出棧,如果沒有發(fā)現(xiàn)就會創(chuàng)建一個新的活動實例 -
singleInstance
模式:指定為singleInstance
模式的活動會啟用一個新的返回棧來管理這個活動驳规。以此模式啟動的活動屬于共享活動肴敛,系統(tǒng)中只有此活動的一個實例
活動中隱藏標(biāo)題欄
-
代碼:
//隱藏標(biāo)題欄 requestWindowFeature(Window.FEATURE_NO_TITLE); //加載布局文件 setContentView(R.layout.activity_main);
隱藏標(biāo)題欄的代碼一定要在加載布局文件之前執(zhí)行,否則程序會報錯
Toast(吐司)來提示信息
吐司是一種很好的提醒方式吗购,一段時間后會自動消失医男,并且不會占用任何屏幕空間
-
假設(shè)在布局文件中已經(jīng)定義了一個按鈕,ID定義為:button_1.
//findViewById()方法獲得View對象捻勉,下轉(zhuǎn)型到Button對象 Button button1 = (Button)findViewById(R.id.button_1); //調(diào)用setonClickListener方法為按鈕注冊監(jiān)聽器 button1.setOnClickListener(new OnClickListener() { @Override //按鈕點擊镀梭,就會觸發(fā)onClick方法 public void onClick(View v) { Toast.makeText(MainActivity.this, "toast", Toast.LENGTH_SHORT).show(); } });
Toast的方法
makeText(Context context, CharSequence text, int duration)
方法創(chuàng)建一個Toast對象,三個參數(shù):context
代表Toast要求的上下文對象,text
代表Toast顯示的文本內(nèi)容踱启,duration
代表Toast顯示的時長报账,Toast有兩個內(nèi)置常量可選LENGTH_LONG
和LENGTH_SHORT
使用menu
- 在創(chuàng)建一個活動的時候,基類
Activity
會提供一個方法onCreateOptionsMenu
埠偿,這個方法當(dāng)你在點擊手機上的功能鍵是會觸發(fā)這個事件
-
1: 菜單
menu
XML文件<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- item標(biāo)簽用來創(chuàng)建具體的一個菜單項 --> <item <!-- 為菜單項指定一個唯一的標(biāo)識符 --> android:id="@+id/add_item" <!-- 給菜單項指定一個名稱 --> android:title="Add" /> <item android:id="@+id/remove_item" android:title="Remove" /> </menu>
-
2:顯示菜單文件的代碼
@Override public boolean onCreateOptionsMenu(Menu menu) { //應(yīng)用布局對象創(chuàng)挨近菜單 getMenuInflater().inflate(R.menu.main, menu); //返回true透罢,顯示菜單;若返回false胚想,創(chuàng)建的菜單將無法顯示 return true; }
-
3: 定義菜單響應(yīng)事件
@Override public boolean onOptionsItemSelected(MenuItem item) { //根據(jù)定義的ID來判斷我們點擊的是哪一個菜單項 switch (item.getItemId()) { case R.id.add_item: Toast.makeText(FirstActivity.this, "you click add", Toast.LENGTH_SHORT).show(); break; default: break; } return true; }
銷毀一個活動
- 按下back鍵可以銷毀一個活動
- 調(diào)用
finish()
方法可以銷毀一個活動