當前位置:首頁 » 安卓系統 » androidlargeheap

androidlargeheap

發布時間: 2023-02-05 22:59:04

A. Android 在程序運行時,有若干個activity,怎麼在退出這個Activity是,釋放掉它所佔用的運行空間

你每次退出activity的時候調用finish()稍後會自動清理釋放內存的,你可以直接在activity的onStop方法裡面寫這個方法,這樣當界面不可見的時候就會自動finish了

你可以在你的Manifest裡面的application中加
android:largeHeap="true"
android:hardwareAccelerated="true"
這樣系統就會分配更大的內存給你了

B. android轉場動畫windowAnimation和ActivityAnimation的區別

1.windowAnimation包括windowEnterAnimation和windowExitAnimation;
ActivityAnimation包含android:activityOpenEnterAnimation,android:activityOpenExitAnimation,android:activityCloseEnterAnimation和android:activityCloseExitAnimation
2.在項目中WindowAnimation的控制權大於Activity的控制權,
即在Activity轉場過程中,如果同時設置了WindowAnimation和ActivityAnimation,那麼可能(因為這種情況非常多)只會執行WindowAnimation
3.對於WindowAnimation的定義很簡單,在style.xml文件中只需要繼承Animation Style即可
<style name="Animation" parent="@android:style/Animation">
<!--窗體進入動畫-->
<item name="android:windowEnterAnimation">@anim/slide_left_enter</item>
<!--窗體退出動畫-->
<item name="android:windowExitAnimation">@anim/slide_right_exit</item>
</style>
對於Activity,需要繼承Animation Activity Style
<style name="FeelyouWindowAnimTheme" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@android:anim/slide_in_left</item>
<item name="android:activityOpenExitAnimation">@android:anim/slide_out_right</item>
<item name="android:activityCloseEnterAnimation">@anim/push_right_in</item>
<item name="android:activityCloseExitAnimation">@anim/push_left_out</item>
</style>
當我們從 A1 啟動 A2 時,A1 從屏幕上消失,這個動畫叫做 android:activityOpenExitAnimation
當我們從 A1 啟動 A2 時,A2 出現在屏幕上,這個動畫叫做 android:activityOpenEnterAnimation
當我們從 A2 退出回到 A1 時,A2 從屏幕上消失,這個叫做 android:activityCloseExitAnimation
當我們從 A2 退出回到 A1 時,A1 出現在屏幕上,這個叫做 android:activityCloseEnterAnimation
從上述2中動畫的定義上來看,顯然ActivityAnimation更為復雜,但這種復雜帶來的轉場效果非常好,
可以同時控制2個Activity的動畫,而不像WindowAnimation只能控制下一個Activity的窗體動畫。
5.在開發中,窗體動畫也可以使用 Activity.overridePendingTransition來設置,也可以定義在主題中,但Activity只能使用在主題中
<application
android:name="test.view.weitop.BaseApplication"
android:allowBackup="false"
android:hardwareAccelerated="false"
android:icon="@drawable/app_logo"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/Theme.App" >
</application>
6.對於比較追求界面美感的動畫,使用ActivityAnimation要好得多,因此對於一般開發使用windowAnimation即可,
但對於追求用戶體驗,那麼直接使用Activity Animation 吧

C. Android App內存優化

內存優化就是對內存問題的一個預防和解決,做內存優化能讓應用掛得少、活得好和活得久。

掛的少:
「掛」指的是 Crash,內存問題導致 Crash 的具體表現就是內存溢出異常 OOM。

活得好:
活得好指的是使用流暢,Android 中造成界面卡頓的原因有很多種,其中一種就是由內存問題引起的。內存問題之所以會影響到界面流暢度,是因為垃圾回收(GC,Garbage Collection),在 GC 時,所有線程都要停止,包括主線程,當 GC 和繪制界面的操作同時觸發時,繪制的執行就會被擱置,導致掉幀,也就是界面卡頓。

