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