5.intent_activity
生活随笔
收集整理的這篇文章主要介紹了
5.intent_activity
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Intent
Intent(意圖)是對將要執(zhí)行的動作的描述,android中由Intent來協(xié)助完成android各個組件之間的通訊。比如調(diào)用Activity的startActivity(intent)來啟動一個activity,或者由sendBroadcast(intent)來傳遞給所有感興趣的BroadcastReceiver, 或者由startService(intent)來啟動一個后臺的service。intent主要用來啟動activity或者service, 并攜帶需要傳遞的數(shù)據(jù), 還可以發(fā)送廣播.intent理解成android組件之間的粘合劑。總之,Intent具有激活組件和攜帶數(shù)據(jù)的功能!== 通過意圖激活activity ==意圖分為兩種: 顯示意圖和隱式意圖. 我們可以通過意圖來激活一個activity顯示意圖: 明確指定組件名的Intent為顯式意圖,指定了Intent應該傳遞給哪個組件。隱式意圖: 不指定類, 通過動作, 條件和數(shù)據(jù)啟動activity
想要通過隱式意圖啟動activity, 那個activity需要做相應的配置, 下面會說要激活自己應用中的activity, 一般使用顯示意圖.采用顯示意圖啟動其他應用中的activity,需要知道其包名, 但是包名一般是不公開的, 所以最好使用隱式意圖.激活別的應用中的activity, 一般使用隱式意圖.?隱式意圖的好處: 動作和應用程序解耦, 一個動作可以由多個應用程序去執(zhí)行, 比如, 可以有多個瀏覽器.== Activity配置 ==需要在application節(jié)點下配置
只有配置了intent-filter的activity我們才能通過隱式意圖激活.intent-filter 可以配置多個. 當我們設(shè)置了intent的動作, 條件和數(shù)據(jù)時, 如果多個應用的intent-filter都匹配, 則系統(tǒng)會讓我們選擇.其他的配置:- application節(jié)點的 label 是在應用程序管理中顯示的名字- activity節(jié)點的 label 是在 launcher 中顯示的名字.- label屬性: 界面上方的標題, 如果沒有, 則使用 application 的 label.- activity的label屬性會在 launcher 中生成一個圖標, 點擊進入相應的 activity.- name屬性: 要寫 activity 的全類名. 如果 manifest 的 package 屬性和activity所在包的名字一樣, 則可以省略包名.android:excludeFromRecents="true" 不顯示在最近應用程序列表== 隱式意圖激活系統(tǒng)應用界面 ==在windows下的注冊表記錄的系統(tǒng)中所有程序的信息. 其中有一些文件配置了什么樣的文件用什么軟件打開.在android中也一樣, 當我們安裝一個應用時, 我們配置的activity的信息也會被記錄到android的注冊表中, 當使用一個設(shè)置了動作,條件,數(shù)據(jù)的intent啟動activity時,系統(tǒng)就會幫我們?nèi)ふ疫@樣的activity.通過隱式意圖我們可以打開很多系統(tǒng)應用:
注意:- 如果一個activity配置了多個intent-filter, 而intent-filter里面又配置了多個action, category, data, 我們只需要滿足一個就行了- 打電話, 發(fā)短信都需要權(quán)限, 但是打開瀏覽器不需要, 這是個小bug如果我們要開發(fā)自己的系統(tǒng)級應用, 需要遵守系統(tǒng)的命名規(guī)范, 一般做法為拷貝系統(tǒng)應用activity的 intent-filter, 設(shè)置數(shù)據(jù)時的 key 也要相同.這樣使用隱式意圖啟動相應action對應的activity時, 系統(tǒng)就會讓我們選擇了.== 通過intent給activity帶數(shù)據(jù) ==
注意: *不能直接傳對象, 如果傳對象, 此對象必須實現(xiàn)Serializable或者Parcelable接口*這種方式在傳遞的時候, 傳的是字節(jié)數(shù)組, 然后在另一個 activity 中再轉(zhuǎn)成對象.Parcelable是google工程師為了提升效率定義的新的序列化類型,Serializable是將對象存入文件, Parcelable是存入內(nèi)存中.除此之外, 還可以使用 Bundle 傳遞數(shù)據(jù), 這個對象類似map, 使用鍵值對形式保存數(shù)據(jù).
這些傳遞數(shù)據(jù)的方式無論顯示還是隱式意圖都可以使用.---------intent.setData(Uri uri); 和 intent.getData(); 是干嘛用的----------== activity通過Intent返回數(shù)據(jù) ==如果我們希望激活的activity在關(guān)閉時能給我們返回一些數(shù)據(jù), 則需要使用:startActivityForResult(intent, 100);onActivityResult();{{{class="brush:java"// 使用startActivityForResult(); 方法激活activity, 這樣就可以獲得返回的數(shù)據(jù)public void returnData(View v) {Intent intent = new Intent(this, ReturnActivity.class);intent.putExtra("name", "gaoyuan");intent.putExtra("age", 23);// 第二個參數(shù)是請求碼startActivityForResult(intent, 100);}/** 接收 其他 Activity 返回的數(shù)據(jù), 此方法會在另一個activity銷毀時調(diào)用,* 調(diào)用此方法時, 系統(tǒng)會自動幫我們把另一個activity設(shè)置的數(shù)據(jù)傳遞進來*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);String name = data.getStringExtra("name");int age = data.getIntExtra("age", 20);Toast.makeText(getApplicationContext(), name+": "+age, Toast.LENGTH_SHORT).show();}// 在另一個activity中給 MainActivity 返回數(shù)據(jù)protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_returndata);// 給 MainActivity 返回數(shù)據(jù)Intent data = new Intent(this, ExplicitIntentActivity.class);data.putExtra("name", "gaoyuan2");data.putExtra("age", 21);// 第一個參數(shù)是 結(jié)果碼setResult(200, data);}}}}requestCode: 請求碼, 用于區(qū)分是誰打開了activity.如果當前activity有多個地方打開了新的activity, 此參數(shù)用于指定是誰打開了新的activity.resultCode: 結(jié)果碼, 用于區(qū)分是哪個activity返回的數(shù)據(jù).可以在onActivityResult根據(jù)這兩個參數(shù)做出相應的處理.= Activity =onCreate() 方法: 在啟動activity時調(diào)用.setContentView: 設(shè)置layout文件== Activity生命周期 ==activity有三個狀態(tài):- 1. 活動- 2. 暫停- 3. 停止activity有七個生命周期方法:- onCreate : activity 創(chuàng)建時調(diào)用, 只調(diào)用一次- onStart : activity 開啟時, 在 onCreate 或 onRestart 方法后調(diào)用- onResume : activity 激活時, 在 onStart 后調(diào)用. 從 Pause 狀態(tài)激活時也會調(diào)用- onPause : activity 不在最頂層, 但仍可見時, 如彈出對話框- onStop : activity 不可見, 但沒有退出時調(diào)用(如啟動其他activity, 或按home鍵)- onDestroy : activity 被銷毀時調(diào)用.- onRestart : activity 從 Stop 狀態(tài)激活時調(diào)用, 之后會調(diào)用 onRestart回到桌面(home鍵)和被另一個activity覆蓋時一樣的, 都會 stop, 而不是destroyPS: 一個應用中所有的Activity都使用同一個 UI線程== finish() 方法 =={{{class="brush:java"/** finish 方法并不屬于生命周期方法, 調(diào)用此方法會關(guān)閉 Activity, 之后, 在結(jié)束過程中會調(diào)用* 生命周期方法(pause,stop,destroy). 另外, 在此方法中可以對 后退 鍵的行為進行處理.* 另外, 調(diào)用此方法時, activity設(shè)置的Result 會返回給啟動此activity的 onActivityResult方法*/@Overridepublic void finish() {System.out.println("MainActivity.finish()");android.content.DialogInterface.OnClickListener listener =new android.content.DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {// 注意這里要調(diào)用 super 的 finish, 否則會死循環(huán)MainActivity.super.finish();}};Builder builder = new Builder(MainActivity.this);??? // 創(chuàng)建對話框builder.setTitle("確定要退出嗎?");??????????????????? // 設(shè)置標題builder.setPositiveButton("確定", listener);??????? // 設(shè)置確定按鈕的文本以及監(jiān)聽器builder.setNegativeButton("取消", null);??????????? // 設(shè)置取消按鈕builder.show();??????????????????????????????????????? // 顯示對話框}}}}== 橫豎屏切換 ==切換橫豎屏時Activity會先destroy,再創(chuàng)建, 因為android會自動根據(jù)屏幕選擇布局文件.如果我們在res目錄中創(chuàng)建如下兩個文件夾:- layout-port: 放豎屏布局文件- layout-land: 放橫屏布局文件這兩個目錄中寫同名的布局文件, android會自動選擇.想阻止這種行為: activity中屬性配置 android:configChanges="orientation|screenSize" .這樣配置之后, 屏幕會旋轉(zhuǎn), 但是依然用以前的布局, 而且activity不會被摧毀.如果希望屏幕只能是一個方向: android:screenOrientation="landscape"這樣就一直是橫屏更多的選項參考文檔 API Guide - AndroidManifest - <activity>== Activity摧毀時保存數(shù)據(jù) ==在activity可能被殺死的情況下保存數(shù)據(jù), 存到了一個文件里onSaveInstanceState在onStart之后恢復數(shù)據(jù), 調(diào)用onCreate方法時, 也會使用之前保存的數(shù)據(jù)onRestoreInstanceState
== 還有幾個特殊的方法 ==onPostCreateCalled when activity start-up is complete (after onStart and onRestoreInstanceState have been called). Applications will generally not implement this method; it is intended for system classes to do final initialization after application code has run.?Derived classes must call through to the super class's implementation of this method. If they do not, an exception will be thrown.Overrides: onPostCreate(...) in ActivityParameters:savedInstanceState If the activity is being re-initialized after previously being shut down then this Bundle contains the data it most recently supplied in onSaveInstanceState. Note: Otherwise it is null.{{{class="brush:java"// 如果系統(tǒng)認為 Activity 可能被kill, 則會調(diào)用此方法保存數(shù)據(jù), 在 onStop 方法之前調(diào)用// 但是不保證每次調(diào)用 onPsuse, onStop 之間都會調(diào)用此方法@Overrideprotected void onSaveInstanceState(Bundle outState) {outState.putString("data", "onSaveInstanceState保存的數(shù)據(jù)");System.out.println("MainActivity.onSaveInstanceState()");super.onSaveInstanceState(outState);}// 恢復之前 onSaveInstanceState保存的數(shù)據(jù), 這份方法里的 Bundle 和 onCreate 方法// 里的是一樣的, 只是二者調(diào)用的時機不同, 此方法在onStart之后調(diào)用.// 在這個方法里恢復數(shù)據(jù)顯得層次更清晰.@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {String string = savedInstanceState.getString("data");System.out.println("恢復: " + string);super.onRestoreInstanceState(savedInstanceState);}}}}= Activity任務棧 =當應用被啟動的時候, 系統(tǒng)會為其分配一個任務棧, 記錄用戶打開的activity 及先后順序,維護用戶的操作體驗. 如果任務棧清空了, 應用程序就結(jié)束了.每次開啟一個應用, 系統(tǒng)都會為其分配新的任務棧, 任務棧的id在系統(tǒng)中是自增長的.手機重啟后, 任務棧的id又從0開始算起.應用中的activity以棧的形式存儲的. 當打開一個activity時, activity會被放置到棧頂.用戶能看到的就是棧頂?shù)?activity.我們可以為activity配置啟動模式, 在activity節(jié)點下配置 android:lunchModeActivity的啟動模式有以下四種:standard:標準模式, 無限制的創(chuàng)建activity, A-B-B-A-A-A-BsingleTop:如果當前activity在棧頂, 則不會創(chuàng)建, 而是復用當前activity的實例.調(diào)用當前activity的 *onNewIntent* 方法. A-B-A-B-C-B-A. (瀏覽器標簽頁)singleTask:任務棧中只能有一個當前activity實例, 如果再次調(diào)用, 不會創(chuàng)建新的,而是將當前activity上面所有的activity都清空, 使自己成為棧頂, 很霸道也是會調(diào)用 onNewIntent 方法. A-B-C-C-C >再次調(diào)B> A-B (瀏覽器主界面)singltInstance:當首次啟動此activity是, 會開啟一個新的任務棧, 此任務棧中只有當前activity,而且會放在原先任務棧的前面. 如果此時原先任務棧又新創(chuàng)建了activity, 此時當前activity的任務棧又會放在原先任務棧后面.
在整個系統(tǒng)中, 只有一個activity實例, 并且在自己的任務棧中.(接/打電話界面, 有道詞典查詞界面)
可以參考這篇文章:?http://blog.csdn.net/liuhe688/article/details/6754323
舊的activity不finish, 新的就不會創(chuàng)建onNewIntent注意: *后兩種啟動模式的activity如果使用 startActivityForResult 啟動, 是無法得到返回的數(shù)據(jù)的.*參考博客:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html?t=1376744007734http://www.cnblogs.com/xirihanlin/archive/2010/06/03/1750811.html
來自為知筆記(Wiz)
轉(zhuǎn)載于:https://www.cnblogs.com/ywq-come/p/5925213.html
總結(jié)
以上是生活随笔為你收集整理的5.intent_activity的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux系统编程26:进程间通信之进程
- 下一篇: codeforces 721E Roa