活得久:
活得久指的是我們的應用在後台運行時不會被幹掉。Android 會按照特定的機制清理進程,清理進程時優先會考慮清理後台進程。清理進程的機制就是LowMemoryKiller。在 Android 中不同的進程有著不同的優先順序,當兩個進程的優先順序相同時,低殺會優先考慮幹掉消耗內存更多的進程。也就是如果我們應用佔用的內存比其他應用少,並且處於後台時,我們的應用能在後台活下來,這也是內存優化為我們應用帶來競爭力的一個直接體現。

內存佔用是否越少越好?
當系統 內存充足 的時候,我們可以多用 一些獲得更好的性能。當系統 內存不足 的時候,我們希望可以做到 」用時分配,及時釋放「。內存優化並不能一刀切。

我們都知道,應用程序的內存分配和垃圾回收都是由Android虛擬機完成的,在Android 5.0以下,使用的是Dalvik虛擬機,5.0及以上,則使用的是ART虛擬機。
Android虛擬機Dalvik和ART

1、內存區域劃分

詳細請看以下兩篇文章(建議全看):
java內存四大區_JVM內存區域劃分
Android 內存機制

2、內存回收

垃圾收集的標記演算法(找到垃圾):

垃圾收集演算法(回收垃圾):

引用類型:強引用、軟引用、弱引用、虛引用

對象的有效性=可達性+引用類型

JAVA垃圾回收機制-史上最容易理解看這一篇就夠了
Android:玩轉垃圾回收機制與分代回收策略

android中還存在低殺機制,這種情況屬於系統整機內存不足,直接把應用進程殺掉的情況。

Android後台殺死系列:LowMemoryKiller原理

1、內存溢出
系統會給每個App分配內存空間也就是heap size值,當app佔用的內存加上申請的內存超過這個系統分配的內存限額,最終導致OOM(OutOfMemory)使程序崩潰。

通過命令 getprop |grep dalvik.vm.heapsize 可以獲取系統允許的最大
注意:在設置了heapgrowthlimit的狀況下,單個進程可用最大內存為heapgrowthlimit值。在android開發中,若是要使用大堆,須要在manifest中指定android:largeHeap為true,這樣dvm heap最大可達heapsize。
關於heapsize & heapgrowthlimit

2、內存泄漏
Android系統虛擬機的垃圾回收是通過虛擬機GC機制來實現的。GC會選擇一些還存活的對象作為內存遍歷的根節點GC Roots,通過對GC Roots的可達性來判斷是否需要回收。內存泄漏就是 在當前應用周期內不再使用的對象被GC Roots引用,造成該對象無法被系統回收,以致該對象在堆中所佔用的內存單元無法被釋放而造成內存空間浪費,使實際可使用內存變小。簡言之,就是 對象被持有導致無法釋放或不能按照對象正常的生命周期進行釋放。
Android常見內存泄漏匯總

3、內存抖動
指的是在短時間內大量的新對象被實例化,運行時可能無法承載這樣的內存分配,在這種情況下就會導致垃圾回收事件被大量調用,影響到應用程序的UI和整體性能,最終可能導致卡頓和OOM。
常見情況:在一些被頻繁調用的方法內不斷地創建對象。例如在View 的onDraw方法內new 一些新的對象。

注意內存抖動也會導致 OOM,主要原因有如下兩點:

1、Android Studio Profiler

作用

優點

內存抖動問題處理實戰

理解內存抖動的概念的話,我們就能明白只要能找到抖動過程中所產生的對象及其調用棧,我們就能解決問題,剛好Android Studio 的Porfiler裡面的Memory工具就能幫我們記錄下我們操作過程中或靜止界面所產生的新對象,並且能清晰看到這些對象的調用棧。

選擇Profile 中 的Memory ,選擇 Record Java/Kotlin allocations,再點擊Record開始記錄, Record Java/Kotlin allocations 選項會記錄下新增的對象。

