Android应用开发:页面跳转和数据传递
生活随笔
收集整理的這篇文章主要介紹了
Android应用开发:页面跳转和数据传递
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. Activity的跳轉
1.1 創建第二個Activity
- 需要在清單文件中為其配置一個activity標簽
- 標簽中如果帶有這個子節點,則會在系統中多創建一個快捷圖標
- 一個應用程序可以在桌面創建多個快捷圖標。
- activity的名稱、圖標可以和應用程序的名稱、圖標不相同
Activity的跳轉需要創建Intent對象,通過設置intent對象的參數指定要跳轉的Activity;通過設置Activity的包名和類名實現跳轉,稱為顯式意圖;通過指定動作實現跳轉,稱為隱式意圖
1.2 顯式意圖
- 跳轉至同一項目下的另一個Activity,直接指定該Activity的字節碼即可
- 跳轉至其他應用中的Activity,需要指定該應用的包名和該Activity的類名
1.3 隱式意圖
- 隱式意圖跳轉至指定Activity
- 要讓一個Activity可以被隱式啟動,需要在清單文件的activity節點中設置intent-filter子節點
- action 指定動作(可以自定義,可以使用系統自帶的)
- data 指定數據(操作什么內容)
- category 類別 (默認類別,機頂盒,車載電腦)
- 隱式意圖啟動Activity,需要為intent設置以上三個屬性,且值必須與該Activity在清單文件中對三個屬性的定義匹配
- intent-filter節點及其子節點都可以同時定義多個,隱式啟動時只需與任意一個匹配即可
1.4 獲取通過setData傳遞的數據
//獲取啟動此Activity的intent對象 Intent intent = getIntent(); Uri uri = intent.getData();1.5 顯式意圖和隱式意圖的應用場景
- 顯式意圖用于啟動同一應用中的Activity
- 隱式意圖用于啟動不同應用中的Activity
- 如果系統中存在多個Activity的intent-filter同時與你的intent匹配,那么系統會顯示一個對話框,列出所有匹配的Activity,由用戶選擇啟動哪一個
2. Activity跳轉時的數據傳遞
- Activity通過Intent啟動時,可以通過Intent對象攜帶數據到目標Activity
- 在目標Activity中取出數據
3. Activity生命周期
- void onCreate():Activity已經被創建完畢
- void onStart():Activity已經顯示在屏幕,但沒有得到焦點
- void onResume():Activity得到焦點,可以與用戶交互
- void onPause():Activity失去焦點,無法再與用戶交互,但依然可見
- void onStop():Activity不可見,進入后臺
- void onDestroy():Activity被銷毀
- void onRestart():Activity從不可見變成可見時會執行此方法
3.1 使用場景
- Activity創建時需要初始化資源,銷毀時需要釋放資源;或者播放器應用,在界面進入后臺時需要自動暫停
3.2 完整生命周期(entire lifetime)
onCreate–>onStart–>onResume–>onPause–>onStop–>onDestory
3.3 可視生命周期(visible lifetime)
onStart–>onResume–>onPause–>onStop
3.4 前臺生命周期(foreground lifetime)
onResume–>onPause
3.5 橫豎屏切換的生命周期
默認情況下 ,橫豎屏切換, 銷毀當前的activity,重新創建一個新的activity。在一些特殊的應用程序常見下,比如游戲,不希望橫豎屏切換activity被銷毀重新創建。模擬器切換橫豎屏快捷鍵ctrl+F11
需求:禁用掉橫豎屏切換的生命周期
1、橫豎屏寫死
android:screenOrientation="landscape" android:screenOrientation="portrait"2、讓系統的環境 不再去敏感橫豎屏的切換。
android:configChanges="orientation|screenSize|keyboardHidden"5. Activity的四種啟動模式
每個應用會有一個Activity任務棧,存放已啟動的Activity。Activity的啟動模式,修改任務棧的排列情況
- standard 標準啟動模式
- singleTop 單一頂部模式
- 如果任務棧的棧頂存在這個要開啟的activity,不會重新的創建activity,而是復用已經存在的activity。保證棧頂如果存在,不會重復創建。
- 應用場景:瀏覽器的書簽
- singeTask 單一任務棧,在當前任務棧里面只能有一個實例存在
- 當開啟activity的時候,就去檢查在任務棧里面是否有實例已經存在,如果有實例存在就復用這個已經存在的activity,并且把這個activity上面的所有的別的activity都清空,復用這個已經存在的activity。保證整個任務棧里面只有一個實例存在
- 應用場景:瀏覽器的activity
- 如果一個activity的創建需要占用大量的系統資源(cpu,內存)一般配置這個activity為singletask的啟動模式。webkit內核 c代碼
- singleInstance啟動模式非常特殊, activity會運行在自己的任務棧里面,并且這個任務棧里面只有一個實例存在
- 如果你要保證一個activity在整個手機操作系統里面只有一個實例存在,使用singleInstance
- 應用場景: 電話撥打界面
6. 掌握開啟activity獲取返回值
6.1 從A界面打開B界面, B界面關閉的時候,返回一個數據給A界面
步驟:
1、開啟activity并且獲取返回值
startActivityForResult(intent, 0);2、在新開啟的界面里面實現設置數據的邏輯
Intent data = new Intent(); data.putExtra("phone", phone); //設置一個結果數據,數據會返回給調用者 setResult(0, data); finish();//關閉掉當前的activity,才會返回數據3、在開啟者activity里面實現方法
onActivityResult(int requestCode, int resultCode, Intent data) //通過data獲取返回的數據4、根據請求碼和結果碼確定業務邏輯
7. Android四大組件
- Activity
- BroadCastReceiver
- Service
- ContentProvider
8. 創建第二個activity
- 新創建的activity,必須在清單文件中做配置,否則系統找不到,在顯示時會直接報錯
- 只要有以下代碼,那么就是入口activity,就會生成快捷圖標
- 如果Activity所在的包跟應用包名同名,那么可以省略不寫
1、 創建class類繼承Activity
2、 創建布局文件,作為Activity的顯示內容
3、 在清單文件中注冊Activity
9. Activity的跳轉
9.1 隱式跳轉
- 一個Activity如果需要隱式跳轉,那么在清單文件中必須添加以下子節點
- action節點的name是自己定義的,定義好之后,這個name的值就會成為這個activity動作,在隱式啟動Activity時,意圖中設置的action必須跟”com.itheima.sa”是完全匹配的
9.2 應用場景
- 顯示意圖:啟動同一個應用中的Activity
- 隱式意圖:啟動不同應用中的Activity
- 再啟動效率上,隱式遠遠低于顯式
- 如果系統中有多個Activity與意圖設置的Action匹配,那么在啟動Activity時,會彈出一個對話框,里面包含所有匹配的Activity
10. Activity生命周期
- oncreate:Activity對象創建完畢,但此時不可見
- onstart:Activity在屏幕可見,但是此時沒有焦點
- onResume:Activity在屏幕可見,并且獲得焦點
- onPause:Activity此時在屏幕依然可見,但是已經沒有焦點
- onStop:Activity已經不可見了,但此時Activity的對象還在內存中
- onDestroy:Activity對象被銷毀
內存不足
- 內存不足時,系統會優先殺死后臺Activity所在的進程,都殺光了,如果內存還是不足,那么就會殺死暫停狀態的Activity所在的進程,如果還是不夠,有可能殺死前臺進程
- 如果有多個后臺進程,在選擇殺死的目標時,采用最近最少使用算法(LRU)
Activity任務棧
- 應用運行過程中,內存中可能會打開多個Activity,那么所有打開的Activity都會被保存在Activity任務棧
- 棧:后進先出,最先進棧,就會最后出棧
Activity的啟動模式
- 標準模式:默認就是這個模式
- singleTop:如果目標Activity不在棧頂,那么就會啟動一個新的Activity,如果已經在棧頂了,那么就不會再啟動了
- singleTask:如果棧中沒有該Activity,那么啟動時就會創建一個該Activity,如果棧中已經有該Activity的實例存在了,那么在啟動時,就會殺死在棧中處于該Activity上方的所有Activity全部殺死,那么此時該Activity就成為了棧頂Activity。
- singleTask的作用:保證整個棧中只有一個該Activity的實例
- singleInstance:設為此模式的Activity會有一個自己獨立的任務棧,該Activity的實例只會創建一個,保存在獨立的任務棧中
- singleInstance的作用:保證整個系統的內存中只有一個該Activity的實例
11. 橫豎屏的切換
- Activity在橫豎屏切換時會銷毀重建,目的就是為了讀取新的布局文件
- 寫死方向,不允許切換
- 配置Activity時添加以下屬性,橫豎屏切換時就不會銷毀重建
12. Activity返回時傳遞數據
- 請求碼:用來區分數據來自于哪一個Activity
- 結果碼:用來區分,返回的數據時屬于什么類型
案例1:Activity的跳轉
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/*** 跳轉至打電話activity* 跳轉至其他應用的activity* 隱式跳轉:通過指定action和data* @param v*/public void click1(View v){Intent intent = new Intent();//隱式意圖intent.setAction(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:110"));//跳轉startActivity(intent);}/*** 跳轉至secondActivity* 在本應用中跳轉* 顯示跳轉:直接指定目標Activity的包名和類名* @param v*/public void click2(View v){Intent intent = new Intent();//cls:直接指定目標Activity的類名//顯示意圖intent.setClass(this, SecondActivity.class);startActivity(intent);}/*** 顯示跳轉至撥號器*/public void click3(View v){Intent intent = new Intent();//指定目標Activity的包名和類名intent.setClassName("com.android.dialer", "com.android.dialer.DialtactsActivity");startActivity(intent);}/*** 隱式跳轉至撥號器*/public void click4(View v){Intent intent = new Intent();//隱式設置撥號器的動作intent.setAction(Intent.ACTION_DIAL);startActivity(intent);}/*** 隱式跳轉至secondActivity* @param v*/public void click5(View v){Intent intent = new Intent();intent.setAction("com.itheima.sa2"); // intent.setData(Uri.parse("heima2:qwe")); // intent.setType("text/username"); // intent.setData(Uri.parse("heima2:qwe123"));intent.setDataAndType(Uri.parse("heima2:qwe123"), "text/username");//系統會自動添加默認的categoryintent.addCategory(Intent.CATEGORY_DEFAULT);startActivity(intent);}/*** 顯式跳轉至瀏覽器*/public void click6(View v){Intent intent = new Intent();intent.setClassName("com.android.browser", "com.android.browser.BrowserActivity");startActivity(intent);}/*** 隱式跳轉至瀏覽器* @param v*/public void click7(View v){Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);intent.setData(Uri.parse("http://www.baidu.com"));startActivity(intent);} }案例2:Activity在跳轉時攜帶數據
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void click(View v){Intent intent = new Intent(this, SecondActivity.class);//把數據封裝至intent對象中 // intent.putExtra("malename", "李志"); // intent.putExtra("femalename", "芙蓉姐姐");//把數據封裝至bundle對象中Bundle bundle = new Bundle();bundle.putString("malename", "李志");bundle.putString("femalename", "芙蓉姐姐");//把bundle對象封裝至intent對象中intent.putExtras(bundle);startActivity(intent);}} public class SecondActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_second);Intent intent = getIntent();//從intent對象中把封裝好的數據取出來 // String maleName = intent.getStringExtra("malename"); // String feMaleName = intent.getStringExtra("femalename");Bundle bundle = intent.getExtras();String maleName = bundle.getString("malename");String feMaleName = bundle.getString("femalename");Random rd = new Random();int yinyuan = rd.nextInt(100);TextView tv = (TextView) findViewById(R.id.tv);tv.setText(maleName + "和" + feMaleName + "的姻緣值為" + yinyuan);} }案例3:Activity獲取返回值
public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void click(View c){//跳轉至選擇聯系人ActivityIntent intent = new Intent(this, ContactActivity.class); // startActivity(intent);//用這個api啟動的Activity,在銷毀時,系統會回調onActivityResultstartActivityForResult(intent, 10);}public void click2(View v){//跳轉至選擇快捷回復的ActivityIntent intent = new Intent(this, CallbackActivity.class);startActivityForResult(intent, 20);}//如果有Activity在銷毀時返回了數據,那么就會調用此方法來接收數據//requestCode:用來區分數據來自于哪一個Activity//resultCode:用來區分返回的數據是什么類型的@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubsuper.onActivityResult(requestCode, resultCode, data);String name = data.getStringExtra("name");if(requestCode == 10){EditText et = (EditText)findViewById(R.id.et);et.setText(name);}else if(requestCode == 20){EditText et_content = (EditText)findViewById(R.id.et_content);et_content.setText(name);}} } public class ContactActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_contact);ListView lv = (ListView) findViewById(R.id.lv);final String[] objects = new String[]{"小志","逼哥","世界級XXX","國服第一"};lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, R.id.tv, objects));//給listview設置條目的點擊偵聽lv.setOnItemClickListener(new OnItemClickListener() {//當某個條目被點擊時,此方法調用@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {//Activity返回時傳遞數據,也是通過意圖對象Intent data = new Intent();//把要傳遞的數據封裝至意圖對象中data.putExtra("name", objects[position]);//當前Activity銷毀時,data這個意圖就會傳遞給啟動當前Activity的那個ActivitysetResult(1, data);//銷毀當前Activityfinish();}});}@Overridepublic void onBackPressed() {// TODO Auto-generated method stubsuper.onBackPressed();} } public class CallbackActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_contact);ListView lv = (ListView) findViewById(R.id.lv);final String[] objects = new String[]{"免談,沒戲,滾犢子","媳婦我錯了,求原諒","老子才是一家之主"};lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, R.id.tv, objects));lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {Intent data = new Intent();data.putExtra("name", objects[position]);setResult(2, data);finish();}});} }總結
以上是生活随笔為你收集整理的Android应用开发:页面跳转和数据传递的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android四大组件之BroadCas
- 下一篇: Android多媒体编程