1. 程式人生 > >Android Activity和Intent機制學習筆記

Android Activity和Intent機制學習筆記

Activity

Android中,Activity是所有程式的根本,所有程式的流程都執行在Activity之中,Activity具有自己的生命週期(見http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.html,由系統控制生命週期,程式無法改變,但可以用onSaveInstanceState儲存其狀態)。

對於Activity,關鍵是其生命週期的把握(如下圖),其次就是狀態的儲存和恢復(onSaveInstanceState onRestoreInstanceState),以及Activity之間的跳轉和資料傳輸(intent)。

activity_lifecycle

Activity中常用的函式有SetContentView()   findViewById()    finish()   startActivity(),

其生命週期涉及的函式有:

void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()

注意的是,Activity的使用需要在Manifest檔案中新增相應的<Activity>,並設定其屬性和intent-filter。

Intent

Android中提供了Intent機制來協助應用間的互動與通訊,Intent負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,Android則根據此Intent的描述,負責找到對應的元件,將 Intent傳遞給呼叫的元件,並完成元件的呼叫。Intent不僅可用於應用程式之間,也可用於應用程式內部的Activity/Service之間的互動。因此,Intent在這裡起著一個媒體中介的作用,專門提供元件互相呼叫的相關資訊,實現呼叫者與被呼叫者之間的解耦。在SDK中給出了Intent作用的表現形式為:

Intent屬性的設定,包括以下幾點:(以下為XML中定義,當然也可以通過Intent類的方法來獲取和設定)

(1)Action,也就是要執行的動作

SDk中定義了一些標準的動作,包括

onstant Target component Action
ACTION_CALL activity Initiate a phone call.
ACTION_EDIT activity Display data for the user to edit.
ACTION_MAIN activity Start up as the initial activity of a task, with no data input and no returned output.
ACTION_SYNC activity Synchronize data on a server with data on the mobile device.
ACTION_BATTERY_LOW broadcast receiver A warning that the battery is low.
ACTION_HEADSET_PLUG broadcast receiver A headset has been plugged into the device, or unplugged from it.
ACTION_SCREEN_ON broadcast receiver The screen has been turned on.
ACTION_TIMEZONE_CHANGED broadcast receiver The setting for the time zone has changed.

當然,也可以自定義動作(自定義的動作在使用時,需要加上包名作為字首,如"com.example.project.SHOW_COLOR”),並可定義相應的Activity來處理我們的自定義動作。

(2)Data,也就是執行動作要操作的資料

Android中採用指向資料的一個URI來表示,如在聯絡人應用中,一個指向某聯絡人的URI可能為:content://contacts/1。對於不同的動作,其URI資料的型別是不同的(可以設定type屬性指定特定型別資料),如ACTION_EDIT指定Data為檔案URI,打電話為tel:URI,訪問網路為http:URI,而由content provider提供的資料則為content: URIs。

(3)type(資料型別),顯式指定Intent的資料型別(MIME)。一般Intent的資料型別能夠根據資料本身進行判定,但是通過設定這個屬性,可以強制採用顯式指定的型別而不再進行推導。

(4)category(類別),被執行動作的附加資訊。例如 LAUNCHER_CATEGORY 表示Intent 的接受者應該在Launcher中作為頂級應用出現;而ALTERNATIVE_CATEGORY表示當前的Intent是一系列的可選動作中的一個,這些動作可以在同一塊資料上執行。還有其他的為

Constant Meaning
CATEGORY_BROWSABLE The target activity can be safely invoked by the browser to display data referenced by a link — for example, an image or an e-mail message.
CATEGORY_GADGET The activity can be embedded inside of another activity that hosts gadgets.
CATEGORY_HOME The activity displays the home screen, the first screen the user sees when the device is turned on or when the HOME key is pressed.
CATEGORY_LAUNCHER The activity can be the initial activity of a task and is listed in the top-level application launcher.
CATEGORY_PREFERENCE The target activity is a preference panel.

(5)component(元件),指定Intent的的目標元件的類名稱。通常 Android會根據Intent 中包含的其它屬性的資訊,比如action、data/type、category進行查詢,最終找到一個與之匹配的目標元件。但是,如果 component這個屬性有指定的話,將直接使用它指定的元件,而不再執行上述查詢過程。指定了這個屬性以後,Intent的其它所有屬性都是可選的。

(6)extras(附加資訊),是其它所有附加資訊的集合。使用extras可以為元件提供擴充套件資訊,比如,如果要執行“傳送電子郵件”這個動作,可以將電子郵件的標題、正文等儲存在extras裡,傳給電子郵件傳送元件。

理解Intent的關鍵之一是理解清楚Intent的兩種基本用法:一種是顯式的Intent,即在構造Intent物件時就指定接收者;另一種是隱式的Intent,即Intent的傳送者在構造Intent物件時,並不知道也不關心接收者是誰,有利於降低傳送者和接收者之間的耦合。

對於顯式Intent,Android不需要去做解析,因為目標元件已經很明確,Android需要解析的是那些隱式Intent,通過解析,將 Intent對映給可以處理此Intent的Activity、IntentReceiver或Service。        

Intent解析機制主要是通過查詢已註冊在AndroidManifest.xml中的所有IntentFilter及其中定義的Intent,最終找到匹配的Intent。在這個解析過程中,Android是通過Intent的action、type、category這三個屬性來進行判斷的,判斷方法如下:

  • 如果Intent指明定了action,則目標元件的IntentFilter的action列表中就必須包含有這個action,否則不能匹配;
  • 如果Intent沒有提供type,系統將從data中得到資料型別。和action一樣,目標元件的資料型別列表中必須包含Intent的資料型別,否則不能匹配。
  • 如果Intent中的資料不是content: 型別的URI,而且Intent也沒有明確指定它的type,將根據Intent中資料的scheme (比如 http: 或者mailto:) 進行匹配。同上,Intent 的scheme必須出現在目標元件的scheme列表中。
  • 如果Intent指定了一個或多個category,這些類別必須全部出現在組建的類別列表中。比如Intent中包含了兩個類別:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目標元件必須至少包含這兩個類別。

Intent-Filter的定義

一些屬性設定的例子:

<action android:name="com.example.project.SHOW_CURRENT" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/mpeg" android:scheme="http" . . . /> 
<data android:mimeType="image/*" />
<data android:scheme="http" android:type="video/*" />

完整的例項

<activityandroid:name="NotesList"android:label="@string/title_notes_list"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.VIEW"/><actionandroid:name="android.intent.action.EDIT"/><actionandroid:name="android.intent.action.PICK"/><categoryandroid:name="android.intent.category.DEFAULT"/><dataandroid:mimeType="vnd.android.cursor.dir/vnd.google.note"/></intent-filter><intent-filter><actionandroid:name="android.intent.action.GET_CONTENT"/><categoryandroid:name="android.intent.category.DEFAULT"/><dataandroid:mimeType="vnd.android.cursor.item/vnd.google.note"/></intent-filter></activity>

Intent用法例項

1.無引數Activity跳轉

Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);   

2.向下一個Activity傳遞資料(使用Bundle和Intent.putExtras)

Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString("name", "This is from MainActivity!");
it.putExtras(bundle);       // it.putExtra(“test”, "shuju”);
startActivity(it);            // startActivityForResult(it,REQUEST_CODE);

對於資料的獲取可以採用:

Bundle bundle=getIntent().getExtras();
String name=bundle.getString("name");

3.向上一個Activity返回結果(使用setResult,針對startActivityForResult(it,REQUEST_CODE)啟動的Activity)

        Intent intent=getIntent();
        Bundle bundle2=new Bundle();
        bundle2.putString("name", "This is from ShowMsg!");
        intent.putExtras(bundle2);
        setResult(RESULT_OK, intent);

