Android第三十七天

1、Intent的做用是什麼?java

   一、Intent 用於封裝程序的」調用意圖「。兩個Activity之間,能夠把須要交換的數據封裝成Bundle對象,而後使用Intent攜帶Bundle對象,實現兩個Activity之間的數據交換;android

        二、Intent仍是各類應用程序組件之間通訊的重要媒介。無論想啓動一個Service、Acitivity仍是BroadcastReceiver,Android均使用統一的Intent對象來封裝這種」啓動意圖「。很明顯使用Intent提供了一致的編程模型;git

        三、Intent還有一個好處,若是應用程序只是想啓動具備某種特徵的組件,並不想和某個具體的組件耦合,則能夠經過在intent-filter中配置相應的屬性進行處理,與stucts2中的MVC框架思路相似。編程

            //①.第一種方式:開啓另外一個Activity數組

 
  1.  //Intent intent=new Intent(this,SecondActivity.class);
  2. Intent intent=new Intent();

        //②.第二種方式:使用ComponentName瀏覽器

        //使用ComponentName組件名來開啓另外一個Activity網絡

 
  1. ComponentName component=new ComponentName(this, SecondActivity.class);

        //第二個參數是包含包名,類名的一個完整字符串app

 
  1. ComponentName component=new ComponentName(this, "com.qianfeng.day06_intentattribute01.SecondActivity");

        //第一個參數是單純的包名;第二個參數是包含包名,類名的一個完整字符串框架

 
  1. ComponentName component=new ComponentName("com.qianfeng.day06_intentattribute01", "com.qianfeng.day06_intentattribute01.SecondActivity");
  2. intent.setComponent(component);

        //③.第三種方式:setClass也能夠實現跳轉ide

 
  1. intent.setClass(this, SecondActivity.class);

        //④.第四種方式:setClassName跳轉方式

 
  1. intent.setClassName(this, "com.qianfeng.day06_intentattribute01.SecondActivity"); 

        //⑤.第五種:經過隱式意圖開啓另外一個Activity

 
  1. intent.setAction("ergouzisimida");

        //其實系統默認就有這句話,默認省略了這句話

 
  1. intent.addCategory("android.intent.category.DEFAULT");
 
  1. startActivity(intent);

2、Intent對象的七個屬性

            <1>ComponentName屬性:

             一、指定了ComponentName屬性的Intent已經明確了它將要啓動哪一個組件,所以這種Intent被稱爲顯式Intent,沒有指定ComponentName屬性的Intent被稱爲隱式Intent。隱式Intent沒有明確要啓動哪一個組件,應用會根據Intent指定的規則去啓動符合條件的組件。

             二、示例代碼:

 
  1. Intent intent = new Intent();
  2. ComponentName cName = new ComponentName(MainActivity.this,NextActivity.class);
  3. intent.setComponent(cName);
  4. startActivity(intent);
  5. //實際上,以上的寫法都被簡化爲如下寫法:
  6. Intent intent = new Intent(MainActivity.this,NextActivity.class);
  7.         startActivity(intent);
  8. //也就是說,平時咱們最經常使用的Intent頁面跳轉的寫法就調用的是顯式Intent。

             <2>Action屬性

                    Action、Category屬性與intent-filter配置:

                  一般,Action、Category屬性結合使用,定義這兩個屬性都是在配置文件的<intent-filter>節點中。Intent經過定義Action屬性(其實就是一段自定義的字符串),這樣就能夠把Intent與具體的某個Activity分離,實現瞭解耦。不然,每次跳轉,都要寫成相似new Intent(MainActivity.this,NextActivity.class)這樣的形式,也就是說必須將要跳轉的目標Activity的名字寫出來,這樣的編碼實際上是「硬編碼」,並無實現鬆耦合。調用Intent對象的setAction()方法實現頁面跳轉雖然略微複雜(須要在AndroidManifest.xml文件中配置),可是實現瞭解耦。

一、示例代碼:

 
  1. Intent intent = new Intent(); 
  2. intent.setAction("com.train.task01.editactivity"); 
  3. startActivity(intent);

//在配置文件中註冊Activity的時候須要聲明:

 
  1. <activity android:name="com.train.taskstack01.EditActivity">
  2.   <intent-filter>
  3.       <action android:name="com.train.task01.editactivity" />
  4.       <category android:name="android.intent.category.DEFAULT" />   
  5.   </intent-filter>
  6. </activity>

