安卓學習筆記
標簽: 安卓
學習安卓的學習筆記,留存一下,雖然以后可能都不會從事安卓相關的工作了,紀念一下。
1 Activity
1 返回棧
活動可以層疊,啟動一個新的活動會覆蓋在原活動上,Back會銷毀最上面的活動,下面的一個活動就會重新顯示。
用任務管理一系列活動。任務用返回棧描述。
啟動一個新的活動,這個活動就在返回棧中入棧,finish()即棧頂元素出棧,系統總是會顯示處于棧頂的活動給用戶。(所以finish()銷毀的是棧頂,現在活動的會執行到finish()的也只有棧頂活動)
2 生命周期
2.1 活動的4種狀態
1 運行狀態
處于棧頂的活動,系統不愿意回收這種
2 暫停狀態
活動不處于棧頂,但是依然可見,雖然不處于棧頂,但是完全存活著的,系統也不愿意回收,除非,內存很低。
3 停止狀態
活動不處于棧頂,且完全不可見。
系統仍會為這種活動保存相應的狀態和成員變量,但是不可靠,可能會被回收,看內存情況。
4 銷毀狀態
從返回棧中移除。
系統傾向于回收處于這種狀態的活動。
2.2 活動的生命周期
2.2.1 7個回調函數
1 OnCreate()
在活動第一次被創建時候調用
可以在這里完成一些初始化動作。
2 onStart()
在活動由不可見變為可見時候調用。
3 onResume()
在活動準備好和用戶進行交互的時候調用。
此時活動一定位于棧頂,處于運行狀態。
4 onPause()
系統準備去啟動或者恢復另一個活動時候調用。
可以用來釋放資源、保存關鍵數據。
5 onStop()
在活動完全不可見時候調用。
和onPause()區別是,如果啟動的新活動是一個對話框式的活動(也就是之前的活動不會不可見),那么onPause()會得到執行。
6 onDestroy()
在活動被銷毀之前調用,之后活動狀態將變為銷毀狀態。
(即活動出棧)
7 onRestart()
在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。
2.2.2 3種生存期
- 完整生存期
onCreate()~onDestroy()
- 可見生存期
onStart()~onStop()
可見不等于可與用戶交互。
- 前臺生存期
onResume()~onPause()
前臺生存期內,活動處于運行狀態,可以和用戶進行交互。
測試:
和書上不一樣的是對話框主題要設置成這樣,不然點擊就崩潰:
<activity android:name=".DialogActivity"
android:theme = "@style/Theme.AppCompat.Dialog"></activity> <!--配置成對話框式->
MainActivity第一次被創建時,一次執行OnCreate() onStart() onResume()
點擊按鈕,啟動NormalActivity時候,MainActivity會被完全遮擋住,因此onPause()和onStop()被調用。
按下Back返回MainActivity,之前MainActivity已經進入了停止狀態,所以onRestart()方法執行,之后依次執行onStart()和onResume()
恢復執行-->不可見到可見-->交互
啟動DialogActivity,onPause()執行,關閉DialogActivity,onResume()執行,因為MainActivity沒有停止,也沒有不可見。
最后在MainActivity按下Back,依次執行:
2.2.3 Bundle
如果B返回到A,A在B運行期間被系統回收,那么會執行A的onCreate()方法,如果A中存在臨時數據和狀態也被回收了,用戶體驗很不好。
解決:onSaveInstanceState()回調方法,保證在活動回收之前一定被調用,??干嘛不重載下onDestroy啊?
/ / 在 回 收 前 ? 定 被 調 ? , 可 以 在 B u n d l e 中 保 存 數 據
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("tempData","hengheng");
}
在onCreate()里恢復
//恢復在上次回收前在Bundle中保存的數據
if(savedInstanceState !=null) {
Log.d(TAG,savedInstanceState.getString("tempData"));
}
Bundle也可結合Intent一起傳遞數據。
2.3 活動的啟動模式
如圖四種,在AndroidMainfest.xml的activity屬性里修改android:launchMode
2.3.1 standard
standard 是活動默認的啟動模式。
standard模式下,每當啟動一個新的活動,就會創建該活動一個新的實例,并入棧,不管它是否已在返回棧中存在。
比如點擊某個按鈕啟動一個activity,點擊n次就會啟動n個,back回去要back n次。
2.3.2 singleTop
啟動活動時,如果該活動在棧頂就直接使用,否則創建新的實例。
比如從MainActivity到SecondActivity,此時棧頂是SecondActivity,再從SecondActivity啟動MainActivity,這時因為棧頂不是MainActivity,會新建一個MainActivity實例,打印這兩個實例會看到不一樣。
2.3.3 singleTask
啟動活動時,會在棧中檢查有沒有,有就使用,當然在他之上的活動都會全部出棧。
如果singleTask指定了不同的taskAffinity,也會啟動一個新的返回棧。
2.3.4 singleInstance
First、Second、Third三個不同的Activity
把SecondActivity改成singleInstance,則啟動SecondActivity會把它加入一個新的返回棧,
Log.d("SecondActivity","Task id is"+getTaskId());
打印三個Activity的TaskId(所屬棧id)會發現,First和Third是相同的,Second是不同的,如果First啟動Second,Second中啟動Third,從Third Back會回到First而不是Second,因為他倆是一個棧
智能推薦
安卓學習筆記之Handler
UI線程 當系統啟動的時候,就會創建一個主線程(Main Thread),然后這個主線程向UI組件分發事件,主線程和UI的組件進行交互,故稱UI線程。 線程安全 Android的UI線程是不安全的。引用一下,百度百科的解釋 線程安全就是多線程訪問時,采用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程才可使用。不會出現數據不一致或者數據污染。 線...
安卓學習筆記之Okhttp
什么是okhttp? 我們如果原生的去寫一個網絡請求,需要用到的是HttpConnection等相關類去實現的,但是編寫原生的網絡請求,需要我們來實現更多復雜的功能,比如斷點續傳,都需要花費很長的時間去寫。效率也不高。所以我們為了方便在開發過程中能夠省電精力,需要運用到第三方網絡框架,那就是Okhttp。 Okhttp的使用 manifest添加網絡權限 < uses-permission ...
安卓學習筆記之IntentService
什么是IntentService 它會創建一個獨立的子線程來處理所有的Intent請求,創建的子線程來處理onHandleIntent()實現的代碼,無需處理多線程的問題。默認實現onBind()方法,返回為null;默認實現onStartCommand()方法,將請求的Intent添加到隊列中。這個類實際上是繼承自service,內部是封裝了HandlerThread和Handler類。 代碼實...
安卓學習筆記之Activity(一)
** 安卓四大組件之Activity ** 1.介紹 ** Activity的出現無處不在,從手機開始啟動的第一個頁面的都是Activity。主要用于可見的狀態與用戶進行交互。好比一張紙,我們需要用代碼這只“筆”來描繪一些信息告訴讀者,這張紙里面有些什么內容和需要操作什么東西。總的來說就是能看到的基本上和Activity。如果有什么錯誤的地方,希望大家指出。感激不盡。 既然...
安卓學習筆記之service(一)
安卓四大組件之Service 今天來入門一下service這個組件,這玩意是在你后臺做一些必要的工作。 ** 1.什么是service? ** 從google官網看的,官方的描述是這樣的。 A Service is an application component representing either an application’s desire to perform a long...
猜你喜歡
安卓學習筆記10:相對布局
文章目錄 零、學習目標 一、相對布局 1、布局特點 2、繼承關系圖 3、常用屬性 (1)相對于父容器居中 (2)相對于其它控件的位置 (3)相對于其它控件對齊 (4)相對于父容器對齊 (5)標識符問題 二、教學案例 —— 相對布局演示 (一)運行效果 (二)實現步驟 1、創建安卓應用【RelativeLayoutDemo】 2、主布局資源文件activity_main.xm...
安卓學習筆記08:線性布局
文章目錄 零、學習目標 一、界面與布局概述 (一)界面 (二)布局 1、視圖層次結構圖 2、UI容器 (Container) 3、UI控件 (Control) 4、兩種方式聲明布局 二、線性布局 (一)繼承關系圖 (二)常用屬性 (三)案例演示 —— 線性布局屬性 1、創建安卓應用【LinearLayoutDemo】 2、主布局資源文件activity_main.xml (...
安卓學習筆記——服務(Service)
目錄 安卓實驗(Service) 1. 創建兩個按鈕控件 2. 創建用于計時的服務(Service) 3. 注冊TimerService服務 4. 按鈕功能實現 5. 進行調試運行 安卓實驗(Service) 在Android Studio創建計時服務,并使用兩個按鈕進行控制 1. 創建兩個按鈕控件 在activity_main.xml中添加如下代碼新建兩個按鈕控件,也可在Design窗口中拖動控...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...