1. 程式人生 > >四大組件之Activity

四大組件之Activity

包含 -- destroy onrestart 交互 string per tar 周期

四大組件之Activity

1. 理論概述

1.1 Activity的理解

Servlet的理解回顧

  • 狹義
    • Servlet是一個interface,我們的Servlet類都必須是此接口的實現類
  • 廣義
    • Servlet是一種服務器端的組件,用來處理客戶端(瀏覽器)提交的請求,並返回一個響應界面

組件的特點

  • 它的類必須實現特定接口或繼承特定類
  • 需要在配置文件中配置其全類名
  • 它的對象不是通過new來創建的,而是系統自動創建
  • 它的對象具有一定的生命周期,它的類中有對應的生命周期回調方法

Activity的定義

  • Activity,直譯為活動,它是Android定義的四大應用組件之一,也是最重要用得最多的
  • Activity用來提供一個能讓用戶操作並與之交互的界面
  • 一個應用有多個界面,也就是包含多個Activity
  • 打電話,發短信,拍照,發郵件等功能都是通過Activity來做的

類比Activity與Servlet

Servlet Activity
組件 服務器端組件 Android客戶端組件
規範定義的接口或類 Servlet接口 Activity類
註冊 web.xml AndroidManifest.xml
生命周期方法 init()
service()
doGet()
doPost()
destroy()
onCreate()
onStart()
onResume()
...
onDestroy()
請求的發出源 瀏覽器/移動設備 手機屏幕

1.2 Intent和IntentFilter的理解

Intent的理解

  • Intent,直譯為意圖,也就是你想要做什麽或想要去哪?
  • Intent是Activity,Service和BroadcastReceiver這三個應用組件之間進行通信的信使,例如:我要在Activity中啟動另一個Activity,就必須使用Intent對象
  • 意圖對象還可以攜帶數據
  • 註意:Intent不是Android中的四大應用組件之一

Intent的分類

  • 顯示意圖:明確指定的目標組件的意圖
    • 創建對象:Intent(Context context,Class clazz)
    • 何時使用:當操作當前自己應用的組件時使用
  • 隱式意圖:沒有明確指定目標組件的意圖
    • 創建對象:Intent(String ation)
    • 何時使用:當操作其它應用的組件時使用

IntentFilter的理解

  • 在配置Activity時,可以為Activity指定一個IntentFilter的配置

  • 如果你的Activity希望其它應用能訪問到,需要配置<intent-filter>

  • 如果你想啟動其它應用的界面你必須用隱式intent,且目標界面Activity配置了<intent-filter>

  • 它的作用類似於web中的為Servlet配置的<url-pattern>

    <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

1.3 相關API

  • Intent意圖
    • Intent(Context packageContext,Class<?> cls):用於創建顯示意圖對象
    • Intent(String action):用於創建隱式意圖對象
    • putExtra(String name,Xxx value):保存額外數據
    • Xxx getXxxExtra(String name):獲取額外數據
    • setData(Uri data):設置有特定格式的uri數據
  • Activity:活動
    • startActivity(Intent intent):一般啟動Activity
    • startActivityForResult(int reqCode,Intent intent):帶回調啟動Activity
    • onActivityResult(int reqCode,int resultCode,Intent data):回調方法
    • setResult(int resultCode,Intent data):設置要返回的結果
    • finish():結束當前Activity
    • getIntent():得到啟動Activity的意圖
  • View:代表視圖的根基類
    • setOnClickListener(OnClickListener listener):設置點擊監聽
    • setOnLongClickListener(OnLongListener listener):設置長按監聽
  • SmsManager:發送短信的工具類
    • static SmaManager getDefault():得到當前對象
    • sendTextMessage(…):發送短信
  • 設置點擊監聽的2種方式
    • 方式一:Activity中添加監聽:
      • view.setOnClickListener(OnClickListener listener);
    • 方式二:布局添加監聽:
      • layout中:android:onclick="方法名"
      • Activity中:public void 方法名(View v){ }
  • 設置長按監聽
    • view.setOnLongClickListner(OnLongListener listener)

2.Activity開發

2.1 Activity的使用

技術分享圖片

2.2 Activity的生命周期

Activity界面的四種狀態

  • 運行狀態:可見也可操作
  • 暫停狀態:可見但不可操作
  • 停止狀態:不可見,但對象存在
  • 死亡狀態:對象不存在

Activity生命周期回調方法

  • onCreate()
  • onStart()
  • onResume()
  • onPause()
  • onRestart()
  • onStop()
  • onDestroy()

技術分享圖片

1)界面從“死亡”到“開始”
    創建對象-->onCreate()-->onStart()-->onResume()
2) 界面從“運行”-->“死亡”
    onPause()-->onStop()-->onDestroy()
3) 界面從“運行”-->“停止”
    onPause()-->onStop()
4) 界面從“停止”-->“運行”
    onRestart()-->onStart()-->onResume()
5) 界面從“運行”-->“暫停”
    onPause()
6) 界面從“暫停”-->“運行”
    onResume()

重要的:
    1. onCreate():在Activity對象創建後調用,只執行一次
    2. onDestroy():在Activity死亡之前調用,只執行一次
    3. onResume():界面只有經歷此方法才能可見可操作

2.3 Activity的TaskStack

  • 在Android中,系統用Task Stack(Back Stack)結構來存儲管理啟動的Activity對象
  • 一個應用啟動,系統就會為其創建一個對應的Task Stack來存儲並管理該應用的Activity對象
  • 只有最上面的任務棧的棧頂的Activity才能顯示在窗口中

2.4 Activity的launchMode

在Android中,啟動一個Activity有時需要總是創建一個新對象,有時需要復用已有的對象,可以通過在配置activity時通過 launchMode屬性指定。

launchMode屬性值(4個)為:

  • Standard:
    • 標準模式,每次調用startActivity()方法就會產生一個新的實例。
  • singleTop:
    • 如果已經有一個實例位於Activity棧的頂部時,就不產生新的實例
    • 如果不位於棧頂,會產生一個新的實例
  • singleTask:
    • 只有一個實例,默認在當前Task中
  • singleInstance:
    • 只有一個實例,創建時會新建一個棧,且此棧中不能有其它對象

技術分享圖片

技術分享圖片

3. 功能練習

3.1 打電話與發短信

技術分享圖片

  • 進入電話撥打界面的意圖:Intent.ACTION_DIAL
  • 進入短信編輯界面的意圖:Intent.ACTION_SENDTO
  • 撥打電話的意圖:Intent.ACTION_CALL
  • 發送短信的工具類:SmsManager
  • 需要的權限:
    • 打電話的權限:android.permission.CALL_PHONE
    • 發短信的權限:android.permission.SEND_SMS
  • 撥打電話的Uri:tel:110
  • 進入短信界面的電話Uri:smsto:110
  • 攜帶額外短信數據的標識名為:sms_body

四大組件之Activity