//當某個頁面是默認啓動頁面時,須要定義Action、Category的屬性必須爲如下字符串:【設置任務入口】

 
  1.             <intent-filter>
  2.                 <action android:name="android.intent.action.MAIN" />
  3.                 <category android:name="android.intent.category.LAUNCHER" />
  4.             </intent-filter>

二、經常使用的屬性

ACTION_MAIN:(android.intent.action.MAIN)Android程序入口。 

ACTION_VIEW: (android.intent.action.VIEW) 顯示指定數據。

ACTION_EDIT: (android.intent.action.EDIT) 編輯指定數據。 

ACTION_DIAL: (android.intent.action.DIAL) 顯示撥號面板。

ACTION_CALL: (android.intent.action.CALL) 直接呼叫Data中所帶的號碼。  

ACTION_ANSWER: (android.intent.action.ANSWER) 接聽來電。  

ACTION_SEND: (android.intent.action.SEND) 向其餘人發送數據(例如:彩信/email)。  

ACTION_SENDTO:  (android.intent.action.SENDTO) 向其餘人發送短信。

ACTION_SEARCH: (android.intent.action.SEARCH) 執行搜索。  

ACTION_GET_CONTENT: (android.intent.action.GET_CONTENT) 讓用戶選擇數據,並返回所選數據。

                <3>  Category屬性

                             Category屬性爲Action增長額外的附加類別信息。CATEGORY_LAUNCHER意味着在加載程序的時候Acticity出如今最上面,而CATEGORY_HOME表示頁面跳轉到HOME界面。

實現頁面跳轉到HOME界面的代碼:【記憶】

 
  1. Intent intent = new Intent(); 
  2. intent.setAction(Intent.ACTION_MAIN); 
  3. intent.addCategory(Intent.CATEGORY_HOME); 
  4. startActivity(intent); 

一、經常使用屬性

CATEGORY_DEFAULT: (android.intent.category.DEFAULT) Android系統中默認的執行方式,按照普通Activity的執行方式執行。  

CATEGORY_DEFAULT: (android.intent.category.DEFAULT) Android系統中默認的執行方式,按照普通Activity的執行方式執行。 

CATEGORY_HOME: (android.intent.category.HOME) 設置該組件爲Home Activity。

CATEGORY_PREFERENCE: (android.intent.category.PREFERENCE) 設置該組件爲Preference。 

CATEGORY_LAUNCHER: (android.intent.category.LAUNCHER) 設置該組件爲在當前應用程序啓動器中優先級最高的Activity,一般與入口ACTION_MAIN配合使用。CATEGORY_BROWSABLE: (android.intent.category.BROWSABLE) 設置該組件可使用瀏覽器啓動。

                <4>Data屬性

                        Data屬性一般用於向Action屬性提供操做的數據。Data屬性的值是個Uri對象。

                  Uri的格式以下:scheme://host:port/path

Intent利用Action屬性和Data屬性啓動Android系統內置組件代碼:

//發送短信

 
  1. public void sendSMS(View view){
  2.    Intent intent=new Intent(Intent.ACTION_SENDTO);
  3.    intent.setData(Uri.parse("smsto:13366201398"));
  4.    intent.putExtra("sms_body", "發送短信的內容");
  5.    startActivity(intent);
  6. }

//打電話,

 <!-- 增長打電話的權限 -->

 
  1. <uses-permission android:name="android.permission.CALL_PHONE" />
  2. public void  callPhone(View view){
  3.    Intent intent=new Intent(Intent.ACTION_CALL,Uri.parse("tel:13366201398"));
  4.    startActivity(intent);
  5. }

//打開網頁

<!-- 增長訪問網絡的權限 -->

 
  1. <uses-permission android:name="android.permission.INTERNET" />
 
  1. public void openHtml(View view){
  2.    Intent intent=new Intent(Intent.ACTION_VIEW,Uri.parse("https://www.baidu.com/"));
  3.    startActivity(intent);
  4. }

//打開網絡圖片

 
  1. public void openImage(View view){
  2.    Intent intent=new Intent(Intent.ACTION_VIEW,Uri.parse("http://192.168.129.94:8080/images/s1.jpg"));
  3.    startActivity(intent);
  4. }