操作完成之後,點擊如圖所示的紅腦按鈕,停止記錄。

停止記錄後,我們就可以排序(點擊 Allocations可以排序)看看哪些對象或基本類型在短時間被頻繁創建多個,點擊這些新增的對象就可以看到它的完成的調用鏈了,進而就找找到導致內存抖動的地方在哪裡了。

2、利用DDMS 和 MAT(Memory Analyzer tool)來分析內存泄漏

我們利用工具進行內存泄漏分析主要是用對比法:
a.先打開正常界面,不做任何操作,先抓取一開始的堆文件。
b.一頓胡亂操作,回到原來操作前的界面。主動觸發一兩次GC,過10秒再抓取第二次堆文件。
c.通過工具對比,獲取胡亂操作後新增的對象,然後分析這些新增的對象。

DDMS作用:抓取堆文件,主動觸發GC。(其實也是可以用Android Studio 的Profile裡面的Memory工具來抓取堆文件的,但是我這邊在利用Profile 主動觸發gc 的時候會導致程序奔潰,也不知道是不是手機的問題,所以沒用Android Studio的Profiler)

MAT作用:對堆文件進行對比,找到多出的對象,找到對象的強引用調用鏈。

以下是詳細的過程:

步驟1.打開DDMS,選擇需要調試的應用,打開初始界面,點擊下圖的圖標(Dump Hprof File)先獲取一次堆文件。

步驟2.對應用隨便操作後,回到一開始的界面,先多觸發幾次GC ,點擊下圖的圖標(Cause Gc)來主動觸發GC,然後再次點擊 Dump Hprof File 圖標來獲取堆文件。

步驟3.通過Android Studio Profile 或者 DDMS mp 的堆文件無法在MAT 打開,需要藉助android sdk包下的一個工具hprof-conv.exe來轉換。

格式為 hprof-conv 舊文件路徑名 要轉換的名稱;
例如:hprof-conv 2022-04-13_17-54-40_827.hprof change.hprof

步驟4.把兩份堆文件導入MAT,然後選擇其中第二次獲取的堆文件,點擊 如圖所示的 Histogram查看。

步驟5.點擊下圖圖標,Compare To Another Heap Dump ,選擇另一份堆文件。

6.會得出下圖所示的 Hitogram 展示,我們主要看Objects 這一列。 如下圖所示 「+ 2」 則代表前面兩份堆文件對比,這個對象多了兩個,我們主要就是要分析這些多了出來,沒有被回收的對象。

7.加入我們從增加的對象中,看到了MainActivity ,則需要從一開始打開的Hitogram 展示裡面找到這個對象的調用棧。如下圖所示,搜索MainActivity

8.看到下圖所示解僱,然後滑鼠右鍵點擊下圖紅色圈圈著的MainActivity ,選擇 Merger Shortest Paths to Gc Roots ,再選擇 exclude all phantom/weak/soft etc.references ,就可以看到這個MainActivity 對象的強引用鏈,至此我們就可以找到MainActivity對象是被什麼引用導致無法回收了。

3、內存泄露檢測神器之LeakCanary(線下集成)

自行學習了解,接入簡單,使用簡單,基本可以解決大部分內存泄漏問題。
github地址 : https://github.com/square/leakcanary/
學習地址 : https://square.github.io/leakcanary/changelog/#version-22-2020-02-05

針對內存抖動的建議:

針對內存泄漏問題的建議:

針對內存溢出問題的建議(主要就是要減少內存佔用):

建議參考:
深入探索 Android 內存優化(煉獄級別)

對於 優化的大方向,我們應該優先去做見效快的地方,主要有以下三部分:內存泄漏、內存抖動、Bitmap。完善監控機制也是我們的重點,能幫助我們對內存問題快速分析和處理。

參考:
深入探索 Android 內存優化(煉獄級別)

D. android轉場動畫windowAnimation和ActivityAnimation的區別

