日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

006 Android之Activity

發(fā)布時間:2025/3/21 Android 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 006 Android之Activity 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 四大組件之Activity
      • Activety概述
      • Activity的響應(yīng)事件
      • Activity之間的數(shù)據(jù)傳遞
        • 數(shù)據(jù)傳遞實例
      • Activity的生命周期
      • Activity聲明周期總結(jié)
      • Activity的任務(wù)棧
      • Activity的啟動模式
        • 默認啟動模式 standard
        • 棧頂復(fù)用模式 singleTop
        • 棧內(nèi)復(fù)用模式 singleTask
        • 全局唯一模式 singleInstance
    • 四大組件之紐帶Intent
      • Intent概述
      • Intent對象的組成
      • Intent過濾器(Intent Filter)
      • Intent對象的解析

四大組件之Activity

Activety概述

Activity是我們一開始學(xué)習(xí)到安卓的時候就接觸到的,在開發(fā)應(yīng)用程序中,對Activity的操作分為以下幾種

  • 對Activity本身的操作,比如我們需要做個游戲,需要響應(yīng)鼠標(biāo)事件,單擊,觸摸等事件
  • 要想程序功能完整,Activity往往不止一個,多個Activity就涉及到他們之間的切換以及數(shù)據(jù)傳遞
  • 在系統(tǒng)中往往不止一個應(yīng)用程序,當(dāng)我們在使用過程中,突然電話來了,界面會暫時消失,這就涉及Activity的生命周期
  • 為了適應(yīng)多種應(yīng)用程序的啟動和顯示,Activity還分為幾種啟動模式
  • Activity的響應(yīng)事件

    Android平臺的事件處理機制有兩種,一種是基于回調(diào)機制的,另一種是基于監(jiān)聽接口的

    Android平臺中,每個View都有自己的處理事件的回調(diào)方法,開發(fā)人員可以通過重寫View中的這些回調(diào)方法來實現(xiàn)需要的響應(yīng)事件。當(dāng)某個事件沒有被任何一個View處理時,便會調(diào)用Activity中相應(yīng)的回調(diào)方法

    常用的回調(diào)方法:

    • onKeyDown 按下觸發(fā)
    • onKeyUp 彈起觸發(fā)
    • onTouchEvent 觸摸觸發(fā)
    • onTrackballEvent 軌跡球處理
    • onFocusChanged 焦點改變時觸發(fā)

    代碼示例如下:

    @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);}

    重寫三個響應(yīng)事件

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ahWkw4hA-1623033131158)(006 Android之Activity.assets/1622964287514.png)]

    啟動app并產(chǎn)生相應(yīng)的動作會打印日志

    Activity之間的數(shù)據(jù)傳遞

    Activity之間的數(shù)據(jù)傳遞分為以下幾步:

  • 創(chuàng)建新的Activity
  • 啟動Activity
  • 在啟動之前傳遞數(shù)據(jù)
  • 數(shù)據(jù)傳遞實例

    首先新建一個空的Activity文件

    新建完成之后會產(chǎn)生一個新的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>

    新增一個按鈕和響應(yīng)事件,編寫代碼傳遞數(shù)據(jù)

    public void btnClick1(View view) {//創(chuàng)建Intent對象Intent intent=new Intent();//設(shè)置類類型intent.setClass(this, Main2Activity.class);//設(shè)置傳遞的數(shù)據(jù)intent.putExtra("name","hello");//啟動ActivitystartActivity(intent);}

    然后在另一個Activity的onCreate方法中接收數(shù)據(jù)

    protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);//接收數(shù)據(jù)Intent intent=getIntent();String name=intent.getStringExtra("name");//顯示數(shù)據(jù)TextView textView=findViewById(R.id.tv2);textView.setText("傳遞的數(shù)據(jù):"+name);}

    實際效果如圖:

    Activity的生命周期

    先上圖

  • 啟動Activity:系統(tǒng)會先調(diào)用onCreate方法,然后調(diào)用onStart方法,最后調(diào)用onResume,Activity進入運行狀態(tài)
  • 當(dāng)Activity被其他Activity覆蓋或者被鎖屏,系統(tǒng)會調(diào)用onPause方法,暫停當(dāng)前Activity的執(zhí)行
  • 當(dāng)前Activity由被覆蓋狀態(tài)回到前臺或解鎖屏,系統(tǒng)會調(diào)用onResume方法,再次進入運行狀態(tài)
  • 當(dāng)前Activty轉(zhuǎn)到新的Activty界面或者按Home鍵回到主屏,自身退居后臺,系統(tǒng)會先調(diào)用onPause方法,然后調(diào)用onStop方法,進入停滯狀態(tài)
  • 用戶后退回到此Activty,系統(tǒng)會先調(diào)用onRestart方法,然后調(diào)用onStart方法,最后調(diào)用onResume方法,再次進入運行狀態(tài)
  • 當(dāng)前Activity處于被覆蓋或者后臺不可見狀態(tài),即第二步和第四步,系統(tǒng)內(nèi)存不足,殺死當(dāng)前Activity,而后用戶退回當(dāng)前Activity,再次調(diào)用onCreate方法、onStart方法、onResume方法,進入運行狀態(tài)。
  • 用戶退出當(dāng)前Activity:系統(tǒng)先調(diào)用onPause方法,然后調(diào)用onStop方法,最后調(diào)用onDestory方法,結(jié)束當(dāng)前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

    程序會依次調(diào)用onCreate onStart和onResume三個方法

    然后點擊回到主頁面,會調(diào)用onPause和onStop方法

    再次啟動程序,會調(diào)用onRestart onStart和onResume方法

    了解了Activity的生命周期,作為一個開發(fā)者而言,應(yīng)用程序在某種狀態(tài)下需要做一些備份和保存,可以更好的去處理這些狀態(tài);而作為逆向分析人員來說,就可以很清楚的知道這些函數(shù)執(zhí)行的先后順序,從而明白應(yīng)該先分析哪個方法,再分析哪個方法。

    Activity聲明周期總結(jié)

    Activity從創(chuàng)建到進入運行態(tài)所觸發(fā)的事件

    onCreate()-->onStrat()-->onResume()

    從運行態(tài)到停止態(tài)所觸發(fā)的事件

    onPause()-->onStop()

    從停止態(tài)到運行態(tài)所觸發(fā)的事件

    onRestart()-->onStart()-->onResume()

    從運行態(tài)到暫停態(tài)所觸發(fā)的事件

    onPause()

    從暫停態(tài)到運行態(tài)所觸發(fā)的事件

    onResume()

    Activity的任務(wù)棧

    • Android是通過一種任務(wù)棧的方式來管理Activity的
    • 當(dāng)運行起來后就會開啟一條線程,線程中會運行一個任務(wù)棧,當(dāng)Activity實例創(chuàng)建后就會放入任務(wù)棧
    • 一個Activity實例的狀態(tài)決定他在棧中的位置
    • 處于前臺的Activity總是在棧的頂端,當(dāng)前臺的Activity因為異常或者其他原因被銷毀時,處于棧第二層的Activity將被激活,上浮到棧頂
    • 當(dāng)新的Activity啟動入棧時,原Activity會被壓入到棧的第二層

    Activity的啟動模式

    Activity的啟動模式設(shè)置在Manifest文件中,通過配置Activity的屬性android:launchMode=設(shè)置啟動模式

  • standared模式(默認)
  • singleTop模式
  • singleTask模式
  • singleInstance模式
  • 默認啟動模式 standard

    我們平時直接創(chuàng)建的Activity都是默認模式,這種模式的特點是:只要你創(chuàng)建了Activity實例,一旦激活該Activity,則會向任務(wù)棧中加入新創(chuàng)建的實例,退出Activity則會在任務(wù)棧中銷毀該實例

    如圖所示:

    棧頂復(fù)用模式 singleTop

    這種模式會考慮當(dāng)前要激活的Activity實例在任務(wù)棧中是否處于棧頂,如果處于棧頂則無需重新創(chuàng)建新的實例,會重用已存在的實例調(diào)用onNewIntent,否則會在任務(wù)棧中創(chuàng)建新的實例

    棧內(nèi)復(fù)用模式 singleTask

    如果任務(wù)棧中存在該模式的Activity,則把棧中該實例以上的Activity實例全部移除,調(diào)用該實例的onNewIntent方法重用該Activity,使該實例處于棧頂位置,否則就重新創(chuàng)建一個新的Activity實例

    對于那些及其耗費系統(tǒng)資源的Activity,我們可以考慮將其設(shè)為singleTask模式,減少資源耗費

    全局唯一模式 singleInstance

    這種啟動模式比較特殊,因為它會啟用一個新的棧結(jié)構(gòu),將Activity放置于這個新的結(jié)構(gòu)中,并保證不再有其他的Activity實例進入

    四大組件之紐帶Intent

    Intent概述

    Andriod中的四大組件

  • Activity(活動)—前臺界面
  • Service(服務(wù))—后臺服務(wù)
  • Broadcast Receiver(廣播接收者)—回調(diào)函數(shù)
  • Content Provider(內(nèi)容提供商)—共享數(shù)據(jù)
  • Intent是組件與組件之間的紐帶,一個應(yīng)用程序的三個核心組件——Activity Service Broadcast Receiver,都是通過intents的消息激活的

    • Activity:一個Intent對象傳遞startActivity()或startActivityForResult()去啟動一個活動或使一個已存在的活動去做新的事情
    • Service:一個Intent對象傳遞給startService()去初始化一個service或傳遞一個新的指令給正在運行的service。類似的,一個Intent可以傳遞給bindService()去建立調(diào)用組件和目標(biāo)服務(wù)之間的連接
    • Broadcast Receiver:一個Intent對象傳遞給任何廣播方法(如sendBroadcast()),都將傳遞到所有感興趣的廣播接收者

    Intent對象的組成

    一個Intent對象包含對Intent有興趣的組件的信息,有下面幾個部分

  • 組件名稱(包名或類名)Component Class;通過setComponent()/setClass()或者setClassName()設(shè)置,通過getComponent()讀取
  • 動作 Action;通過setAction()設(shè)置,通過getAction()獲取
  • 數(shù)據(jù) Data;通過setData()方法指定數(shù)據(jù)的URI,setType()指定MIME類型
  • 種類 Category;通過addCategory()添加
  • 附件信息 Extras;通過putExtras()和getExtras()安裝和讀取
  • Intent過濾器(Intent Filter)

    Intent Filter就是用來注冊Activity Service和Broadcast Receiver,具有能在某種數(shù)據(jù)上執(zhí)行一個動作的能力

    使用Intent Filter,應(yīng)用程序組件告訴Android,它們能為其他程序的組件的動作請求提供服務(wù),包括同一個程序的組件,本地的或第三方的應(yīng)用程序

    為了注冊一個應(yīng)用程序組件為Intent處理者,在組件的manifest節(jié)點添加一個intent-filter標(biāo)簽

    常見的Intent Filter檢測

  • 動作檢測,清單文件中的元素以子元素列出動作
  • 種類檢測,清單文件中的元素以子元素列出動作
  • 數(shù)據(jù)檢測,清單文件中的元素以子元素列出動作
  • Intent對象的解析

    Intent可以分為兩組:

    • 顯示Intent:通過名字指定目標(biāo)組件,本身程序使用居多。之前的數(shù)據(jù)傳遞實例就是顯示Intent
    • 隱式Inyent:并不指定目標(biāo)的名字,常用于激活其他程序中的組件

    隱式方式啟動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) {//創(chuàng)建Intent對象Intent intent=new Intent();//設(shè)置信息intent.setAction("com.example.a87321.action");//啟動ActivitystartActivity(intent);}

    即可用隱式的方式啟動Activity

    《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

    總結(jié)

    以上是生活随笔為你收集整理的006 Android之Activity的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。