//打開相冊

 
  1. public void openAlbum(View view){
  2.    Intent intent = new Intent(); 
  3.    intent.setAction(Intent. ACTION_GET_CONTENT );
  4.    intent.setType( "image/*" ); 
  5.    startActivityForResult(wrapperIntent, 100);  
  6. }

//打開相機

 
  1. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
  2. startActivityForResult(intent, 100);  

一、經常使用屬性

tel://:號碼數據格式,後跟電話號碼。 

mailto://:郵件數據格式,後跟郵件收件人地址。

smsto://:短息數據格式,後跟短信接收號碼。  

content://:內容數據格式,後跟須要讀取的內容。  

file://:文件數據格式,後跟文件路徑。  

market://search?q=pname:pkgname:市場數據格式,在Google Market裏搜索包名爲pkgname的應用。  

geo://latitude, longitude:經緯數據格式,在地圖上顯示經緯度所指定的位置。

        <5>Type屬性

一、Type屬性用於指定Data所指定的Uri對應的MIME類型。MIME只要符合「abc/xyz」這樣的字符串格式便可。

二、 Intent利用Action、Data和Type屬性啓動Android系統內置組件的代碼:

播放視頻:

 
  1. Intent intent = new Intent(); 
  2. Uri uri = Uri.parse("file:///sdcard/media.mp4"); 
  3. intent.setAction(Intent.ACTION_VIEW);
  4. intent.setDataAndType(uri, "video/*"); 
  5. startActivity(intent);

        <6>Flag屬性

Intent可調用addFlags()方法來爲Intent添加控制標記

實例:

 
  1. Intent intent = new Intent(this, MainActivity.class); 
  2. //將Activity棧中處於MainActivity主頁面之上的Activity都彈出。 
  3. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
  4. startActivity(intent);

一、經常使用屬性

FLAG_ACTIVITY_CLEAR_TOP:(效果同Activity  LaunchMode的singleTask )

FLAG_ACTIVITY_SINGLE_TOP:(效果同Activity LaunchMode的singleTop)

               <7>Extra屬性

一、經過intent.putExtra(鍵, 值)的形式在多個Activity之間進行數據交換。 

二、系統內置的幾個Extra常量:

  EXTRA_BCC:存放郵件密送人地址的字符串數組。

  EXTRA_CC:存放郵件抄送人地址的字符串數組。

  EXTRA_EMAIL:存放郵件地址的字符串數組。

  EXTRA_SUBJECT:存放郵件主題字符串。

  EXTRA_TEXT:存放郵件內容。

  EXTRA_KEY_EVENT:以KeyEvent對象方式存放觸發Intent的按鍵。

  EXTRA_PHONE_NUMBER:存放調用ACTION_CALL時的電話號碼。

三、 Intent利用Action、Data和Type、Extra屬性啓動Android系統內置組件的代碼:

//調用發送短信的程序 

 
  1. Intent  intent  = new Intent();
  2. intent.setAction(Intent.ACTION_VIEW);
  3. intent.setType("vnd.android-dir/mms-sms"); 
  4. intent.putExtra("sms_body", "信息內容..."); 
  5. startActivity(intent);

//發送短信息 

 
  1. Uri uri = Uri.parse("smsto:13200100001"); 
  2. Intent  intent  = new Intent(); 
  3. intent.setAction(Intent.  ACTION_SENDTO );
  4. intent.setData(uri);
  5. intent.putExtra("sms_body", "信息內容..."); 
  6. startActivity( intent );

//發送彩信,設備會提示選擇合適的程序發送 

 
  1. Uri uri = Uri.parse("content://media/external/images/media/23"); //設備中的資源(圖像或其餘資源) 
  2. Intent intent = new Intent(); 
  3. intent.setAction(Intent.  ACTION_SEND );
  4. intent.setType("image/png"); 
  5. intent.putExtra("sms_body", "內容"); 
  6. intent.putExtra(Intent.EXTRA_STREAM, uri); 
  7. startActivity(it);

//發送Email:

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

四、 Intent利用Action屬性中的ACTION_GET_CONTENT獲取返回值:

//選擇圖片 requestCode 返回的標識

 
  1. Intent intent = new Intent(); 
  2. intent.setAction(Intent. ACTION_GET_CONTENT );
  3. intent.setType( "image/*" ); 
  4. Intent wrapperIntent = Intent.createChooser(intent, null);
  5. startActivityForResult(wrapperIntent, requestCode);
相關文章
相關標籤/搜索