安卓學習筆記五(activity啟動模式、回傳數據)
標簽: Android
目錄
一、Activity的啟動模式
二、Activity間的數據回傳(startActivityForResult()方法)
Activity的啟動模式
activity的四種啟動模式:
①standard
②singleTop
③singleTask
④singleInstance
如何修改activity的啟動模式呢?
在我們的AndroidManifest.xml中修改activity的啟動模式
一、standard模式
standard模式是默認的啟動模式,即使我們不去改動AndroidManifest.xml文件,它也默認這種啟動模式
特點:每啟動一個activity就會在棧頂(Android的任務棧是一種用來存放Activity實例的容器)創建一個新的實例。
從圖中我們可以看到,
①一開始棧里只有Activity1
②第二步StartActivity2時,把實例Activity2壓入棧,這時棧內有Activity1和Activity2,其中Activity2在棧頂
③第三步StartActivity2時,不管棧內有沒有Activity2實例又創建了一個新的Activity2壓入棧,這時棧內有Activity1和2個Activity2,新創建的Activity2在棧頂
④第四步back,③中新建的Activity2被彈出,這時棧內只剩下Activity1和Activity2,②中創建的Activity2在棧頂
⑤第五步back,②中創建的Activity2被彈出,這時棧內只剩下Activity1
⑥第六步back,Activity1被彈出,銷毀棧,從內存中消失
二、singleTop模式
特點:該模式會判斷要啟動的Activity實例是否存在棧頂,若在棧頂則直接復用,不然創建新的實例
從圖中我們可以看到,
①一開始棧里只有Activity1
②第二步StartActivity2時,把實例Activity2壓入棧,這時棧內有Activity1和Activity2,其中Activity2在棧頂
③第三步StartActivity2時,我們發現棧頂已經有Activity2實例了,直接復用,不再創建新的Activity2實例,這時棧內有Activity1和Activity2
④第四步StartActivity1,判斷棧頂不是Activity1實例,所以創建新的Activity1實例壓入棧,這時棧內有2個Activity1和1個Activity2,新創建的Activity1在棧頂
⑤第五步back,④中新建的Activity1被彈出,這時棧內只剩下Activity1和Activity2,Activity2在棧頂
⑥第六步back,Activity2被彈出,這時棧內只剩下Activity1
⑦第七步back,Activity1被彈出,銷毀棧,從內存中消失
三、singleTask模式
特點:每次啟動Activity時,先檢查棧中是否存在當前Activity實例,如果存在直接使用并把當前Activity上面的所有實例彈出
從圖中我們可以看到,
①一開始棧里只有Activity1
②第二步StartActivity2時,把實例Activity2壓入棧,這時棧內有Activity1和Activity2,其中Activity2在棧頂
③第三步StartActivity3,判斷棧中沒有Activity3,所以創建新的Activity3實例壓入棧,此時棧內有Activity1和Activity2和Activity3,其中Activity3在棧頂
④第四步StartActivity1,判斷棧內是否存在Activity1實例,我們發現棧內存在Activity1,所以將Activity1上面的所有實例彈出,這時棧內僅剩一個Activity1
⑤第五步back,Activity1被彈出,銷毀棧,從內存中清除
四、singleInstance模式
特點:singleInstance模式的Activity會啟動一個新的任務棧來管理Activity實例,無論從哪個任務棧中啟動該Activity,該實例在整個系統中只有一個
從圖中我們可以看到,
①一開始棧里只有Activity1
**②第二步StartActivity2時,開辟一個新的棧存放Activity2,這時有一個TaskStack1存放Activity1和一個TaskStack2存放Activity2,Activity2在前臺
③第三步StartActivity1,我們發現已存在Activity1實例,所以我們將任務棧TaskStack1轉移到前臺,這時有一個TaskStack1存放Activity1和一個TaskStack2存放Activity2,Activity1在前臺
④第四步back,銷毀TaskStack1,此時只有一個任務棧TaskStack2存放著Activity2實例
⑤第五步back,銷毀Activity2,釋放內存
Activity的數據回傳
有些時候我們從MainActivity界面跳轉到SecondActivity界面,在SecondActivity界面進行一些操作,在關閉SecondActivity界面時,我們希望從該界面返回一些數據到MainActivity界面,那我們要怎么做呢?
我們就要利用數據回傳
(MainActivity.java):
startActivityForResult( )啟動Activity
Intent intent = new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);//從當前MainActivity跳轉到SecondActivity
startActivityForResult(intent,1);//1是請求表示碼,可以自己規定
(SecondActivity.java)返回數據:
Intent data = new Intent();//這個data不同于上面的intent,上面的intent是用于頁面跳轉,而這里的data是用于存放數據
data.putExtra("username","Amy");//存放數據
setResult(2,data);//2是結果標識碼
finish();
**setResult()**只負責返回數據,沒有跳轉功能,所以它常和finish()方法配套使用,finish()方法是用來結束目前的這個activity的。
此時,數據已經返回了,那么我們怎么在MainActivity中獲取返回的數據呢?我們要重寫**onActivityResult()**方法來獲取數據
@Override
protected void onActivityResult(int resquestCode,int resultCode,Intent data){
super.onActivityResult(resquestCode,resultCode,data);
if(resquestCode==1&&resultCode==2){
String username = data.getStringExtra("username");//獲取回傳的數據
Toast.makeText(MainActivity.this,username,Toast.LENGTH_SHORT).show();
}
}
智能推薦
Activity之間的數據回傳
Activity之間的數據回傳 這里我們拿MainActivity和SecondActivity來說明。 區別 我們拿充值回傳舉例 這上面首先startActivityForResult(intent, Contants.REQUESTCODE)中的第一個參數為意圖對象,第二個參數為自己定義的請求碼,這個其實我定義的是 1,protected void onActivityResult(int r...
安卓開發藝術探索一——Activity的生命周期和啟動模式
文章目錄 Activity的生命周期和啟動模式 Activity的生命周期 正常情況下的生命周期 異常情況下的生命周期 1.系統配置改變導致活動被殺死并重新創建 2.資源內存不足導致低優先級的Activity被殺死 Activity的啟動模式 啟動模式的設置 IntentFilter的匹配規則 1.action的匹配規則 2.category的匹配規則 3.data的匹配規則 參考資料 Activ...
Android安卓應用開發:activity回調機制
實現效果 為項目添加菜單,當點擊“退出”按鈕時詢問是否確定要退出,當點擊“配置”按鈕時顯示配置信息 1. 新鍵menu布局配置文件 在res目錄下右鍵,選擇new -> android resource file -> 選擇文件類型為menu,完成后會生成menu目錄以及menu.xml文件 添加menu Item, 把menu Item...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...