Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android 四大組件之Activity(續2),androidactivity

Android 四大組件之Activity(續2),androidactivity

編輯:關於android開發

Android 四大組件之Activity(續2),androidactivity


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掉。

空進程

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

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved