標籤:
1. Activity中的lable是指activity的名字,如果此activity還指定了:以下intentfilter,那麼這個介面就會在案頭建立捷徑,捷徑名字就是這個activity的lable<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>Category:指定意圖的類別, Launcher是在案頭建立捷徑。Intent-filter子節點:添加意圖過濾,可以通過隱式意圖啟動。可以在案頭產生捷徑,應用程式的入口。注意: Intent傳遞的資料過多可能會造成跳轉速度極慢甚至黑屏一會,不要用Intent傳遞過多的資料,會影響到應用程式的使用。##1. Activity的建立和銷毀(*)1. 資訊清單檔內容:電話 瀏覽器 資訊清單檔內容 許可權 <uses-permission android:name="android.permission.CALL_PHONE"/> <uses-permission android:name="android.permission.INTERNET"/><intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /></intent-filter><activity android:name="com.guyulei.activity2.MyBrowserActivity" android:label="周紅偉瀏覽器" android:icon="@drawable/xiaowei">category:類型,部門,種類,類別,類目; [邏,哲]範疇; 體重等級scheme:策劃,圖謀; 首碼 filter :濾波器; 濾光器; 濾色鏡; [化] 過濾器; <intent-filter > <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.APP_BROWSER"/> <data android:scheme="http"/> <data android:scheme="https"/> <data android:scheme="about"/> <data android:scheme="javascript"/> </intent-filter> </activity>小結: 每一個類對應自己的activity 綁定自己的xml檔案 activity在清單中註冊隱式跳轉(隱式意圖跳轉)(效率低) 多用於不同App之間Activity的跳轉,通過匹配目標Activity的intent-filter來實現的跳轉意圖過濾器匹配規則 1. 如果一個Activity有多個intent-filter,那麼我們只需要匹配其中的任意一個即可 2. 如果intent-filter中有action、category、data,必須全部匹配 3. 如果category是<category android:name="android.intent.category.DEFAULT" />情形下,可以不進行匹配。 4. 如果有多個category,那麼取其任意一個匹配即可 5. 如果data有多個,那麼取其任意一個匹配即可 6. 如果data有兩個,並且屬性還不一樣,那麼這個data的兩個屬性必須全部匹配MainActivity:隱式跳轉:打電話Intent.ACTION_CALLpublic void callPhone(View view){ //2 Intent intent = new Intent(); //3 intent.setAction(Intent.ACTION_CALL); //4 intent.addCategory(Intent.CATEGORY_DEFAULT);//預設可以不寫 //5 intent.setData(Uri.parse("tel:15958121433")); //1 startActivity(intent); }隱式跳轉:瀏覽器Intent.ACTION_VIEWpublic void callBrowser(View view){ //2 Intent intent = new Intent(); //3 intent.setAction(Intent.ACTION_VIEW); //4 intent.addCategory(Intent.CATEGORY_DEFAULT); //5 intent.setData(Uri.parse("http://www.baidu.com")); //1 startActivity(intent ); }不同工程之間隱式跳轉 前提需要知道資訊清單檔中的activity的資訊intent.setDataAndType 有data和type時注意不能共存type 的格式 MIME 訊息能包含文本、映像、音頻、視頻以及其他應用程式專用的資料。類型/子類型資訊清單檔:附:第二個工程的清單 data android:mimeType <activity android:name="com.guyulei.activity02.MyActivity"> <intent-filter > <action android:name="com.guyulei.zhonghongwei.TEST"/>//自己隨便設定 跳轉時配置一樣即可 <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="guyulei2zhouhongwei"/>//傳輸時的資料格式 首碼+: <data android:mimeType="gu/zhou"/> //資料 的類型 </intent-filter> </activity> /* * 不同工程activity之間進行跳轉 */ public void skip2guyulei(View view) { Intent intent = new Intent(); //setAction 對應資訊清單檔中activity的action 一致即可 intent.setAction("com.guyulei.zhonghongwei.TEST"); intent.addCategory("android.intent.category.DEFAULT"); /* * setData setType 不共存 * 使用setDataAndType 解決 * intent.setData(Uri.parse("guyulei2zhouhongwei:周小偉")); intent.setType("gu/zhou"); */ intent.setDataAndType(Uri.parse("guyulei2zhouhongwei:周小偉"), "gu/zhou"); startActivity(intent ); }MyBrowserActivity:拿到intent的資料,intent啟動此activity,此activity得到intent的資料intent的資料從哪來?在清單裡面設定資料的格式 在啟動intent的時候 加上資料 //intent.setData(Uri.parse("http://www.baidu.com"));getIntent()intent.getDataString();protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); //擷取誰啟動了這個activity的intent,資料在intent內 //intent.setData(Uri.parse("http://www.baidu.com")); Intent intent = getIntent(); String dataString = intent.getDataString(); Log.d(TAG, dataString); Toast.makeText(this, "您瀏覽的網頁是:"+dataString, Toast.LENGTH_SHORT).show(); }第二個工程中MyActivity第一個工程中的intent 來到第二個工程 帶來第二個工程格式 的 資料intent.setData(Uri.parse("guyulei2zhouhongwei:周小偉"));intent.setDataAndType(Uri.parse("guyulei2zhouhongwei:周小偉"), "gu/zhou");protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //擷取周小偉activity 中在intent內封裝的資料 //data 和type 分開拿 Intent intent = getIntent(); Uri data = intent.getData(); String type = intent.getType(); Log.d(TAG, "data="+data+"....."+"type="+type); Toast.makeText(this, "data:"+data+"type:"+type, Toast.LENGTH_SHORT).show(); }2. 顯式跳轉 常用於工程內部顯示跳轉(顯跳轉)(效率高)直接通過目標Activity的位元組碼進行的跳轉,多用於本APP內不同Activity之間。如果Activity只想被顯示跳轉,那麼沒有必要配置intent-filter。跳轉代碼 startActivity(new Intent(this, SecondActivity.class));資訊清單檔 註冊activity<activity android:name="com.guyulei.activity03.MySecond"></activity>MainActivity: intent.setClass(this, MySecond.class); intent.putExtra("name", "顧雨磊");android:text="我是第一個activity,跳到second"public void skip2second(View view) { Intent intent = new Intent(); intent.setClass(this, MySecond.class); //顯示跳轉 給second傳資料 intent.putExtra("name", "顧雨磊"); intent.putExtra("age",26); intent.putExtra("lover", "周小偉"); startActivity(intent); }MySecond:拿資料:拿資料先拿意圖intent getIntent()intent.getStringExtra("name");protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); /* * 顯示傳遞資料 拿資料先拿意圖intent */ Intent intent = getIntent(); String name = intent.getStringExtra("name"); int age = intent.getIntExtra("age", 0); String lover = intent.getStringExtra("lover"); Log.d(TAG, "name="+ name +"age= "+ age+"lover="+lover); Toast.makeText(this, "資訊是:"+"name="+ name +"age= "+ age+"lover="+lover, Toast.LENGTH_LONG).show(); }}MainActivity: startActivityForResult(intent , REQUESTCODE); 以需求得到結果的方式跳到secondREQUESTCODEandroid:text="跳到sec並擷取其傳回值" android:onClick="skip2secondforResult"//跳轉到second並擷取其銷毀時的傳回值 public void skip2secondforResult(View view) { Intent intent = new Intent(); intent.setClass(this, MySecond.class); startActivityForResult(intent , REQUESTCODE); }MySecond:android:text="返回資料給mainactivity並銷毀自己"RESULTCOE setResult(RESULTCOE, data );//誰啟動我,我就將資料返回給誰,並銷毀自己 public void back(View view) { Intent data = new Intent(); //封裝資料進行返回 data.putExtra("data", "這是secondactivity給您返回的資料"); setResult(RESULTCOE, data ); finish(); }MainActivity: onActivityResult//調用回呼函數擷取second返回的資料 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d(TAG, "requestCode="+requestCode+"resultCode="+resultCode+"data="+data); if(requestCode==REQUESTCODE){ if(resultCode==1){ //拿到資料 String result = data.getStringExtra("data"); Log.d(TAG, "result="+result); Toast.makeText(this, "second銷毀時返回的資料是:"+result, Toast.LENGTH_LONG).show(); } } }3. Intent可以攜帶的資料類型喲哪些? 1. 8種基礎資料型別 (Elementary Data Type)以及其對應的數組形式 2. String 以及其數組 3. 實現Serializable介面的對象 4. 實現Parcelable介面的對象4. Serializable和Parcelable的區別? 1. 前者是java裡面的,後者是Google自己開發的 2. 前者效率低一些,後者效率高一些,專門用於Android系統中的序列化 3. 用法完全不同,前者很簡單,後者很複雜。5. Activity跳轉時傳遞資料並擷取 1. intent.putXXX(); 2. getIntent().getXXXExtr("key",defaultValue);6. 當跳轉到的Activity銷毀時返回資料(必須會) 1. 在MainActivity中,啟動SecondActivity的時候,不能用startActivity()了, 使用startActivityForResult(intent, requestCode) 2. 在SecondActivity中,在finish前,調用setResult(responseCode,Intent data);方法設定即將要返回的資料,然後finish() 3. 在MainActivity中覆寫onActivityResult(),在該函數中擷取SecondActivity設定的資料##3. Activity的生命週期(*****)###3.1 Activity的三種狀態1. Resumed(running運行狀態):如果Activity位於螢幕的最前端,並且擷取到了使用者的焦點。 1. 完全可見,可互動。 2. 不會被系統殺死的,直到OOM,然後崩潰。2. Paused(暫停狀態):被另外一個Activity給覆蓋了,但是自己依然部分可見(透明的,或者比較下)。 1. 部分可見,不可互動。 2. 當系統內容及其不足的時候,會被系統殺死。3. Stopped(停止狀態):如果當前Activity被另外一個Activity給完全覆蓋了(後台Activity)。 1. 完全不可見,更不可互動 2. 當系統需要釋放記憶體的時候,就會殺死。###3.2生命週期方法1. onCreate2. onStart3. onResume4. onPause5. onStop6. onDestroy7. onRestart <activity android:screenOrientation="reverseLandscape" android:configChanges="orientation|keyboardHidden|screenSize" android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen" android:name="com.guyulei.activity04.MySecond"></activity>讓Activity成為對話方塊樣式 在資訊清單檔中給指定的Activity配置如下參數即可: android:theme="@android:style/Theme.Dialog"讓Activity成為透明的 在資訊清單檔中給指定的Activity配置如下參數即可: android:theme="@android:style/Theme.Translucent"##4 橫豎屏切換時的生命週期模擬器橫豎屏切換:(Fn)+Control+F11 預設情況下,會將當前Activity完全銷毀,然後重新建立。讓Activity橫豎屏切換時,不改變他的生命週期在資訊清單檔中,配置如下屬性 android:configChanges="orientation|keyboardHidden|screenSize"固定Activity的方向通過設定檔1. android:screenOrientation="landscape"水平2. android:screenOrientation="portrait"垂直通過代碼1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);2. 誰後配置誰生效##5. Activity的啟動模式(****)Activity是被ActivityManager用棧結構管理的。###5.1 Activity的四種啟動模式1. standard(標準的也是預設的,如果不配置就是標準的): 1. 特點:傻瓜式的,每啟動一個Activity,就重新建立一個全新的Activity,然後壓到棧頂。2. singleTop 1. 特點:如果當前棧頂配置了singleTop的Activity已經存在,那麼不會重新建立。3. singleTask 1. 特點:保證當前棧只有一份Activity執行個體,如果有其他Activity將其壓住,他想上位是通過將其他Activity全部彈棧的方式。4. singleInstance 1. 特點:一個Activity獨享一個任務棧。
2016-06-06安卓之Activity