編輯:關於Android編程
Activity是最基本的模塊,一般稱之為"活動",在應用程序中,一個Activity通常就是一個單獨的屏幕。簡單理解,Activity代表一個用戶所能看到的屏幕,主要用於處理應用程序的整體性工作,例如監聽系統事件,為用戶顯示指定的View,啟動其他Activity等。所有應用的Activity都繼承於android.app.Activity類,該類是Android提供的基層類,其他的Activity繼承該父類後,通過父類的方法來實現各種功能。
Activity 生命周期圖如下:
在android中,Activity擁有四種基本狀態:
1、Active/Runing一個新 Activity 啟動入棧後,它在屏幕最前端,處於棧的最頂端,此時它處於可見並可和用戶交互的激活狀態。
2、Paused 當 Activity 被另一個透明或者 Dialog 樣式的 Activity 覆蓋時的狀態。此時它依然與窗口管理器保持連接,系統繼續維護其內部狀態,所以它仍然可見,但它已經失去了焦點故不可與用戶交互。
3、Stoped 當 Activity 被另外一個 Activity 覆蓋、失去焦點並不可見時處於 Stoped狀態。
4、Killed Activity 被系統殺死回收或者沒有被啟動時處於 Killed狀態。
當一個 Activity 實例被創建、銷毀或者啟動另外一個 Activity 時,它在這四種狀態之間進行轉換,這種轉換的發生依賴於用戶程序的動作。
如上所示,Android 程序員可以決定一個 Activity 的"生",但不能決定它的"死",也就時說程序員可以啟動一個 Activity,但是卻不能手動的"結束"一個 Activity。當你調用 Activity.finish()方法時,結果和用戶按下 BACK 鍵一樣:告訴 Activity Manager 該 Activity 實例完成了相應的工作,可以被"回收"。隨後 Activity Manager 激活處於棧第二層的 Activity 並重新入棧,同時原 Activity 被壓入到棧的第二層,從 Active 狀態轉到 Paused 狀態。例如:從 Activity1 中啟動了 Activity2,則當前處於棧頂端的是 Activity2,第二層是 Activity1,當我們調用 Activity2.finish()方法時,Activity Manager 重新激活 Activity1 並入棧,Activity2 從 Active 狀態轉換 Stoped 狀態,Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被執行,Activity2 返回的數據通過 data參數返回給 Activity1。
非用戶行為把activity不可見的時候,例如電話忽然來了==
/** * 重新創建恢復緩存的數據 */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { Log.i("onRestoreInstanceState",savedInstanceState.getString("name")); super.onRestoreInstanceState(savedInstanceState); } /** * 被摧毀前保存緩存的一些數據 */ @Override protected void onSaveInstanceState(Bundle outState) { outState.putString("name", "簡明現代魔法"); super.onSaveInstanceState(outState); }
在android裡,有4種activity的啟動模式,分別為:
這些啟動模式可以在功能清單文件AndroidManifest.xml中進行設置,中的launchMode屬性。
相關的代碼中也有一些標志可以使用,比如我們想只啟用一個實例,則可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 標志,這個標志表示:如果這個activity已經啟動了,就不產生新的activity,而只是把這個activity實例加到棧頂來就可以了。
Intent intent = new Intent(ReorderFour.this, ReorderTwo.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); startActivity(intent);
Activity的加載模式受啟動Activity的Intent對象中設置的Flag和manifest文件中Activity的元素的特性值交互控制。
下面是影響加載模式的一些特性
核心的Intent Flag有:
核心的特性有:
四種加載模式的區別
所屬task的區別
一般情況下,“standard”和”singleTop”的activity的目標task,和收到的Intent的發送者在同一個task內,就相當於誰調用它,它就跟誰在同一個Task中。
除非Intent包括參數FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK參數,會啟動到別的task裡。
“singleTask”和”singleInstance” 總是把要啟動的activity作為一個task的根元素,他們不會被啟動到一個其他task裡。
是否允許多個實例
“standard”和”singleTop”可以被實例化多次,並且是可以存在於不同的task中;這種實例化時一個task可以包括一個activity的多個實例;
“singleTask”和”singleInstance”則限制只生成一個實例,並且是task的根元素。
singleTop 要求如果創建intent的時候棧頂已經有要創建的Activity的實例,則將intent發送給該實例,而不創建新的實例。
是否允許其它activity存在於本task內
“singleInstance”獨占一個task,其它activity不能存在那個task裡;
如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task裡運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。
而另外三種模式,則可以和其它activity共存。
是否每次都生成新實例
“standard”對於每一個啟動Intent都會生成一個activity的新實例;
“singleTop”的activity如果在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例。
比如:
現在task棧元素為A-B-C-D(D在棧頂),這時候給D發一個啟動intent,如果D是 “standard”的,則生成D的一個新實例,棧變為A-B-C-D-D。
如果D是singleTop的話,則不會生產D的新實例,棧狀態仍為A-B-C-D
如果這時候給B發Intent的話,不管B的launchmode是”standard” 還是 “singleTop” ,都會生成B的新實例,棧狀態變為A-B-C-D-B。
“singleInstance”是其所在棧的唯一activity,它會每次都被重用。
“singleTask” 如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前台。 當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法,如果收到intent生成一個activity實例,那麼用戶可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,用戶不能通過按back鍵返回到這之前的狀態。
AsyncHttpHelp是一個android平台下基於httpclient開發的HTTP網絡請求工具。優點 功能齊全,提供常用的http網絡訪問接口。 輕量級,無任
如何使用ES文件浏覽器的遠程管理。ES文件浏覽器是在android手機上常見的手機文件管理器,在基本的文件功能之上,它還支持開啟其他設備通過WiFi遠程連接
剛學習了自定義view,就按照極客學院的教程做了粒子雨效果,主要用到繪畫線條和多線程,其中的抽象類設計方法值得學習,1.baseview主要是設定雨滴要實現的動作,只是先
RecyclerView與ListView原理是類似的:都是僅僅維護少量的View並且可以展示大量的數據集。RecyclerView用以下兩種方式簡化了數據的展示和處理:
前面的博客中,我們已經分析過,當Android中的進程要使用電量時,需要