android轉場動畫windowAnimation和ActivityAnimation的區別
顯而易見,window與Activity本身從名字上就知道不同,但對於項目開發中 windowAnimation和ActivityAnimation的區別必須心領神會。
區別主要如下
1.windowAnimation包括windowEnterAnimation和windowExitAnimation;ActivityAnimation包含android:activityOpenEnterAnimation,android:activityOpenExitAnimation,android:activityCloseEnterAnimation和android:activityCloseExitAnimation
2.在項目中WindowAnimation的控制權大於Activity的控制權,即在Activity轉場過程中,如果同時設置了WindowAnimation和ActivityAnimation,那麼可能(因為這種情況非常多)只會執行WindowAnimation
3.對於WindowAnimation的定義很簡單,在style.xml文件中只需要繼承Animation Style即可
<style name="Animation" parent="@android:style/Animation">
<!--窗體進入動畫-->
<item name="android:windowEnterAnimation">@anim/slide_left_enter</item>
<!--窗體退出動畫-->
<item name="android:windowExitAnimation">@anim/slide_right_exit</item>
</style>

對於Activity,需要繼承Animation Activity Style
<style name="FeelyouWindowAnimTheme" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@android:anim/slide_in_left</item>
<item name="android:activityOpenExitAnimation">@android:anim/slide_out_right</item>
<item name="android:activityCloseEnterAnimation">@anim/push_right_in</item>
<item name="android:activityCloseExitAnimation">@anim/push_left_out</item>
</style>
當我們從 A1 啟動 A2 時,A1 從屏幕上消失,這個動畫叫做 android:activityOpenExitAnimation
當我們從 A1 啟動 A2 時,A2 出現在屏幕上,這個動畫叫做 android:activityOpenEnterAnimation
當我們從 A2 退出回到 A1 時,A2 從屏幕上消失,這個叫做 android:activityCloseExitAnimation
當我們從 A2 退出回到 A1 時,A1 出現在屏幕上,這個叫做 android:activityCloseEnterAnimation

從上述2中動畫的定義上來看,顯然ActivityAnimation更為復雜,但這種復雜帶來的轉場效果非常好,可以同時控制2個Activity的動畫,而不像WindowAnimation只能控制下一個Activity的窗體動畫。
5.在開發中,窗體動畫也可以使用 Activity.overridePendingTransition來設置,也可以定義在主題中,但Activity只能使用在主題中
<application
android:name="test.view.weitop.BaseApplication"
android:allowBackup="false"
android:hardwareAccelerated="false"
android:icon="@drawable/app_logo"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/Theme.App" >

</application>

6.對於比較追求界面美感的動畫,使用ActivityAnimation要好得多,因此對於一般開發使用windowAnimation即可,但對於追求用戶體驗,那麼直接使用Activity Animation 吧

E. android源碼中有launcher2launcher3,用的是哪個

1、Launcher進程啟動過程
可以由下面圖看到Launcher進程是如何被創建啟動:

Activity Manager通過發送Intend來啟動Launcher。
Intent intent = new Intent(mTopAction, mTopData != null ?

Uri.parse(mTopData) : null);

intent.setComponent(mTopComponent);

if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL)

{

intent.addCategory(Intent.CATEGORY_HOME);

}

startActivityLocked(null, intent, null, null, 0, aInfo,

null, null, 0, 0, 0, false, false);
復制代碼
因此,如果你要開機啟動一個替換Launcher的程序,只要在程序<intent-filter>裡面加入action.MAIN 、
category.HOME、category.DEFAULT就可以。如果出現多個程序都加入這種intent,系統會彈出讓你選擇
哪個作為啟動器。

2、Launcher初始化——LauncherApplication。
Application類,我想大部分做Android應用的朋友都用過,每個Android應用默認都有一個Application類,
你也可以繼承Application類,然後加入自己代碼。Application是一個全局的應用類,在AndroidManifest.xml
我們也可以找到Application標簽。

<application

android:name="com.android.launcher2.LauncherApplication"

android:label="@string/application_name"

android:icon="@drawable/ic_launcher_home"

android:hardwareAccelerated="@bool/config_hardwareAccelerated"

android:largeHeap="@bool/config_largeHeap"

android:configChanges="locale">

</application>
復制代碼
Android四大組件的聲明都需要放到application標簽裡面,默認使用的是系統的Application類,如果你在項目裡面重載了它。就需要在標簽,name屬性下寫上你的新的Application類名。Launcher裡面就是繼承了Application為LauncherApplication。應用啟動的時候首先會載入Application。我們可以看到Launcher主類Launcher.java的onCreate函數裡面,第一個就是獲取Application的實例。
LauncherApplication app = ((LauncherApplication)getApplication());
復制代碼
接下來我們看看LauncherApplication裡面初始化,LauncherApplication大部分工作就是在初始化完成,剩下都是一些返回介面。
@Override

public void onCreate()

{

super.onCreate();

//獲取屏幕大小,主要用來區分手機還是平板

final int screenSize = getResources().getConfiguration().screenLayout &

Configuration.SCREENLAYOUT_SIZE_MASK;

sIsScreenLarge = screenSize == Configuration.SCREENLAYOUT_SIZE_LARGE ||

screenSize == Configuration.SCREENLAYOUT_SIZE_XLARGE;

//屏幕密度

sScreenDensity = getResources().getDisplayMetrics().density;

//IconCahe裡面保存了界面所有應用圖標的繪畫需要的數據,這個到時候具體分析再說。

//加入這東西的主要原因是為了提高繪畫界面的效率

mIconCache = new IconCache(this);

//資料庫載入類,LauncherModel是Launcher裡面非常重要的一個類,相當於MVC模式裡面的

//Model功能,管理數據和初始化數據

mModel = new LauncherModel(this, mIconCache);

//下面注冊了一些監聽器,主要包含APK文件更新刪除等數據變化的時候接收的通知

//接收通知後,主要是用來更新Launcher裡面的資料庫。因為桌面應用圖標數據,只會載入一次

IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);

filter.addAction(Intent.ACTION_PACKAGE_REMOVED);

filter.addAction(Intent.ACTION_PACKAGE_CHANGED);

filter.addDataScheme("package");

registerReceiver(mModel, filter);

filter = new IntentFilter();

filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);

filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);

filter.addAction(Intent.ACTION_LOCALE_CHANGED);

filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);

registerReceiver(mModel, filter);

filter = new IntentFilter();

filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);

registerReceiver(mModel, filter);

filter = new IntentFilter();

filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);

registerReceiver(mModel, filter);

//contentresolver則是用於管理所有程序的contentprovider實例

ContentResolver resolver = getContentResolver();

//注冊內容觀察者,監聽application資料庫變化,回調

resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true, mFavoritesObserver);

}
復制代碼
上面是LauncherApplication最主要的工作,初始化整個Launcher的一些關鍵類,和注冊一些監聽器。主要都是用來監聽應用的安裝更新刪除等導致Launcher資料庫變化的操作。Launcher數據都是使用contentprovider來提供數據。其中注冊的監聽介面是
private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler())

{

@Override

public void onChange(boolean selfChange)

{

//重新載入界面數據

mModel.startLoader(LauncherApplication.this, false);

}

};
復制代碼
LauncherSettings.Favorites.CONTENT_URI裡面數據發生變化的時候,都會調用mModel.startLoader()介面,
重新載入Launcher的數據。startLoader的具體操作,我後面分析LauncherModel類的時候會分析。這一塊涉及
Launcher所有數據載入。剩下的接都是返回初始化時候創建的對象或者獲取屏幕密度、獲取是否大屏幕。
後面很多處理都需要判斷是否是大屏幕,4.0以後手機平板都共用一套系統,導致多了很多處理。 3、Launcher.java初始化Launcher.java是Launcher裡面最主要的類,是一個Activity。啟動的第一個組件。既然是Activity,我們要分析它初始化,毫無疑問,需要找到onCreate()裡面分析。把主要一些分析用注釋方式寫在代碼裡面,這樣比較方便閱讀。

