Android 四大組件之Activity(續2)

来源:http://www.cnblogs.com/deman/archive/2016/10/10/5941992.html
-Advertisement-
Play Games

1.生命周期 關於生命周期,在詳細講解下: 上圖是從android官網獲取的生命周期。 正常的流程,很多文章都討論過了,我們討論幾個特殊的情況。 1)OnResume->OnPause->OnResume 我們看這段解釋:The activity is no longer visible。 也就是說 ...


1.生命周期

關於生命周期,在詳細講解下:

上圖是從android官網獲取的生命周期。

正常的流程,很多文章都討論過了,我們討論幾個特殊的情況。

1)OnResume->OnPause->OnResume 我們看這段解釋:The activity is no longer visible。

也就是說在onpause階段,activity還是可見的,but,它不在最上面,這種情況一般情況下,就是在activity頁面彈一個dialog。

測試:親測,android5.1 onpause不會走到。

還有一種說法是,有一個半透明的activity覆蓋了activityA,activityA就會走到onPause,但不會onStop。

在android 5.1 上,還是會走到onStop。

我自己發現了一種可以的case:

ActivityA->ActivityB, ActivityB 的theme是@android:style/Theme.Dialog

這個時候ActivityA是onPause,but不會進入onStop。

2)App process killed

If an activity is paused or stopped, the system can drop the activity from memory by either asking it to finish, 
or simply killing its process. When it is displayed again to the user, it must be completely restarted and restored to its previous state.

上面代碼解釋了,當app處於onpause/onStop狀態時,如果系統記憶體不足,該activity就會被回收,恢復的時候將需要從onCreate從新開始走。

protected void onCreate(@Nullable Bundle savedInstanceState)

所以說判斷activity是否是首次創建,通過Bundle參數是否為null可以來判斷。

當然,activity的內容已被回收,需要考慮如何恢復場景。

這裡暫時先保留一個疑問:這個savedInstanceState是存在哪裡的,為什麼可以被重現?

關於onSavedInstanceState的說明:

這個方法不屬於生命周期的概念,所以它與OnPause沒有先後之分,並且它並不一定會被調用。

而該函數的目的,是為了在activity被回收的時候,有一個保存狀態的地方。

如果app沒有被回收,onRestoreInstanceState & onCreate也不會從新被走到。

這裡會有個問題,這2個方法的bundle參數是一樣的嗎?

是的,它們是一份內容。onRestoreInstanceState 只是在onCreate的時機不是特別好做狀態還原的時候,提供一次機會,在初始化結束的時候

回覆狀態。

onRestoreInstanceState 只有在activity重新init的時候,才會被調到。

This method is called between {@link #onStart} and
     * {@link #onPostCreate}.

onPostCreate是Activity創建過程的最後一步,一般app不需要重載該方法。

另:系統會自動保存view的狀態在savedInstanceState的時候。

關於saveInstanceState也是在mainthread裡面執行回調的。

3)onDestory回收資源

在onDestory回收資源不一定是比較好的辦法。應為onDestory可能不會被走到。一個可行的方式是自己管理資源的回收,而不依賴與生命周期。

 

2.Configuration Changes

 配置變化,包括screen方向,語言

such as a change in screen orientation, language, input devices, etc

這些改變,android希望由程式員自己來handler,所以如果沒有做任何配置,activity會被重新創建。

fulmath.samples I/MainActivity: onDestroy: com.joyfulmath.samples.MainActivity@c4f7c4d [at (MainActivity.java:74)]
10-09 06:39:35.951 3889-3889/com.joyfulmath.samples I/MainActivity: onCreate: com.joyfulmath.samples.MainActivity@28808a14 [at (MainActivity.java:27)]
10-09 06:39:35.951 3889-3889/com.joyfulmath.samples I/MainActivity: onCreate: 2 [at (MainActivity.java:31)]

但是saveInstanceState會被保存下來,這從另一個方面證明,這個bundle不是存在activity裡面的。

親測:language和screen orientation的改變,都會創建新的activity實例。

關於這塊的詳細說明android官方文檔有解釋:

https://developer.android.com/guide/topics/manifest/activity-element.html#config

我就不在覆述了。

關於語言的監聽需要從local + layoutdirection來同時設置。android:configChanges

從實際使用場景來說,屏幕方向的改變是最有可能會遇到的。orientation+screenSize需要配置在manifest中。

3.permission

關於APK之間的activity相互調用,一共有三種方式:
具體可參考http://www.cnblogs.com/winxiang/archive/2012/05/04/2482883.html

但是第一種方式是無法阻止的。就像service & contentprovider一樣,可以使用permission來控制訪問許可權。

我們可以自定義permission,並且由activity使用。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.joyfulmath.samples">
    <permission
        android:name="com.joyfulmath.samples.permission.ACCESS"
        android:label="Samples  custome permission"
        android:protectionLevel="dangerous" >
    </permission>
    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:configChanges="orientation|screenSize|locale|keyboardHidden|layoutDirection">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".basecontrol.ActivitySamples_"
            android:permission="com.joyfulmath.samples.permission.ACCESS"
            >
            <intent-filter>
                <action android:name="find.samples"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>
    </application>
    <!--android:theme="@android:style/Theme.Dialog"-->

</manifest>

上面是一個簡單的permission的使用。

permission的目的是為了阻止其他apk對該activity的任意訪問,所以同一個apk內,就沒有這個概念。包括explored屬性是一樣的。

4.Process Lifecycle

系統會儘可能的保存process的存活,但是如果一定要回收process的話,會有一個優先順序來管理。

前臺進程

進程持有一個與用戶交互的activity

進程持有一個service,該service同某個用戶交互的activity綁定。該service是setforeground。該service正在進行生命周期回調。

進程持有一個boradcast,該broadcast在進行onreceiver。

kill前臺進程需要用戶交互。

可見進程

進程持有一個可見,但不在前臺的activity,進入onpause,but沒有進入onstop。

進程持有一個可見service,該service和可見activity在交互。

服務進程

進程持有一個不屬於上面2種情況的service,也就是startservice的情況。

後臺進程

後臺進程通常就是不屬於上面3種情況下,對應activity就是在onstop狀態。

通常會有很多後臺進程在運行,系統會有一個LRU表來管理,而最遠的process將會優先被kill掉。

空進程

只是系統緩存,目的為了加快進程組件的載入。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • UIGestureRecognizer 對象會截取本應由視圖處理的觸摸事件。當某個UIGestureRecognizer對象識別出特定的手勢後,就會向指定的對象發送指定的消息。iOS SDK預設提供若幹中UIGestureRecoginezer對象。本章我們將繼續更新 JXTouchTracker ...
  • 在BaseFragment中使用了LoadingPage,而LoadingPage的聯網載入使用的是AsyncHttpClient。一直報java.lang.IllegalArgumentException: Illegal character in query at index 261解析不成功, ...
  • 本文地址:http://www.cnblogs.com/wuyudong/p/5947504.html,轉載請註明出處。 在之前的文章中,實現了導航界面1佈局編寫與相關的邏輯代碼,如下圖所示: 點擊“下一頁” 進入新的activity: 可以看到,佈局和之前的類似,代碼如下: 效果如下: ...
  • iOS4.0開始,Block橫空出世,它其實就是c預言的補充,書面點說就是帶有自動變數的匿名函數,Block簡潔,代碼的可讀性也高,因此深受廣大開發者的喜愛,這一次給大家介紹Block的基本類型和項目中的實際操作。 Block的形式如下: Block的基本類型 1.無參數無返回值 2.無參數有返回值 ...
  • Android架構 圖1 Android架構自上而下名稱為應用層、應用框架層、運行庫和Adroid虛擬機層、 Linux內核層。 1. 應用層 應用層像一座大廈裡面的磚瓦。我們所做的開發基本上都在應用層,在手機上應用層的軟體有桌面、簡訊、電話、瀏覽器、微信、扣扣等等這類軟體。應用層的軟體是在應用框架 ...
  • 本文主要介紹9patch圖 *.9.png:android手機上,可以按需求自動拉伸的圖片 本文地址:http://www.cnblogs.com/wuyudong/p/5947195.html,轉載請註明出處。 使用AS點開XXX.9.png圖片 可以看到圖片的四條邊有黑色的線段。下麵通過示意圖來 ...
  • 鏡像下載地址:https://developers.google.com/android/nexus/images 1、打開手機 設置-關於手機-點擊版本號7次,以打開“開發者選項” 2、返回上一步,開發者選項-打開USB 調試3、將手機關機4、同時按住電源鍵&音量減鍵,進入bootloader界面 ...
  • 本文來實現《Android 手機衛士--導航界面1的佈局編寫》中的圖片選擇器部分的代碼。 本文地址:http://www.cnblogs.com/wuyudong/p/5944356.html,轉載請註明出處。 這個可以參考官網提供的API文檔 圖片選擇器編寫 在選中和未選中的過程中,切換展示圖片 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...