android数据回传多个页面_Android Day06四大组件之Activity多页面跳转和数据传递
ToolBar中menu無法同時(shí)顯示圖標(biāo)和文字問題的解決方法
Toolbar添加返回按鈕
ToolBar與ActionBar
1.什么是Activity
官方文檔是這么說的:Anwhich
users can interact in order to do something, such as dial the phone, ????take a photo, send an email, or
view a map. Each activity is given a window in ????which to draw its user interface. The window
typically fills the screen, but may be ????smaller than the screen and float on top of other
windows.
大致意思是說:Activity是一個(gè)應(yīng)用程序組件,給用戶提供一個(gè)屏幕讓用戶可以與之交互做一些事
情。
2.Activity的生命周期
下面這張圖是官方文檔提供的Activity的生命周期的圖:
·onCreate 方法 ? ?當(dāng)Activity啟動(dòng)的是調(diào)用
·onDestroy方法 ? ?當(dāng)Activity銷毀的時(shí)候調(diào)用
·onStart 方法 ? ?當(dāng)Activity可見的時(shí)候調(diào)用
·onStop 方法 ? ? 當(dāng)Activity
不可見的時(shí)候調(diào)用
·onResume 方法 ? ?當(dāng)Activity上的按鈕 獲得焦點(diǎn) 可以被點(diǎn)擊的時(shí)候調(diào)用
·onPause?方法 ? ?當(dāng)Activity 上的按鈕 失去焦點(diǎn) 按鈕不可以被點(diǎn)擊的時(shí)候調(diào)用
·onRestart 方法 ? 當(dāng)界面被重新加載的時(shí)候調(diào)用
注意這個(gè)方法
■手機(jī)按鍵對(duì)應(yīng)的Activity生命周期的回調(diào)方法
如果點(diǎn)擊BACK鍵,會(huì)調(diào)用Activity的onPause()、onStop()、onDestroy()方法,Activity
會(huì)注銷掉。
如果點(diǎn)擊HOME鍵,會(huì)調(diào)用Activity的onPause()、onStop()方法,但不會(huì)執(zhí)行onDestroy() ? 方法,程序會(huì)運(yùn)行在后臺(tái)。如果應(yīng)用程序沒有被系統(tǒng)殺死,那么再點(diǎn)擊應(yīng)用程序圖標(biāo)會(huì)調(diào)用Activity的onRestart()、onStart()、OnResume()方法。
■特殊的回調(diào)方法組合
如果打開第一個(gè)Activity之后,不關(guān)閉它,開啟另外一個(gè)Activity(非透明的),會(huì)調(diào)用第一個(gè)Activity的onPause()、onStop()方法。
如果打開第一個(gè)Activity之后,不關(guān)閉它,開啟另外一個(gè)Activity(透明的),會(huì)調(diào)用第一個(gè)
Activity的onPause()方法,而不會(huì)去調(diào)用onStop()方法,因?yàn)榈谝粋€(gè)Activity還是可見的。如果關(guān)
閉透明的Activity,第一個(gè)Activity只會(huì)回調(diào)onResume()方法。
■切屏對(duì)應(yīng)的Activity生命周期的回調(diào)方法
手機(jī)在切屏的時(shí)候,會(huì)先銷毀,再創(chuàng)建.走onPause()、onStop()、onDestroy()方法,再走onCreate
()、onStart()、onResume()方法。這一過程就相當(dāng)于關(guān)閉并重新進(jìn)入應(yīng)用一樣,那么如何防止手機(jī)
在切屏?xí)r生命周期發(fā)生改變呢?
第一種方式:把Activity頁面的朝向?qū)懰?#xff0c;通過這個(gè)屬性
android:screenOrientation="portrait"portrait代表豎屏 ?landscape代表橫屏
朝向?qū)懰?#xff0c;在手機(jī)上方向是不能改變的,但是在AVD上仍可以切屏,只是生命周期沒有變化。
第二種方式:android:configChanges="orientation|keyboardHidden|screenSize"
3.Activity的清單配置
如果想讓Activity成為應(yīng)用程序的入口,需要將activity的意圖過濾器配置如下:
Android允許程序有多個(gè)activity作為應(yīng)用程序的入口,只要activity配置了以上的意圖過濾器,就會(huì)在手機(jī)桌面上創(chuàng)建多個(gè)應(yīng)用程序圖標(biāo),點(diǎn)擊圖標(biāo)會(huì)進(jìn)入對(duì)應(yīng)的activity界面。
如果activity節(jié)點(diǎn)沒有設(shè)置自己的label和icon,會(huì)默認(rèn)使用application節(jié)點(diǎn)的label和icon。
4.Activity的頁面跳轉(zhuǎn)及數(shù)據(jù)傳遞
注意的問題,序列化的類中還有自定義的類,則這個(gè)類也要序列化,否則會(huì)出錯(cuò).
■啟動(dòng)Activity傳數(shù)據(jù)和取數(shù)據(jù)
本Activity:傳數(shù)據(jù),通過Intent對(duì)象的setData()和putExtra()方法封裝數(shù)據(jù)至Intent對(duì)象。
被調(diào)用的的Activity:取數(shù)據(jù),通過Activity類的getIntent()方法先得到開啟這個(gè)Activity的
Intent對(duì)象,也就是本Activity里傳數(shù)據(jù)用到的Intent對(duì)象,然后通過
Intent對(duì)象的getXxxExtra()方法得到數(shù)據(jù)。
■啟動(dòng)Activity的2種方式
第一種:不需要被啟動(dòng)的Activity返回?cái)?shù)據(jù)startActivity(intent);
第二種:需要被啟動(dòng)的Activity返回?cái)?shù)據(jù)startActivityForResult(intent, int類型的請(qǐng)求碼);
對(duì)于第二種Activity的啟動(dòng)方式,需要思考的兩個(gè)問題?
1)被調(diào)用的Activity怎么返回?cái)?shù)據(jù)?
首先,調(diào)用者Activity啟動(dòng)被調(diào)用的Activity的方式是startActivityForResult(intent,?int類型的請(qǐng)求碼);
其次,在被調(diào)用的Activity里面,創(chuàng)建Intent對(duì)象,將要返回的數(shù)據(jù)封裝進(jìn)Intent對(duì)
象,調(diào)用Activity類的Intent data)方法返回Intent對(duì)象。
如://將數(shù)據(jù)返回
Intent?intent?=?new?Intent();
intent.putExtra("phone",?phone);
setResult(10,?intent);
2)調(diào)用者Activity怎么獲取被調(diào)用的Activity所返回的數(shù)據(jù)?
通過復(fù)寫Activity的onActivityResult方法可以得到其它的一個(gè)或多個(gè)Activity返
回的數(shù)據(jù).
如:
上面的截圖是Android官方文檔的截圖,利用了雙重判斷確定是哪個(gè)對(duì)象返回的數(shù)據(jù),這樣顯
得更加嚴(yán)密. 返回的數(shù)據(jù)就存儲(chǔ)在方法中的參數(shù)data中,調(diào)用Intent對(duì)象的方法取出即可.
5.應(yīng)用1_短信大全
需求:將一些好的短信顯示到ListView上,點(diǎn)擊某一條短信,就跳到手機(jī)的短信發(fā)送頁面,并把
ListView選中條目的內(nèi)容添加到短信發(fā)送頁面的短信內(nèi)容中.
分析:這個(gè)需求首先涉及到ListView的使用,然后跳到手機(jī)短信發(fā)送頁面,涉及到隱式意圖啟動(dòng)系
統(tǒng)應(yīng)用,并且要將本應(yīng)用的數(shù)據(jù)傳遞到系統(tǒng)應(yīng)用里,涉及到頁面跳轉(zhuǎn)和數(shù)據(jù)傳遞.
效果圖:
假如我點(diǎn)擊了ListView短信列表的第2條短信,然后就跳轉(zhuǎn)到短信發(fā)送頁面
核心代碼:
public?void?onItemClick(AdapterView>?parent,?View?view,
int?position,?long?id)?{
//得到點(diǎn)擊的item對(duì)應(yīng)的數(shù)據(jù)
String?msg?=?objects[position];
//利用隱式意圖,跳轉(zhuǎn)到短信發(fā)送頁面。
//怎么寫過濾條件,查源碼。。。。
/*?
*/
Intent?intent?=?new?Intent();
//設(shè)置意圖對(duì)象的過濾條件
intent.setAction("android.intent.action.SEND");
intent.addCategory("android.intent.category.DEFAULT");
intent.setType("text/plain");
//傳遞數(shù)據(jù)給×××
intent.putExtra("sms_body",?msg);
/*
*?不小心用了setDataAndType(Uri.parse(msg),"text/plain");結(jié)果×××的聯(lián)系人處是data,發(fā)送內(nèi)容什么也沒有。
*?*/
startActivity(intent);
}
那么問題來了,上面意圖對(duì)象的過濾條件及傳遞數(shù)據(jù)格式我是怎么知道的呢?
1)先打開Logcat,然后打開手機(jī)短信發(fā)送頁面,會(huì)看到Locat上打印這樣一行信息(如果沒有
打印任何信息,先安裝一個(gè)自己的應(yīng)用,然后重新打開系統(tǒng)的短信發(fā)送頁面。):
?????2)然后去系統(tǒng)應(yīng)用源碼里找到短信發(fā)送應(yīng)用Sms,在清單文件里找到ComposeMessageActivity
的配置
短信發(fā)送頁面有很多的過濾器,都是用于發(fā)現(xiàn)不同格式數(shù)據(jù)的(用mimetype屬性來約束),
我們這里就只需要文本類型的數(shù)據(jù),就選擇mimetype為text/plain的進(jìn)行過濾了。
知道了意圖對(duì)象的過濾器,那么就可以為意圖對(duì)象設(shè)置過濾信息
3)但是,怎么給intent傳遞數(shù)據(jù)呢?那么就得看短信發(fā)送頁面的Activity是如何獲取調(diào)用
它的Intent的數(shù)據(jù)的?
通過在ComposeMessageActivity.java里搜索getStringExtra可以得到×××是根據(jù)
sms_body鍵名來獲取短信內(nèi)容的。
所以Intent在putExtra時(shí)采用的鍵名是“sms_body”。
6.應(yīng)用2_×××
需求:做一個(gè)如下圖所示的×××,布局采用混合線性布局。
功能1:在主UI界面中點(diǎn)擊“添加聯(lián)系人”那個(gè)+號(hào)按鈕,就彈出一個(gè)窗體列出聯(lián)系人(是
模擬數(shù)據(jù),學(xué)到內(nèi)容提供者即可獲取手機(jī)真正的聯(lián)系人),選擇一個(gè)聯(lián)系人后關(guān)閉
選擇聯(lián)系人頁面,并將選擇的聯(lián)系人電話返回顯示到主UI界面的文本框中。
功能2:在主UI界面中點(diǎn)擊“插入模板”按鈕,就彈出一個(gè)窗體列出一些短信,選擇一條
短信后關(guān)閉短信大全頁面,將將選擇的短信返回顯示到主UI界面的短信內(nèi)容文本框
分析:上面的需求,也涉及到頁面跳轉(zhuǎn)和數(shù)據(jù)傳遞,不同的是被調(diào)用的頁面在關(guān)閉的同時(shí)還要
向調(diào)用者(主UI界面)返回選擇的數(shù)據(jù)。那么,這個(gè)應(yīng)用要求的技術(shù)有以下幾點(diǎn):
1)主UI界面在啟動(dòng)其它Activity的時(shí)候,應(yīng)當(dāng)使用startActivityForResult的方式,并
復(fù)寫Activity的onActivityResult方法。
2)兩個(gè)返回?cái)?shù)據(jù)的ListView都要設(shè)置item點(diǎn)擊事件,在事件中返回?cái)?shù)據(jù)并關(guān)閉頁面。
3)發(fā)送短信的功能
核心代碼:
1)短信模板頁面
因?yàn)長istView只需顯示單列數(shù)據(jù),適配器就直接使用ArrayAdapter了。//模擬數(shù)據(jù)
final?String[]?objects?=?{短信內(nèi)容,為節(jié)省空間就不寫了。};
//得到?listview
ListView?lv_templates?=?(ListView)?findViewById(R.id.lv_templates);
//綁定lv的適配器,用ArrayAdapter。
lv_templates.setAdapter(new?ArrayAdapter(this,?R.layout.item_activity_sms_template,?R.id.item,?objects));
//注冊(cè)lv的item點(diǎn)擊事件
//要實(shí)現(xiàn)的邏輯:獲取數(shù)據(jù),返回?cái)?shù)據(jù),關(guān)閉當(dāng)前activity
lv_templates.setOnItemClickListener(new?OnItemClickListener()?{
@Override
public?void?onItemClick(AdapterView>?parent,?View?view,
int?position,?long?id)?{
//得到數(shù)據(jù)
String?content?=?objects[position];
//通過intent返回?cái)?shù)據(jù)
Intent?intent?=?new?Intent();
intent.putExtra("content",?content);
setResult(20,?intent);
//關(guān)閉當(dāng)前activity
finish();
}
});
2)選擇聯(lián)系人頁面//模擬數(shù)據(jù)
final?List>?lists?=?new?ArrayList>?();
for(int?i?=?0?;?i?
{
Map?map?=?new?HashMap();
map.put("name","聯(lián)系人"?+?i);
map.put("phone",new?Random().nextInt(252523)+"");
lists.add(map);
}
//得到?listview
ListView?lv_contacts?=?(ListView)?findViewById(R.id.lv_contacts);
//綁定lv的適配器,用SimpleAdapter,可以添加多個(gè)textview。
lv_contacts.setAdapter(new?SimpleAdapter(this,?lists,?R.layout.item_activity_contacts,new?String[]{"name","phone"},?new?int[]?{R.id.tv_name,R.id.tv_phone}));
//注冊(cè)lv的item點(diǎn)擊事件
//要實(shí)現(xiàn)的邏輯:獲取數(shù)據(jù),返回?cái)?shù)據(jù),關(guān)閉當(dāng)前activity
lv_contacts.setOnItemClickListener(new?OnItemClickListener()?{
@Override
public?void?onItemClick(AdapterView>?parent,?View?view,
int?position,?long?id)?{
//拿到相應(yīng)item的數(shù)據(jù),通過lists集合,只要電話號(hào)碼。
String?phone?=?lists.get(position).get("phone");
//將數(shù)據(jù)返回
Intent?intent?=?new?Intent();
intent.putExtra("phone",?phone);
setResult(10,?intent);
//關(guān)閉當(dāng)前activity
finish();
}
});
3)主UI頁面
★獲取模板頁面和聯(lián)系頁面數(shù)據(jù)并顯示protected?void?onActivityResult(int?requestCode,?int?resultCode,?Intent?data)?{
//通過resultCode來區(qū)別不同的activity返回的intent對(duì)象
if(resultCode?==?10)
{
et_name.setText(data.getStringExtra("phone"));
}
else?if?(resultCode?==?20){
et_content.setText(data.getStringExtra("content"));
}
}
★發(fā)送短信
通過SmsManager這個(gè)類,注意它的獲取方式是通過SmsManager.getDefault方法
與打電話不同,打電話是通過隱式意圖來調(diào)用的。
記得要在清單文件里加上權(quán)限:
public?void?send()
{
//TODO?短信發(fā)送
//得到聯(lián)系人和發(fā)送內(nèi)容
String?name?=?et_name.getText().toString().trim();
String?content?=?et_content.getText().toString().trim();
//利用一個(gè)類SmsManager來發(fā)送短信注意不要用過時(shí)的SmsManager
SmsManager?smsManager?=?SmsManager.getDefault();
//短信內(nèi)容過長,就得切割之后再一條條發(fā)送。
ArrayList?divideMessage?=?smsManager.divideMessage(content);
for(String?msg?:?divideMessage)
{
smsManager.sendTextMessage(name,?null,?msg,?null,?null);
}
}
7.Android中的任務(wù)棧棧 :先進(jìn)后出
隊(duì)列 ?先進(jìn)先出
任務(wù)棧 ?:是用來維護(hù)Activity的
,| Activity是用來維護(hù)用戶的操作體驗(yàn)的
打開一Activity 叫
進(jìn)棧
關(guān)閉一個(gè)Activity 出棧
我們用戶操作的Activity
永遠(yuǎn)是棧頂?shù)腁ctivity
說我們應(yīng)用程序退出了
實(shí)際上是任務(wù)棧清空了
一般情況下
一個(gè)應(yīng)用程序?qū)?yīng)一個(gè)任務(wù)棧
8.Android中4種啟動(dòng)模式
1.android:launchMode="standard"(默認(rèn))
2.singletop 單一頂部模式 在activity的配置文件中設(shè)置android:launchMode="singleTop"
如果任務(wù)棧的棧頂存在這個(gè)要開啟的activity,不會(huì)重新的創(chuàng)建activity,而是復(fù)用已經(jīng)存在
的activity。保證棧頂Activity如果存在,不會(huì)重復(fù)創(chuàng)建。
應(yīng)用場景:瀏覽器的書簽
3. singetask 單一任務(wù)棧,在當(dāng)前任務(wù)棧里面只能有一個(gè)實(shí)例存在
當(dāng)開啟activity的時(shí)候,就去檢查在任務(wù)棧里面是否有實(shí)例已經(jīng)存在,如果有實(shí)例存在就復(fù)用
這個(gè)已經(jīng)存在的activity,并且把這個(gè)activity上面的所有的別的activity都清空,復(fù)用這個(gè)已經(jīng)
存在的activity。保證整個(gè)任務(wù)棧里面一個(gè)Activity只有一個(gè)實(shí)例存在
應(yīng)用場景:瀏覽器的activity
如果一個(gè)activity的創(chuàng)建需要占用大量的系統(tǒng)資源(cpu,內(nèi)存)一般配置這個(gè)activity為
singletask的啟動(dòng)模式。webkit內(nèi)核
c代碼
4.singleInstance啟動(dòng)模式非常特殊, activity會(huì)運(yùn)行在自己的任務(wù)棧里面,并且這個(gè)任務(wù)棧里面
只有一個(gè)實(shí)例存在
如果你要保證一個(gè)activity在整個(gè)手機(jī)操作系統(tǒng)里面只有一個(gè)實(shí)例存在,使用singleInstance
應(yīng)用場景: 來電頁面???有道詞典
和Activity相關(guān)的其它技術(shù)點(diǎn):
1.當(dāng) Activity 以全屏模式運(yùn)行時(shí),如何允許 Android 系統(tǒng)狀態(tài)欄在頂層出現(xiàn),而不迫使 Activity 重新布局讓
出空間?
8.Android中4種啟動(dòng)模式
1.設(shè)置activity不可點(diǎn)擊this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);
9.LoadManager
9.Android屏幕旋轉(zhuǎn)導(dǎo)致Activity重建的幾種解決辦法
總結(jié)
以上是生活随笔為你收集整理的android数据回传多个页面_Android Day06四大组件之Activity多页面跳转和数据传递的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot banner在线生
- 下一篇: android 输入模糊匹配_Andro