F. android 內存優化

android 內存優化?1.內存模型與分布
我們知道android應用大多是使用java語言進行開發的,這就需要我們了解java的內存模型,此外在android中的應用都是基於Dalvik 虛擬機或者ART虛擬機,那麼對這些虛擬機的內存分布也應該有所了解。
Java內存分布模型
上圖是常見的java虛擬機的內存分布圖:

方法區:主要存儲虛擬機載入的類信息,常量,靜態變數,及時編譯器編譯後的代碼等數據。內存優化時這一部分主要考慮是不是載入了很多不必要的第三方庫。這部分的內存減少主要是常量池的回收和類的卸載(類卸載條件:無引用,類載入器可卸載)

堆:幾乎所有的對象都在這個區域產生,該區域屬於線程共享的區域,所以寫代碼時更要注意多線程安全。這個內存區域的大小變化主要是對象的創建和回收,比如:如果短時間內有大量的對象創建和回收,可能會造成內存抖動,如果對象創建之後一直回收不掉,則會導致內存泄漏,嚴重的內存泄漏會導致頻繁的gc,從而是界面卡頓。

虛擬機棧:這個區域描述的是java方法執行的內存模型,我們常說的方法棧的入棧就是將方法的棧幀存儲到虛擬機棧,這個區域是線程私有的,其生命周期就是線程的生命周期。也就是說每個線程都會有,默認一個線程的線程棧大小是1M,這不包括在方法中產生的其他對象的大小。這一塊我們能控制的就是線程的數量,特別是程序中沒有使用線程池或者使用的多個第三方庫都帶有線程池的情況。

本地方法棧:同虛擬機棧的作用非常類似,是為虛擬機執行native方法服務的,所以需要注意的地方也和虛擬機棧一樣,特別是使用了第三方so的情況

程序計數器:當前線程執行的虛擬機位元組碼的行號記錄器,佔用的內存較小,可以不考慮

2.內存限制
android是基於linux系統的,android中的進程分為兩種:

1.native進程:採用C/C++實現,不包含dalvik實例的linux進程,/system/bin/目錄下面的程序文件運行後都是以native進程形式存在的

2.java進程:實例化了dalvik虛擬機實例的linux進程,進程的入口main函數為java函數。dalvik虛擬機實例的宿主進程是fork()系統調用創建的linux進程,所以每一個android上的java進程實際上就是一個linux進程,只是進程中多了一個dalvik虛擬機實例

我們知道,操作系統對進程的內存是有限制的,而且操作系統對dalvik虛擬機自身的堆內存大小也是有限制的。可以通過如下命令查看限制大小:
adb shell getprop | grep dalvik.vm.heapgrowthlimit
可以在Androidmanifest文件中application節點加入android:largeHeap=「true」來增加其dalvik虛擬機中堆的大小

我們常說的堆大小其實是包涵兩部分的,一是java的堆,而是native的堆,java堆中主要是一下java對象,由 C/C++申請的內存空間則在native堆中,也有一些對象需要結合native和java堆共同完成,比如bitmap,bitmap分為bitmap對象和其中存儲的像素值,對象分配在java堆,而存儲的像素值則根據版本不同存儲的位置也不同,api 11 - api 25是存儲在java堆中的,其他版本是存儲在native堆中的
3.內存泄漏
常見的內存泄漏:

1.靜態引用(自身代碼和第三方代碼)

2.集合內引用

3.Handler消息未清除

4.非靜態的內部類中持有外部內的應用

5.匿名內部類/非靜態內部類和非同步線程

檢查的方式:

我這里使用的是leakcanary,一般簡單的內存泄漏可以直接在leakcanary中查到引用鏈路,不能查看的我是使用MAT來分析的
當前內存信息

