1. 程式人生 > >Android 基礎回顧2

Android 基礎回顧2

一、Android四大元件

#非空判斷if(str!=null||str.length!=0)#<uses-permission android:name="android.permission.CAMERA" /> 加相機許可權Activity1、Activity是什麼?a:是android的四大元件之一b:提供UI互動的場所c:可以充滿螢幕,也可以懸浮在其他activity之上d:一個應用通常由多個activity組成e:一個activity可以開啟任一個activity2、如何建立一個Activity建立其子類(或現有子類),在其重寫由於系統呼叫的回撥方法,最重要的是a) onCreate()
必須實現此方法,系統會在建立您的 Activity 時呼叫此方法。應該在實現內初始化 Activity 的必需元件。 最重要的是,必須在此方法內呼叫setContentView(),以定義 Activity 使用者介面的佈局。b)onPause()系統將此方法作為使用者離開 Activity 的第一個訊號(但並不總是意味著 Activity 會被銷燬)進行呼叫。 通常應該在此方法內確認在當前使用者會話結束後仍然有效的任何更改(因為使用者可能不會返回)。步驟:1)建立一個class,繼承Activity方法(或其子類)2)重寫onCtreate()方法3)在onCreate方法中實現setContentView();方法,設定佈局(也可以是一個View
4)在清單檔案中宣告:<manifest ... ><application ... ><activityandroid:name="包名.類名">      ... </activity>      ...</application ... >  ...</manifest>3、Activity的生命週期一個完整的生命週期:onCreate()->onStart()->onResume()->ActivityRunning->返回鍵->onPause->onStop()->onDestory
建立時的生命週期:onCreate()->onStart()->onResume()銷燬一個Activity時的生命週期:onPause->onStop()->onDestory一個應用正在執行,這時點選Home鍵,應用到後臺onPause->onStop()從後臺再次執行:onRestart()->onStart()->onResume()->ActivityRunning可見的生命週期:在onStart和onStop之間前端生命週期onResume和onPause之間onStart()和onResume()的區別onPause()和onStop()的區別a):是否可見,onResume和onPause可見b):什麼時候Activity是前端執行的,在onResume和onPause的之間onCreate(): 不可見,不可被終止首次建立 Activity 時呼叫。 您應該在此方法中執行所有正常的靜態設定— 建立檢視、將資料繫結到列表等等。系統向此方法傳遞一個 Bundle 物件,其中包含 Activity 的上一狀態,不過前提是捕獲了該狀態。始終後接 onStart()onStart(): 不可見,不可被終止在 Activity 即將對使用者可見之前呼叫。如果 Activity 轉入前臺,則後接 onResume(),如果 Activity 轉入隱藏狀態,則後接 onStop()後接控制元件onResume(),是一氣呵成的,直接呼叫,繫結控制元件的操作需要在此週期onResume() 可見,不可銷燬當前Activity即將進入前端,此時Activity正在處於Activity棧的頂端,獲取使用者焦點,此時優先順序最高。此時可以進行動畫等需要可見的操作後接onPause()onPause(),可見,可以被終止當系統即將開始繼續另一個 Activity 時呼叫。 此方法通常用於儲存對永續性資料的未儲存更改,停止動畫,關閉網路連線,關閉資料庫以及其他可能消耗 CPU 的內容,諸如此類。 不能做耗時操作,必須遵循不能大量耗時,如果有大量的耗時操作,可以選擇在onStop的生命週期做。後接onStop()onStop(),不可見,可以被系統終止此時的優先順序很弱,系統如果發生記憶體不足,就會殺死此時的activity,如果沒有被系統殺死,那麼,從新啟動時,會呼叫onRestart,如果被系統殺死,那麼下次啟動,重新啟動onStop和onStart是對立的,如果在onStart進行了繫結,此時應該解除繫結。onRestart(),不可見,不可被殺死當Activity進入onStop時再次呼叫時的生命週期onDestory(),不可見,可被殺死在 Activity 被銷燬前呼叫。這是 Activity 將收到的最後呼叫。4、兩個Activity跳轉的週期A開啟A onCreate()->A onStart()->A onResume->A RunningA跳轉到BA onPause()->B onCreate()->B onStart()->B onResume()->B RunningB返回AB onPause()->A onRestart()->A onStart()->A onResume()->A RunningB onStop()->B onDestory()新的頁面開啟,必須在舊的頁面onPause之後,所以不能太多的耗時操作5、現場保護Activity在不做任何保護時,切換橫豎屏,會先銷燬,再建立,因為需要可能需要同名但放在不同的資料夾中的佈局,需要重新載入(layout-land)橫豎屏切換重新執行生命週期導致一些控制元件輸入的內容不能儲存,所以需要現場保護a:在安卓中,EditText如果添加了id,會形成自我保護,但EditText僅限於文字內容,CheckBox只會保護選中狀態b:現場保護方法1:保護現場:把資料放入Bundle /** * Activity自我保護的方法,切換橫豎屏,或者記憶體不足,銷燬Activity時 * 呼叫此方法,儲存資料,保留到引數Bundle中 */ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState);//Bundle類似於Map,儲存的範圍大於Map,可以存序列化物件啊 ColorStateList textColors = et.getTextColors(); int color = textColors.getDefaultColor(); outState.putInt("color", color); }恢復現場:從Bundle中取值 /** * 重新恢復時呼叫(發生異常時) */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); int color = savedInstanceState.getInt("color",Color.BLACK); //引數1,key;引數2,當key取不到值時的預設值 et.setTextColor(color); }方法2:切換橫豎屏不重新走生命週期在清單檔案中,activity標籤內android:configChanges="" 此標籤指定的情況下不走生命週期orientation 方向screenSize 螢幕尺寸,API 14以上,認為橫豎屏切換螢幕尺寸改變keyboardHidden 軟鍵盤彈出導致佈局改變方法3:固定螢幕橫豎在清單檔案中,activity標籤內android:screenOrientation landscape 橫屏 風景畫portrait 豎屏 肖像畫6、Intent 意圖安卓四大元件的紐帶,開啟Activity,傳送廣播,開啟服務分類:1、顯式意圖 知名達意2、隱式意圖7、顯式方式Intent方法1:a:封裝意圖 當前activity的this,目標activity的classIntent intent = new Intent(MainActivity.this, SecondAvtivity.class);b:封裝訊息 鍵值對intent.putExtra("count", "358742662");intent.putExtra("password", 123456);不能直接放置物件,必須是序列化的序列化時增加id項/** * 防止在讀取物件時因為類的改變而照成的無法讀取的現象 */ private static final long serialVersionUID = 1L;c:開啟意圖 startActivity(intent);d:獲取IntentIntent intent = getIntent();e:取值String username = intent.getStringExtra("count");int password = intent.getIntExtra("pass", 000000); key 預設值StudentBean bean = (StudentBean) intent.getSerializableExtra("object");獲取物件時需要強轉方法2:封裝Bundle進行傳值,連續傳值時比較方便 更多使用bundle類似Map,鍵值對放置資料Intent intent = new Intent(MainActivity.this,SencondActivity.class); Bundle bundle = new Bundle(); bundle.putString("userName", "Zeral"); bundle.putInt("password", 123456); intent.putExtras(bundle); startActivity(intent);獲取資料Intent intent = getIntent();Bundle bundle = intent.getExtras(); if(bundle!=null) { String uname = bundle.getString("username"); int pwd = bundle.getInt("password"); }方法1和方法2相同點:傳值型別相同不同點:putExtra是直接放到Intent中 putExtras先封裝到Bundle中,再把Bundle放到intent上方法3:藉助Application方式傳值每個程式都會建立一個Application的物件,物件是唯一的,單例模式建立一個類繼承Application,在清單檔案下注冊,重寫onCreate()方法onCreate() ,在程式建立時呼叫,優先於Activity多個Activity需要初始化的資料,可以在onCreate()方法進行全域性初始化工作,可以宣告常量其他activity中可以直接getApplication直接獲取MyApp myApp = (MyApp) getApplication(); 在一個Activity中給MyApp中的變數賦值,在另一個Activity中獲取到8、跳轉頁面,並獲取返回值 多用於請求系統應用、類時使用請求頁面:startActivityForResult(intent,1001); 引數1:意圖 引數2:請求碼服務端:Intent intent = new Intent();intent.putExtra("result", "heheheh");setResult(RESULT_OK, );引數1:結果碼 引數2:返回結果finish(); 結束當前Activity請求端,重寫:protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data);if(requestCode==1001&&resultCode==RESULT_OK&&data!=null) { //邏輯 } }