4.回撥上一個Activity的結果處理函式(onActivityResult)

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode==REQUEST_CODE){
            if(resultCode==RESULT_CANCELED)
                  setTitle("cancle");
            else if (resultCode==RESULT_OK) {
                 String temp=null;
                 Bundle bundle=data.getExtras();
                 if(bundle!=null)   temp=bundle.getString("name");
                 setTitle(temp);
            }
        }
    }

下面是轉載來的其他的一些Intent用法例項(轉自javaeye)

顯示網頁
   1. Uri uri = Uri.parse("http://google.com");  
   2. Intent it = new Intent(Intent.ACTION_VIEW, uri);  
   3. startActivity(it);

顯示地圖
   1. Uri uri = Uri.parse("geo:38.899533,-77.036476");  
   2. Intent it = new Intent(Intent.ACTION_VIEW, uri);   
   3. startActivity(it);   
   4. //其他 geo URI 範例  
   5. //geo:latitude,longitude  
   6. //geo:latitude,longitude?z=zoom  
   7. //geo:0,0?q=my+street+address  
   8. //geo:0,0?q=business+near+city  
   9. //google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz=mapZoom

路徑規劃
   1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");  
   2. Intent it = new Intent(Intent.ACTION_VIEW, uri);  
   3. startActivity(it);  
   4. //where startLat, startLng, endLat, endLng are a long with 6 decimals like: 50.123456 

打電話
   1. //叫出撥號程式 
   2. Uri uri = Uri.parse("tel:0800000123");  
   3. Intent it = new Intent(Intent.ACTION_DIAL, uri);  
   4. startActivity(it);  
   1. //直接打電話出去  
   2. Uri uri = Uri.parse("tel:0800000123");  
   3. Intent it = new Intent(Intent.ACTION_CALL, uri);  
   4. startActivity(it);  
   5. //用這個,要在 AndroidManifest.xml 中,加上  
   6. //<uses-permission id="android.permission.CALL_PHONE" /> 

傳送SMS/MMS
   1. //呼叫簡訊程式 
   2. Intent it = new Intent(Intent.ACTION_VIEW, uri);  
   3. it.putExtra("sms_body", "The SMS text");   
   4. it.setType("vnd.android-dir/mms-sms");  
   5. startActivity(it); 
   1. //傳送訊息 
   2. Uri uri = Uri.parse("smsto://0800000123");  
   3. Intent it = new Intent(Intent.ACTION_SENDTO, uri);  
   4. it.putExtra("sms_body", "The SMS text");  
   5. startActivity(it); 
   1. //傳送 MMS  
   2. Uri uri = Uri.parse("content://media/external/images/media/23");  
   3. Intent it = new Intent(Intent.ACTION_SEND);   
   4. it.putExtra("sms_body", "some text");   
   5. it.putExtra(Intent.EXTRA_STREAM, uri);  
   6. it.setType("image/png");   
   7. startActivity(it); 

傳送 Email
   1. Uri uri = Uri.parse("mailto:[email protected]");  
   2. Intent it = new Intent(Intent.ACTION_SENDTO, uri);  
   3. startActivity(it); 


   1. Intent it = new Intent(Intent.ACTION_SEND);  
   2. it.putExtra(Intent.EXTRA_EMAIL, "[email protected]");  
   3. it.putExtra(Intent.EXTRA_TEXT, "The email body text");  
   4. it.setType("text/plain");  
   5. startActivity(Intent.createChooser(it, "Choose Email Client")); 


   1. Intent it=new Intent(Intent.ACTION_SEND);    
   2. String[] tos={"[email protected]"};    
   3. String[] ccs={"[email protected]"};    
   4. it.putExtra(Intent.EXTRA_EMAIL, tos);    
   5. it.putExtra(Intent.EXTRA_CC, ccs);    
   6. it.putExtra(Intent.EXTRA_TEXT, "The email body text");    
   7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");    
   8. it.setType("message/rfc822");    
   9. startActivity(Intent.createChooser(it, "Choose Email Client"));


   1. //傳送附件
   2. Intent it = new Intent(Intent.ACTION_SEND);  
   3. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");  
   4. it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");  
   5. sendIntent.setType("audio/mp3");  
   6. startActivity(Intent.createChooser(it, "Choose Email Client"));