上圖中各項詳細的指標的意義可以在這里查到,這里主要佔比比較大的幾個區域:

allocated:表示app內分配的java的對象數,從當前數值可以看出程序內可能存在過多創建對象的情況,比如string對象

Native:從 C 或 C++ 代碼分配的對象內存,頻繁進出相關頁面發現native堆的大小並沒有減小,說明存在c/c++層的內存泄漏

Code:您的應用用於處理代碼和資源(如 dex 位元組碼、已優化或已編譯的 dex 碼、.so 庫和字體)的內存。這個區域能優化的就是移除不需要的so庫,懶載入使用so庫,移除無用代碼(import,方法和類)
4.優化實踐
了解了android中的內存分布和泄漏相關,接下來就是結合自身業務進行內存優化了,如下:

1.先解決程序中內存佔用較大的業務模塊中的內存泄漏,不熟悉MAT的使用的可以看看這個

2.移除程序中多餘的代碼和引用,這里使用默認的lint檢測再配合shrinkResources來刪除無效資源

3.優化圖片,保證圖片放置在合理的文件夾,根據View大小載入合適的圖片大小,根據手機狀態配置bitmap和回收策略

4.優化對象創建,比如string,使用對象池等

G. android轉場動畫windowAnimation和ActivityAnimation的區別

android轉場動畫windowAnimation和ActivityAnimation的區別顯而易見,window與Activity本身從名字上就知道不同,但對於項目開發中 windowAnimation和ActivityAnimation的區別必須心領神會。區搜索別主要如下1.windowAnimation包括 windowEnterAnimation 和 windowExitAnimation ;ActivityAnimation包含 android:activityOpenEnterAnimation , android:activityOpenExitAnimation , android:activityCloseEnterAnimation 和 android:activityCloseExitAnimation2.在項目中WindowAnimation的控制權大於Activity的控制權,即在Activity轉場過程中,如果同時設置了WindowAnimation和ActivityAnimation,那麼 可能(因為這種情況非常多) 只會執行WindowAnimation3.對於WindowAnimation的定義很簡單,在style.xml文件中只需要繼承Animation Style即可<style name="Animation" parent="@android:style/Animation"><!--窗體進入動畫--><item name="android:windowEnterAnimation">@anim/slide_left_enter</item><!--窗體退出動畫--><item name="android:windowExitAnimation">@anim/slide_right_exit</item></style>對於Activity,需要繼承Animation Activity Style<style name="FeelyouWindowAnimTheme" parent="@android:style/Animation.Activity"><item name="android:activityOpenEnterAnimation">@android:anim/slide_in_left</item><item name="android:activityOpenExitAnimation">@android:anim/slide_out_right</item><item name="android:activityCloseEnterAnimation">@anim/push_right_in</item><item name="android:activityCloseExitAnimation">@anim/push_left_out</item></style>當自己從 A1 啟動 A2 時,A1 從屏幕上消失,這個動畫叫做 android:activityOpenExitAnimation當自己從 A1 啟動 A2 時,A2 出現在屏幕上,這個動畫叫做 android:activityOpenEnterAnimation當自己從 A2 退出回到 A1 時,A2 從屏幕上消失,這個叫做 android:activityCloseExitAnimation當自己從 A2 退出回到 A1 時,A1 出現在屏幕上,這個叫做 android:activityCloseEnterAnimation從上述2中動畫的定義上來看,顯然ActivityAnimation更為復雜,但這種復雜帶來的轉場效果非常好,可以同時控制2個Activity的動畫,而不像WindowAnimation只能控制下一個Activity的窗體動畫。5.在開發中,窗體動畫也可以使用 Activity. overridePendingTransition來設置,也可以定義在主題中,但Activity只能使用在主題中<applicationandroid:name="test.view.weitop.BaseApplication"android:allowBackup="false"android:hardwareAccelerated="false"android:icon="@drawable/app_logo"android:label="@string/app_name"android:largeHeap="true"android:theme="@style/Theme.App" ></application>6.對於比較追求界面美感的動畫,使用ActivityAnimation要好得多,因此對於一般開發使用windowAnimation即可,但對於追求用戶體驗,那麼直接使用Activity Animation 吧

