初來學習Activity,基本用法
活動是Android的四大組件之一,它是一種可以包含用戶界面的組件,主要用于和用戶進行交互
創建活動
- Activity是Android系統提供的一個活動基類,所有的活動都必須直接或間接繼承此類才能擁有活動的特性
- Android程序的設計講究邏輯和視圖的分離,最好一個活動都能對應一個布局,布局就是用來顯示界面內容的
布局文件
- 創建布局文件: Android中布局文件是XML文件類型,當布局文件創建時,R.java文件會自動對此布局文件生成一個唯一標識符(資源ID,在內部類Layout中),當在布局文件內部組件添加時,R.java文件不會對組件自動生成資源ID,需要手動生成資源ID,方式:
android:id="@+id/id_name"
(在內部類Id中) - 加載布局文件: 在活動中調用方法:
setContentView()
,將布局文件的資源ID作為參數,即實現了在此活動中加載此布局文件。資源ID在R.java文件中的所屬的類都是靜態的,資源ID也是靜態的成員
//在代碼中引用資源ID
setContentView(R.layout.activity_main);
//在XML文件中引用資源ID
@string/hello_world
在清單文件中注冊活動
-
活動的注冊聲明要放在
application
標簽內,通過標簽activity
來對活動進行注冊<activity <!-- 具體注冊哪一個活動 --> android:name="com.example.databasetest.MainActivity" <!-- 指定活動標題欄的內容(app快捷方式的名字) --> android:label="@string/app_name" > <!-- 可以定義action和category子標簽 --> <intent-filter> <!-- 指定當前活動可以響應的action --> <action android:name="android.intent.action.MAIN" /> <!-- 指定當前活動可以響應的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
標簽內和category
標簽內若以上內容,代表此活動是此應用程序的主活動(程序啟動時,首先打開此活動)
隱式啟動活動
-
一個活動若想被隱式啟動,需要在此活動的
<Activity>
標簽下配置<intent-filter>
標簽<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
標簽指定動作 -
data
標簽指定操作的數據-
android:scheme
:用于指定數據的協議部分 -
android:mimeType
:用于指定可以處理的數據類型,允許使用通配符的方式進行指定
-
-
category
標簽指定類別
-
隱式意圖啟動
Activity
,需要為intent
設置以上三個屬性,且值必須與該Activity
在清單文件中對三個屬性的定義匹配intent-filter
節點及其子節點都可以同時定義多個,隱式啟動時只需與任意一個匹配即可
隱式啟動活動傳遞以及獲取數據
-
隱式啟動活動,通過
setData(Uri uri)
傳遞數據/*啟動系統打電話應用,通過setData傳遞數據,tel就是Data標簽中的scheme約束*/ intent.setAction(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:911"));
-
獲取
setData
中傳遞過來的數據//獲取啟動此Activity的intent對象 Intent intent = getIntent(); Uri uri = intent.getData();
啟動活動時傳遞數據
-
Activity
通過Intent
啟動時,可以通過Intent
對象攜帶數據到目標Activity
Intent intent = new Intent(this, SecondActivity.class); intent.putExtra("maleName", maleName); intent.putExtra("femaleName", femaleName); startActivity(intent);
-
在目標
Activity
中取出數據Intent intent = getIntent(); String maleName = intent.getStringExtra("maleName"); String femaleName = intent.getStringExtra("femaleName");
Intent
還可以結合Bundle
一起用于傳遞數據,首先可以把需要傳遞的數據都保存在Bundle
對象中,然后再將Bundle
對象存放在Intent
里。都了目標活動之后先從Intent
中取出Bundle
,再從Bundle
中一一取出數據
返回數據給上一個活動
從A界面打開B界面, B界面關閉的時候,返回一個數據給A界面
-
在A界面:
Activity
中有一個startActivityForResult()
方法,此方法也是用于啟動活動的,但這個方法期望在活動銷毀的時候能夠返回一個結果給上一個活動。/** * startActivityForResult(Intent intent, int requestCode) * intent:意圖對象 * requestCode:請求碼,用來區分是從哪個Activity返回的數據 * * 用這個api啟動的Activity,在銷毀時,系統會回調活動的onActivityResult */ startActivityForResult(intent, MainActivity.RESULT);
-
在B界面:
//構建一個用于傳遞數據的Intent對象 Intent intent = new Intent(); //存儲數據 intent.putExtra("name", name); /** * setResult(int resultCode, Intent data):這個方法是專門向上一個活動返回數據用的 * resultCode:用于向上一個活動返回處理結果,一般只是用 RESULT_OK 或 RESULT_CANCELED * data:帶有數據的Intent對象 */ setResult(RESULT_OK, intent); //將此活動銷毀 finish();
-
在A界面: 回調方法
onActivityResult
/** * requestCode:請求碼,和startActivityForResult方法中讀取請求碼對應,判斷是從哪個Activity返回的數據 * resultCode:返回的處理結果 * data:攜帶著返回數據的Intent */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //通過requestCode判斷是從哪一個Activity傳遞過來的數據 switch (requestCode) { case MainActivity.RESULT: if (resultCode == RESULT_OK) { //取出數據 String name = data.getStringExtra("name"); textView.setText(name); } break; default: break; } }
活動的啟動模式
每一個應用程序都有一個屬于自己的任務棧
活動的啟動模式一共有四種,分別是standard
、singleTop
、singleTask
和singleInstance
,可以在AndroidManifest.xml
中通過給<activity>
標簽指定android:launchMode
屬性來選額啟動模式
-
standard
模式:活動默認的啟動模式,對于以此模式啟動的活動,系統不會在乎這個活動是否已經在返回棧中存在,每次啟動都會創建該活動的一個新的實例 -
singleTop
模式:當活動的啟動模式指定為singleTop
,在啟動活動時如果發現返回棧的棧頂已經是該活動,則認為可以直接使用它,不會再創建新的活動實例。不過當活動未處于棧頂位置時,這時再啟動該活動,還是會創建新的實例 -
singleTask
模式:當活動的啟動模式指定為singleTask
,每次啟動該活動時系統首先會在返回棧中檢查是否存在該活動的實例,如果發現已經存在則直接使用該實例,并把這個活動之上的所有活動統統出棧,如果沒有發現就會創建一個新的活動實例 -
singleInstance
模式:指定為singleInstance
模式的活動會啟用一個新的返回棧來管理這個活動。以此模式啟動的活動屬于共享活動,系統中只有此活動的一個實例
活動中隱藏標題欄
-
代碼:
//隱藏標題欄 requestWindowFeature(Window.FEATURE_NO_TITLE); //加載布局文件 setContentView(R.layout.activity_main);
隱藏標題欄的代碼一定要在加載布局文件之前執行,否則程序會報錯
Toast(吐司)來提示信息
吐司是一種很好的提醒方式,一段時間后會自動消失,并且不會占用任何屏幕空間
-
假設在布局文件中已經定義了一個按鈕,ID定義為:button_1.
//findViewById()方法獲得View對象,下轉型到Button對象 Button button1 = (Button)findViewById(R.id.button_1); //調用setonClickListener方法為按鈕注冊監聽器 button1.setOnClickListener(new OnClickListener() { @Override //按鈕點擊,就會觸發onClick方法 public void onClick(View v) { Toast.makeText(MainActivity.this, "toast", Toast.LENGTH_SHORT).show(); } });
Toast的方法
makeText(Context context, CharSequence text, int duration)
方法創建一個Toast對象,三個參數:context
代表Toast要求的上下文對象,text
代表Toast顯示的文本內容,duration
代表Toast顯示的時長,Toast有兩個內置常量可選LENGTH_LONG
和LENGTH_SHORT
使用menu
- 在創建一個活動的時候,基類
Activity
會提供一個方法onCreateOptionsMenu
,這個方法當你在點擊手機上的功能鍵是會觸發這個事件
-
1: 菜單
menu
XML文件<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <!-- item標簽用來創建具體的一個菜單項 --> <item <!-- 為菜單項指定一個唯一的標識符 --> 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) { //應用布局對象創挨近菜單 getMenuInflater().inflate(R.menu.main, menu); //返回true,顯示菜單;若返回false,創建的菜單將無法顯示 return true; }
-
3: 定義菜單響應事件
@Override public boolean onOptionsItemSelected(MenuItem item) { //根據定義的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鍵可以銷毀一個活動
- 調用
finish()
方法可以銷毀一個活動