播放多媒體
       Uri uri = Uri.parse("file:///sdcard/song.mp3");  
       Intent it = new Intent(Intent.ACTION_VIEW, uri);  
       it.setType("audio/mp3");  
       startActivity(it); 
       Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");  
       Intent it = new Intent(Intent.ACTION_VIEW, uri);  
       startActivity(it);

Market 相關
1.        //尋找某個應用 
2.        Uri uri = Uri.parse("market://search?q=pname:pkg_name"); 
3.        Intent it = new Intent(Intent.ACTION_VIEW, uri);  
4.        startActivity(it);  
5.        //where pkg_name is the full package path for an application 
1.        //顯示某個應用的相關資訊 
2.        Uri uri = Uri.parse("market://details?id=app_id");  
3.        Intent it = new Intent(Intent.ACTION_VIEW, uri); 
4.        startActivity(it);  
5.        //where app_id is the application ID, find the ID   
6.        //by clicking on your application on Market home   
7.        //page, and notice the ID from the address bar

Uninstall 應用程式
1.        Uri uri = Uri.fromParts("package", strPackageName, null); 
2.        Intent it = new Intent(Intent.ACTION_DELETE, uri);   
3.        startActivity(it); 

轉自:http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html

相關推薦

Android ActivityIntent機制學習筆記