二、Activity的啟動模式及Intent跳轉以及Android中的視訊播放

#URL 統一資源定位符 地址#URI 統一資源識別符號 idURI分為 scheme 協議 host 服務端 prot 埠號 path 之後的路徑1、任務和回退棧任務:任務是執行特定作業時與使用者互動的一系列Activity遵循先進後出原則堆疊中的Activity永遠不會重新排列開啟Activity進入任務,返回按鈕則彈出任務回退棧:任務會依次進入到回退棧中,也遵循先進後出原則2、Activity啟動模式 4s開發中作用:Activity複用,減少記憶體消耗,提高效能,避免使用者多次點選返回按鈕,無法退出##Activity複用:1,singleTop模式,當前Activity處於棧頂,再次呼叫,會複用 2,singleTask模式下,Activity已經存在,再次呼叫會複用 3,singleInstance模式下,Activity已經存在,再次呼叫會複用##此方法在本Activity複用時呼叫:可以通過此方法進行Activity重新整理工作 protected void onNewIntent(Intent intent) { super.onNewIntent(intent); }設定啟動模式:1)、在清單檔案中,給指定的Activity設定啟動模式,android:launchModea:standard預設模式,每次啟動的Activity都會建立一個例項,進入任務,遵循後進先出原則b:singleTop頂部單一模式,如果設定此模式的Activity在棧頂,重複呼叫本Activity,不會建立新 的Activity,如果不處於棧頂,那麼和standrad模式一樣c:singleTask任務棧中單一模式,如果設定此模式的Activity在任務存在,呼叫時,將該Activity複用,並且遵循任務棧不可重複排列原則,將該Activity之上的Activity全部彈出d:singleInstance設定此模式的Activity會單獨存在一個任務棧中,如果再次呼叫,會複用原來建立的任務棧,並且任務棧也遵循後進先出的原則##返回時,先返回本任務棧的Activity2)、在Java中,Intent跳轉時,僅限於本次頁面跳轉與方法1的區別:在清單檔案中可以設定4種,而java程式碼中只能3種清單檔案一旦設定,啟動模式固定了,而java中可以根據不同的跳轉設不同的啟動模式兩者衝突,以Java中的啟動模式為準intent.setFalgs():FLAG_ACTIVITY_SINGLE_TOP =singleTopFLAG_ACTIVITY_SINGLE_TOP|FLAG_ACTIVITY_CLEAR_TOP =singleTask不新增 =standard3、Intent頁面跳轉顯式意圖:需要用到Intent的一個屬性 ComponentName(元件名)ComponentName是Intent的七大屬性之一,用來元件間跳轉,形成顯式意圖,可以進行跨程式挑轉頁面底層都是封裝的ComponentName1:Intent intent = new Intent((當前元件.this,目標元件.class);2:Intent intent = new Intent();intent.setClass(當前元件.this, 目標元件.class);3:Intent intent = new Intent(); ComponentName componentName = new ComponentName(當前元件.this,目標元件.class); intent.setComponent(componentName);4:跳轉到其他應用Intent intent = new Intent();/** * 引數1 目標程式包名 * 引數2 目標activity的全路徑(包名+類名) * 要跳轉的程式必須安裝在手機上了,不必須是開啟狀態 */ ComponentName componentName = new ComponentName("com.zjf.activity","com.zjf.activity.MainActivity"); intent.setComponent(componentName); startActivity(intent);隱式意圖:利用動作表示你要做的事給定目標的引數,根據引數去匹配具體的元件如果清單檔案中的activity沒有<intent-filter>的存在,那麼要開啟此activity,只能顯式 意圖。如果有,可以使用隱式意圖。隱式意圖匹配的過程,就是Intent與清單檔案<intent-filter>進行匹配的過程。發出的Intent匹配的是所有有<intent-filter>的元件。隱式意圖匹配成功:是intent中包含的Action和Category還有Data,type和intent-filter中包含的Action和Category還有Data,type完全相符,即匹配成功。intent-filter中包含的Action和Category還有Data type在目標activity的清單檔案中設定 action,category(附加條件 但必須加預設Action:一個Intent setAction,只能攜帶一個Action(java中set多數是=賦值,多次設定,只能保留最後一次的內容)一個intent-filter可以有多個action,只有intent的action在intent-filter中包含,就能匹配成功Category:addCategory(在java中,add是新增,一般內部都是一個集合,呼叫此方法,會把資料新增到集合中),所以可以攜帶多個Category。Intent中可以包含多個Category,如果Intent中的category都被清單檔案的intent-filter包含,就算匹配成功。為什麼加預設的?Intent中會自動攜帶一個category,如果想要intent-filter匹配成功,必須要在intent-filter中攜帶預設的categoryData:scheme:協議Uri.parse("http://www.123321.com") 把字串改成UriIntent中setData(URI); Intent中攜帶的資料中的協議與intent-filter中的data中的scheme相同即可mimeType:!!!data和type同時使用時,intent需要使用setDataAndType(); 單獨使用,會使另一個為空(看原始碼)位於在Data中Intent設定setType()一個intent中只能有一個type,如果多次設定,以最後一次為準Intent中的型別只要在intent-filter中存在就可以匹配成功#在清單檔案中有多個意圖過濾器,匹配原則為完全全部匹配一個即可4、Intent的七大屬性:ComponentName: 元件間跳轉,顯示意圖底層封裝Extra: 攜帶的資料intent.putExtra(key,vaule);Flags: java程式碼設定啟動模式(三種)隱式意圖的一部分:在於intent-filter匹配的過程中,這四種都是需要考慮的因素Action Category Data Type5、利用隱式意圖開啟系統相關的Activitya:打電話intent.setAction(Intent.ACTION_CALL);intent.setData(Uri.parse("tel:13525425260"));許可權