H. Android heapsize & heapgrowthlimit

一般 heapgrowthlimit < heapsize,
當 android:largeHeap=「true」 為true 時, 應用可使用最大heapsize,超過時發生OOM

I. android轉場動畫windowAnimation和ActivityAnimation的區別

1.windowAnimation包括windowEnterAnimation和windowExitAnimation;
ActivityAnimation包含android:activityOpenEnterAnimation,android:activityOpenExitAnimation,android:activityCloseEnterAnimation和android:activityCloseExitAnimation
2.在項目中WindowAnimation的控制權大於Activity的控制權,
即在Activity轉場過程中,如果同時設置了WindowAnimation和ActivityAnimation,那麼可能(因為這種情況非常多)只會執行WindowAnimation
3.對於WindowAnimation的定義很簡單,在style.xml文件中只需要繼承AnimationStyle即可
<stylename="Animation"parent="@android:style/Animation">
<!--窗體進入動畫-->
<itemname="android:windowEnterAnimation">@anim/slide_left_enter</item>
<!--窗體退出動畫-->
<itemname="android:windowExitAnimation">@anim/slide_right_exit</item>
</style>
對於Activity,需要繼承AnimationActivityStyle
<stylename="FeelyouWindowAnimTheme"parent="@android:style/Animation.Activity">
<itemname="android:activityOpenEnterAnimation">@android:anim/slide_in_left</item>
<itemname="android:activityOpenExitAnimation">@android:anim/slide_out_right</item>
<itemname="android:activityCloseEnterAnimation">@anim/push_right_in</item>
<itemname="android:activityCloseExitAnimation">@anim/push_left_out</item>
</style>
當我們從A1啟動A2時,A1從屏幕上消失,這個動畫叫做android:activityOpenExitAnimation
當我們從A1啟動A2時,A2出現在屏幕上,這個動畫叫做android:activityOpenEnterAnimation
當我們從A2退出回到A1時,A2從屏幕上消失,這個叫做android:activityCloseExitAnimation
當我們從A2退出回到A1時,A1出現在屏幕上,這個叫做android:activityCloseEnterAnimation
從上述2中動畫的定義上來看,顯然ActivityAnimation更為復雜,但這種復雜帶來的轉場效果非常好,
可以同時控制2個Activity的動畫,而不像WindowAnimation只能控制下一個Activity的窗體動畫。
5.在開發中,窗體動畫也可以使用Activity.overridePendingTransition來設置,也可以定義在主題中,但Activity只能使用在主題中
<application
android:name="test.view.weitop.BaseApplication"
android:allowBackup="false"
android:hardwareAccelerated="false"
android:icon="@drawable/app_logo"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/Theme.App">
</application>
6.對於比較追求界面美感的動畫,使用ActivityAnimation要好得多,因此對於一般開發使用windowAnimation即可,
但對於追求用戶體驗,那麼直接使用ActivityAnimation吧

J. android 為什麼容易出現oom

頭些年的設備內存容量小,dalvik虛擬機被設置為16M內存運行,為了保留足夠的內存,對於bitmap限制為一半,即8M,8M是個什麼概念呢,如果RAGB8888格式的圖片,8M就是800萬像素的圖片,一般的手機都可以達到甚至超過這個標准。所以通常出現OOM都是在以前的設備上運行解碼圖片的時候產生的。
比較新的版本SDK支持配置largeheap選項,會得到一個較大的運行內存,再加上這兩年設備的內存容量大大增加,幾乎可以與PC相當,這個問題就沒那麼容易出現了。

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:333
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:374
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:610
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:31
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:106
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:940
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:737
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:801
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:507
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:370