Android基礎復習——Activity

Android基礎復習——Activity

Activty 是什么

Activity 是 Android 四大應用組件(分別是Activity,Service,Content Provider, Broadcast Receiver)之一。

Activity 為用戶提供在 Android 設備屏幕上交互的界面。不管用戶是打電話,發(fā)短信,刷微博,都會有 Activity 的身影。

不信的話,我們可以使用 adb 命令查看當前界面的 Activity:

adb shell dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp'
image.png
image.png

通過上面的結果,我們可以知道酷安APP當前界面的Activity是com.coolapk.market/.view.main.MainActivity

Activty 怎么用

Activity 的生命周期

  • 創(chuàng)建我們自己的Activty,一般是繼承自Activity或是它的子類(如AppCompactActivity)。
  • 在 Activity 的生命周期方法中,實現(xiàn)我們自定義界面或業(yè)務邏輯。在onCreate()方法中調用setContentView()設置 Activity
    的界面。
  • onCreate() 方法一樣,Activity
    中有類似這樣一共七個生命周期方法。
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
    
    override fun onStart() {
        super.onStart()
    }

    override fun onResume() {
        super.onResume()
    }

    override fun onPause() {
        super.onPause()
    }

    override fun onStop() {
        super.onStop()
    }

    override fun onDestroy() {
        super.onDestroy()
    }

    override fun onRestart() {
        super.onRestart()
    }
}

那么問題來了,不同的生命周期方法,我們對應應該做哪些事情呢。
在這之前,我們必須了解Activity的三種狀態(tài)。

  1. 運行中(resumed): Activity 位于屏幕前臺并且有焦點
  2. 暫停(paused): Activity 可見(但是有其他Activity處于運行中的狀態(tài))
  3. 停止(stopped): Activity處于后臺,被其他Activity完全遮擋
方法 說明 做什么
onCreate 在創(chuàng)建Activity時調用 創(chuàng)建視圖,綁定數(shù)據等
onStart Activity即將可見 繪制元素,運行動畫
onResume Activity開始與用戶交互,Activity位于Activity棧頂層且有焦點
onPause 系統(tǒng)開始啟動其他Activity時調用 確認對持久性數(shù)據的未保存更改、停止動畫以及其他可能消耗 CPU 的內容 ps:不能執(zhí)行耗時的操作,否則其他Activity在它執(zhí)行完之前不能執(zhí)行
onStop 對用戶不可見時調用 停止UI刷新,運行動畫以及繪制元素
onDestroy 在Activity被銷毀時調用 執(zhí)行Activity銷毀前的清除工作
onRestart 在 Activity 已停止并即將再次啟動前調用。

下面這個圖時Android生命周期流程圖,很好的描述了Activity的完整生命周期以及其中的鉤子方法。

image.png

其中onCreate到onDestroy是Activity的完整生命周期

onStart和onStop是可見生命周期

onResume和onPause是前臺生命周期

Activity 的注冊

在AndroidManifest文件中聲明注冊Activity,在android:name中聲明要注冊的Activity
的類名。其他屬性可以參考文檔

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <application ...>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

intent-filter是為應用組件聲明的Intent過濾器,通過這些過濾器(根據 Intent 的操作、數(shù)據和類別指定自身接受的 Intent 類型)過濾被傳遞到應用組件(如Activity)的隱式Intent。

Activity 的啟動

  • 啟動Activity( startActivity方法)
val intent = Intent(this,SecondActivity::class.java)
intent.putExtra("data", 123)//傳遞參數(shù)
startActivity(intent)
  • 啟動Activity并獲得結果 ( startActivityForResult 方法)
val pickIntent = Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI)
startActivityForResult(pickIntent, PICK_CONTACT_REQUEST) 

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if(resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
        //處理返回結果
    }

Activity的啟動模式

共有四種啟動模式:standard,singleTop,singleTask,singleInstance

啟動模式 特點 應用場景
standard 啟動此模式的Activity,會創(chuàng)建一個新的Activity的實例 默認場景,通常Activity都是使用這種
singleTop 分兩種情況:1.啟動的Activity在棧頂,不創(chuàng)建新的實例,調用Activity的onNewIntent方法 2.不在棧頂,創(chuàng)建新的實例 適合有就更新,沒有就創(chuàng)建的場景(如搜索)
singleTask 只有一個實例,若不存在則創(chuàng)建,反之,此Activity之上的其他Activity 都出棧 APP的入口,當通過其他方式調用APP的時候,不會反復創(chuàng)建主頁面。例如其他APP調用自己的應用的時候。
singleInstance 在新的任務(Task)中開啟,并且任務中有且只有這一個實例。若不存在則創(chuàng)建,反之,調用Activity的onNewIntent方法 適合和APP分離的且不需要反復創(chuàng)建的界面

我們可以反編譯一下常用的APP,查看其中的AndroidManifest文件,就能對啟動模式有更好的理解了。

<!--網易云音樂的主界面Activity singleTask--!>
<activity android:name="com.netease.cloudmusic.activity.MainActivity" android:launchMode="singleTask" />



<!--百度地圖的消息處理Activity singleInstance--!>
<activity android:theme="@style/Theme.NoDisplay" android:name="com.baidu.android.pushservice.opproxy.OpNotifyActivity" android:exported="true" android:launchMode="singleInstance" android:configChanges="keyboardHidden|orientation">
            <intent-filter>
                <action android:name="com.baidu.BaiduMap.action.RECEIVE_MCS_MESSAGE"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
</activity>
  
  
<!--微信的語音撥號Activity singleTop--!>      
<activity android:name="com.tencent.mm.plugin.ipcall.ui.IPCallDialUI" android:launchMode="singleTop" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation|screenSize"/>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容