006 Android之Activity
文章目錄
- 四大組件之Activity
- Activety概述
- Activity的響應事件
- Activity之間的數據傳遞
- 數據傳遞實例
- Activity的生命周期
- Activity聲明周期總結
- Activity的任務棧
- Activity的啟動模式
- 默認啟動模式 standard
- 棧頂復用模式 singleTop
- 棧內復用模式 singleTask
- 全局唯一模式 singleInstance
- 四大組件之紐帶Intent
- Intent概述
- Intent對象的組成
- Intent過濾器(Intent Filter)
- Intent對象的解析
四大組件之Activity
Activety概述
Activity是我們一開始學習到安卓的時候就接觸到的,在開發應用程序中,對Activity的操作分為以下幾種
Activity的響應事件
Android平臺的事件處理機制有兩種,一種是基于回調機制的,另一種是基于監聽接口的
Android平臺中,每個View都有自己的處理事件的回調方法,開發人員可以通過重寫View中的這些回調方法來實現需要的響應事件。當某個事件沒有被任何一個View處理時,便會調用Activity中相應的回調方法
常用的回調方法:
- onKeyDown 按下觸發
- onKeyUp 彈起觸發
- onTouchEvent 觸摸觸發
- onTrackballEvent 軌跡球處理
- onFocusChanged 焦點改變時觸發
代碼示例如下:
@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {Log.d("GuiShou","onKeyUp");return super.onKeyUp(keyCode, event);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {Log.d("GuiShou","onKeyDown");return super.onKeyDown(keyCode, event);}@Overridepublic boolean onTouchEvent(MotionEvent event) {Log.d("GuiShou","onTouchEvent");return super.onTouchEvent(event);}重寫三個響應事件
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ahWkw4hA-1623033131158)(006 Android之Activity.assets/1622964287514.png)]
啟動app并產生相應的動作會打印日志
Activity之間的數據傳遞
Activity之間的數據傳遞分為以下幾步:
數據傳遞實例
首先新建一個空的Activity文件
新建完成之后會產生一個新的layout文件
然后在第一個Activity中編寫界面代碼
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/tv1"android:textSize="20sp"android:text="第一個Activity"android:layout_width="match_parent"android:layout_height="wrap_content" /><Buttonandroid:id="@+id/btn1"android:text="啟動Activity"android:onClick="btnClick1"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>新增一個按鈕和響應事件,編寫代碼傳遞數據
public void btnClick1(View view) {//創建Intent對象Intent intent=new Intent();//設置類類型intent.setClass(this, Main2Activity.class);//設置傳遞的數據intent.putExtra("name","hello");//啟動ActivitystartActivity(intent);}然后在另一個Activity的onCreate方法中接收數據
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);//接收數據Intent intent=getIntent();String name=intent.getStringExtra("name");//顯示數據TextView textView=findViewById(R.id.tv2);textView.setText("傳遞的數據:"+name);}實際效果如圖:
Activity的生命周期
先上圖
下面看一個實例
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.d("GuiShou","onCreate");}@Overrideprotected void onRestart() {super.onRestart();Log.d("GuiShou","onRestart");}@Overrideprotected void onStart() {super.onStart();Log.d("GuiShou","onStart");}@Overrideprotected void onResume() {super.onResume();Log.d("GuiShou","onResume");}@Overrideprotected void onPause() {super.onPause();Log.d("GuiShou","onPause");}@Overrideprotected void onStop() {super.onStop();Log.d("GuiShou","onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d("GuiShou","onDestroy");}重寫MainActivity中的這幾個方法,并打印日志,接著啟動app
程序會依次調用onCreate onStart和onResume三個方法
然后點擊回到主頁面,會調用onPause和onStop方法
再次啟動程序,會調用onRestart onStart和onResume方法
了解了Activity的生命周期,作為一個開發者而言,應用程序在某種狀態下需要做一些備份和保存,可以更好的去處理這些狀態;而作為逆向分析人員來說,就可以很清楚的知道這些函數執行的先后順序,從而明白應該先分析哪個方法,再分析哪個方法。
Activity聲明周期總結
Activity從創建到進入運行態所觸發的事件
onCreate()-->onStrat()-->onResume()從運行態到停止態所觸發的事件
onPause()-->onStop()從停止態到運行態所觸發的事件
onRestart()-->onStart()-->onResume()從運行態到暫停態所觸發的事件
onPause()從暫停態到運行態所觸發的事件
onResume()Activity的任務棧
- Android是通過一種任務棧的方式來管理Activity的
- 當運行起來后就會開啟一條線程,線程中會運行一個任務棧,當Activity實例創建后就會放入任務棧
- 一個Activity實例的狀態決定他在棧中的位置
- 處于前臺的Activity總是在棧的頂端,當前臺的Activity因為異常或者其他原因被銷毀時,處于棧第二層的Activity將被激活,上浮到棧頂
- 當新的Activity啟動入棧時,原Activity會被壓入到棧的第二層
Activity的啟動模式
Activity的啟動模式設置在Manifest文件中,通過配置Activity的屬性android:launchMode=設置啟動模式
默認啟動模式 standard
我們平時直接創建的Activity都是默認模式,這種模式的特點是:只要你創建了Activity實例,一旦激活該Activity,則會向任務棧中加入新創建的實例,退出Activity則會在任務棧中銷毀該實例
如圖所示:
棧頂復用模式 singleTop
這種模式會考慮當前要激活的Activity實例在任務棧中是否處于棧頂,如果處于棧頂則無需重新創建新的實例,會重用已存在的實例調用onNewIntent,否則會在任務棧中創建新的實例
棧內復用模式 singleTask
如果任務棧中存在該模式的Activity,則把棧中該實例以上的Activity實例全部移除,調用該實例的onNewIntent方法重用該Activity,使該實例處于棧頂位置,否則就重新創建一個新的Activity實例
對于那些及其耗費系統資源的Activity,我們可以考慮將其設為singleTask模式,減少資源耗費
全局唯一模式 singleInstance
這種啟動模式比較特殊,因為它會啟用一個新的棧結構,將Activity放置于這個新的結構中,并保證不再有其他的Activity實例進入
四大組件之紐帶Intent
Intent概述
Andriod中的四大組件
Intent是組件與組件之間的紐帶,一個應用程序的三個核心組件——Activity Service Broadcast Receiver,都是通過intents的消息激活的
- Activity:一個Intent對象傳遞startActivity()或startActivityForResult()去啟動一個活動或使一個已存在的活動去做新的事情
- Service:一個Intent對象傳遞給startService()去初始化一個service或傳遞一個新的指令給正在運行的service。類似的,一個Intent可以傳遞給bindService()去建立調用組件和目標服務之間的連接
- Broadcast Receiver:一個Intent對象傳遞給任何廣播方法(如sendBroadcast()),都將傳遞到所有感興趣的廣播接收者
Intent對象的組成
一個Intent對象包含對Intent有興趣的組件的信息,有下面幾個部分
Intent過濾器(Intent Filter)
Intent Filter就是用來注冊Activity Service和Broadcast Receiver,具有能在某種數據上執行一個動作的能力
使用Intent Filter,應用程序組件告訴Android,它們能為其他程序的組件的動作請求提供服務,包括同一個程序的組件,本地的或第三方的應用程序
為了注冊一個應用程序組件為Intent處理者,在組件的manifest節點添加一個intent-filter標簽
常見的Intent Filter檢測
Intent對象的解析
Intent可以分為兩組:
- 顯示Intent:通過名字指定目標組件,本身程序使用居多。之前的數據傳遞實例就是顯示Intent
- 隱式Inyent:并不指定目標的名字,常用于激活其他程序中的組件
隱式方式啟動Activity實例:
首先在Manifest為要啟動的Activity新增一個action name屬性
<activity android:name=".Main2Activity"><intent-filter><action android:name="com.example.a87321.action" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></activity>然后在MainActivity中編寫代碼
public void btnClick4(View view) {//創建Intent對象Intent intent=new Intent();//設置信息intent.setAction("com.example.a87321.action");//啟動ActivitystartActivity(intent);}即可用隱式的方式啟動Activity
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的006 Android之Activity的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 005 Android之数据存储
- 下一篇: 007 Android之Broadcas