Activity Android中,Activity是所有程式的根本,所有程式的流程都執行在Activity之中,Activity具有自己的生命週期(見http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.ht

Android 開發中 Intent Intent 過濾器學習筆記

Android 中的 Intent 是一個訊息傳遞物件,我們可以使用它來從其他應用,元件等發起和傳遞操作請求。其主要使用場景包含如下三種: 啟動 Activity: 通過將 Intent 傳遞給 startActivity(),我們可以啟動新的 Activ

Android觸控事件傳遞機制學習筆記

1、Android 觸控事件傳遞機制 http://blog.csdn.net/awangyunke/article/details/22047987 2、Android-onInterceptTouchEvent()和onTouchEvent()總結 h

Android非同步訊息處理機制學習筆記

(一)Handler 什麼是Handler Android訊息機制的上層介面,Handler通過傳送和處理Message和Runnable物件來關聯相對應執行緒的MessageQueeu. 可

Android第一行代碼學習筆記六---Intent向活動傳遞數據

一行 而已 activity ase 是否 button can ride 重載 @1、向下一個活動傳遞數據: Intent提供了一系列putExtra()方法的重載,可以把我們想要傳遞的數據暫存在Intent中,啟動了另一個活動後,只需把這些數據再從Intent中取出就可

Android開發藝術探索》學習筆記Android的訊息機制.md

《Android開發藝術探索》學習筆記之Android的訊息機制 一、概述 1、Handler的主要作用是將某個任務切換到指定的執行緒中去執行 eg:子執行緒中無法更新UI,需切換到主執行緒 V

Android開發藝術探索》學習筆記Android的執行緒執行緒池

一、概述 1、主執行緒與子執行緒 主執行緒 又叫UI執行緒 主要作用是執行四大元件以及處理它們和使用者的互動,主要用來處理和介面相關的事情 子執行緒 執行耗時任務,比如網路請求、I/O操作等

吳恩達Coursera深度學習課程 deeplearning.ai (5-3) 序列模型注意力機制--課程筆記

3.1 基礎模型 sequence to sequence sequence to sequence:兩個序列模型組成,前半部分叫做編碼,後半部分叫做解碼。用於機器翻譯。 image to sequence sequence to sequenc

【 專欄 】- Android應用安全防護逆向分析學習筆記

Android應用安全防護和逆向分析學習筆記 這裡給大家分享的是《Android應用安全防護和逆向分析》的學習筆記,個人認為移動端的安全也是不可忽視的,我們Android工程師應該重視Android的安全這一塊,希望這個專欄的部落

Android百度地圖開發學習筆記(二)之定位當前位置自定義控制元件返回

在完成HelloMap後,接來完成的重要功能是如何定位當前位置和如何一鍵返回。效果圖如下: 這裡的控制元件就是一個ImageView,自己去百度一個好看的圖片就可以了。 一 定位當前位置和自定義控制元件返回 1.官方技術文件 可以先點選百度地圖定位技術文件,仔細看一下相關

Android的多執行緒——HandlerAsync Task學習筆記

首先是郭神的話:“和許多其他的GUI庫一樣,android的UI也是執行緒不安全的。也就是說,如果想要更新應用程式裡的UI,則必須在主執行緒中進行,否則就會出現異常。對於這種情況,安卓提供了一套非同步訊息處理機制,完美地解決了在子執行緒中進行UI操作的問題”。 具體就是兩種

Android第一行代碼學習筆記---手動創建活動

重寫 用戶 protected 其他 bsp 1.2 指定 ear category 1.1 手動創建活動 活動是什麽:活動(Activity)是最容易吸引用戶的地方,它是一種可以包含用戶界面的組件,主要用於和用戶進行交互。一個應用程序中可以包含零個或多個活動。 @1.新建

Android第一行代碼學習筆記二---在活動中使用Toast

一行代碼 就會 onclick log sta contex instance and undle Toast:是Android系統提供的一種非常好的提醒方式,在程序中可以使用它將一些短小的信息通知給用戶,這些信息會在一段時間後自動消失,並且不會占用任何屏幕空間。 首先需要

Android第一行代碼學習筆記七---活動的生命周期

帶來 並不是 androi style 屏幕 ide instance 定位 -o @1.返回棧 Android中的活動是可以層疊的,我們每啟動一個新的活動,就會覆蓋在原活動之上,然後點擊Back鍵就會銷毀最上面的活動,下面一個活動就會重新顯示出來。 Android是使用任

Android ActivityFragment的生命周期圖

sso mar popu data con b2c post pos alt Android Activity和Fragment的生命周期圖

網頁排版中的浮動定位(學習筆記

mage hidden alt images blog clear ul li -a www CSS中的浮動和定位 在了解CSS中的浮動和定位之前有必要先了解清楚標準流和脫離標準流的特性 雖然浮動和定位很重要,但是在以後的網頁寫作中,還是盡量少用,最好別亂用,不然後

Android總結篇——Intent機制詳解及示例總結

ets mp3 pro domain 一般來說 ssa star wrap 無線 一.Intent介紹: Intent的中文意思是“意圖,意向”,在Android中提供了Intent機制來協助應用間的交互與通訊,Intent負責對應用中一次操作的動 作、動作涉及

監聽器[用於監聽ServletRequest對象的產生銷毀] 學習筆記

監聽器[用於監聽ServletRequeimport javax.servlet.ServletRequestEvent; import javax.servlet.ServletRequestListener; //監聽器[用於監聽ServletRequest對象的產生和銷毀] public class

監聽HttpSesison產生銷毀 學習筆記

監聽HttpSesison產生和銷毀 import java.util.Date; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.Htt

springmvc 日期轉換器編碼過濾器 學習筆記

springmvc 日期轉換器和編碼過濾springmvc不能將String類型轉成Date類型,必須自定義類型轉換器 <!-- 編碼過濾器 --> <filter> <filter-name>CharacterEncodingFilter</