Android零基礎入門第79節:Intent 屬性詳解(上)

   Android應用將會根據Intent來啓動指定組件,至於到底啓動哪一個組件,則取決於Intent的各屬性。本期將詳細介紹Intent的各屬性值,以及 Android如何根據不一樣屬性值來啓動相應的組件。java

    Intent 對象大體包含 Component、Action、Category、Data、Type、Extra 和 Flag 這 7 種屬性,其中Component用於明確指定須要啓動的目標組件,而Extra則用於攜帶須要交換的數據。android

 

 

1、Component屬性

 

    Intent 的 Component 屬性須要接受一個 ComponentName 對象,ComponentName 對象包含以下幾個構造器。微信

  • ComponentName(String pkg, String cls):建立pkg所在包下的cls類所對應的組件。架構

  • ComponentName(Context pkg, String cls):建立pkg所對應的包下的cls類所對應的組件。app

  • ComponentName(Context pkg, Class<?> cls):建立 pkg 所對應的包下的 cls 類所對應的組件。ide

    上面幾個構造器的本質是相同的,這說明建立一個ComponentName須要指定包名和類名。這樣就能夠惟一地肯定一個組件類,這樣應用程序便可根據給定的組件類去啓動特定的組件。 佈局

    除此以外,Intent還包含了以下三個方法。學習

  • setClass(Context packageContext, Class<?> cls):設置該 Intent 將要啓動的組件對應的類。優化

  • setClassName(Context packageContext, String className):設置該 Intent 將要啓動的組件對應的類名。this

  • setClassName(String packageName, String className):設置該 Intent 將要啓動的組件對應的類名。

    指定Component屬性的Intent已經明確了它將要啓動哪一個組件,所以這種Intent也被稱爲顯式Intent,沒有指定Component屬性的Intent被稱爲隱式Intent。

    下面的示例程序示範瞭如何經過顯式Intent (指定了 Component屬性)來啓動另外一個 Activity。該程序的界面佈局很簡單,界面中只有一個按鈕,用戶單擊該按鈕將會啓動第二個Activity。此處再也不給出該程序的界面佈局文件。該程序的Java代碼以下:

package com.jinyu.cqkxzsxy.android.intent.componentattr;

import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button startBtn = (Button) findViewById(R.id.start_btn);
        // 爲bn按鈕綁定事件監聽器
        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // 建立一個ComponentName對象
                ComponentName comp = new ComponentName(MainActivity.this, SecondActivity.class);
                Intent intent = new Intent();
                // 爲Intent設置Component屬性
                intent.setComponent(comp);
                startActivity(intent);
            }
        });
    }
}

    上面程序中的onClick回調方法裏面的代碼用於建立ComponentName對象,並將該對象設置成Intent 對象的Component屬性,這樣應用程序便可根據該Intent的意圖去啓動指定組件。 實際上,這幾行關鍵代碼徹底能夠簡化爲以下形式:

  1. // 根據指定組件類來建立Intent

  2. Intentintent=newIntent(MainActivity.this,SecondActivity.class);

  3. startActivity(intent);

    從上面的代碼能夠看出,當須要爲Intent設置Component屬性時,實際上Intent己經提供了一個簡化的構造器,這樣方便程序直接指定啓動其餘組件。

    當程序經過Intent的Component屬性(明確指定了啓動哪一個組件)啓動特定組件時,被啓動組件幾乎不須要使用<intent-filter.../>進行配置。 

    程序的SecondActivity也很簡單,它的界面佈局中只包含一個簡單的文本框,用於顯示該 Activity對應的Intent的Component屬性的包名、類名。該Activity的Java代碼以下:

package com.jinyu.cqkxzsxy.android.intent.componentattr;

import android.content.ComponentName;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView showTv = (TextView) findViewById(R.id.show_tv);
        // 獲取該Activity對應的Intent的Component屬性
        ComponentName comp = getIntent().getComponent();
        // 顯示該ComponentName對象的包名、類名
        showTv.setText("組件包名爲:" + comp.getPackageName()
                + "\n組件類名爲:" + comp.getClassName());
    }
}

    運行上面的程序,經過第一個Activity中的按鈕進入第二個Activity中,將能夠看到下圖所示的界面。

 

 

2、Action屬性

 

    Intent的Action屬性的值是一個普通的字符串,表明該Intent所要完成的一個抽象動做。

    Action要完成的只是一個抽象動做,這個動做具體由哪一個組件(或許是Activity,或許是 BroadcastReceiver)來完成,Action這個字符串自己並無論。好比Android提供的標準Action: Intent.ACTION_VIEW,它只表示一個抽象的查看操做,但具體查看什麼、啓動哪一個Activity 來查看,Intent.ACTION_VIEW並不知道——這取決於Activity的<intent-filter.../>配置,只要某個Activity的<intent-filter.../>配置中包含了該ACTION_VIEW,該Actvitiy就有可能被啓動。

    下面經過一個簡單的示例來示範Action屬性(就是普通字符串)的做用。下面程序的第一個Activity很是簡單,它只包括一個普通按鈕,當用戶單擊該按鈕時,程序會「跳轉」到第二個Activity。但第一個Activity指定跳轉的Intent時,並不指定要跳轉的目標Activity,而是爲Intent指定Action屬性。此處不給出界面佈局的代碼,第一個Activity 的Java代碼以下:

package com.jinyu.cqkxzsxy.android.intent.actionattr;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private static final String TEST_ACTION = "com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button startBtn = (Button) findViewById(R.id.start_btn);
        // 爲bn按鈕綁定事件監聽器
        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // 建立Intent對象
                Intent intent = new Intent();
                // 爲Intent設置Action屬性(屬性值就是一個普通字符串)
                intent.setAction(MainActivity.TEST_ACTION);
                startActivity(intent);
            }
        });
    }
}

    上面程序中的onClick回調方法裏面的代碼指定了根據Intent來啓動Activity。但該Intent並未指定要啓動哪一個Activity,從上面程序中的代碼沒法看出該程序將要啓動哪一個Activity。那麼到底程序會啓動哪一個Activity呢?這取決於Activity配置中 <intent-fiIter.../>元素的配置。

    <intent-filter.../>元素是 AndroidManifest.xml 文件中<activity.../>元素的子元素,前面已經學習過,<activity.../>元素用於爲應用程序配置 Activity,<activity.../>的<intent-filter.../>子元素則用於配置該Activity所能「響應」的Intent。

    <intent-filter.../>元素裏一般可包含以下子元素。

  • 0〜N個<action.../>子元素。

  • 0〜N個<category…/>子元素。

  • 0〜1個<data.../>子元素。

    <action.../>、<category.../>子元素的配置很是簡單,它們均可指定android:name屬性,該屬性的值就是一個普通字符串。當<activity.../>元素的<intent-fiIter.../>子元素裏包含多個<action.../>子元素(至關於指定了多個字符串)時,就代表該Activity能響應Action屬性值爲其中任意一個字符串的Intent。

    因爲上面的程序指定啓動Action屬性爲MainActivity.TEST_ACTION常量的 Activity,也就要求被啓動的 Activity 對應的配置元素的<intent-filter.../>元素裏至少包括一個<action.../>子元素。另外上面程序中的代碼並未指定目標Intent的Category屬性,但該Intent 已有一個值爲 android.intent.category.DEFAULT 的 Category 屬性值,所以被啓動 Activity 對應的配置元素的<intent-filter.../>元素裏至少還包括一個以下的<category.../>子元素。被啓動的Activity的完整配置以下:

<activity android:name=".SecondActivity">
            <intent-filter>
                <!-- 指定該Activity能響應Action爲指定字符串的Intent -->
                <action android:name="com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION" />
                <!-- 指定該Activity能響應Action屬性爲helloWorld的Intent -->
                <action android:name="helloWorld" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

    上面Activity配置的代碼指定該Activity能響應具備指定Action屬性值、默認 Category屬性值的Intent。其中有一行代碼只是試驗用的,對於本程序沒有影響——它代表該Activity能響應Action屬性值爲helloWorld字符串、Category屬性值爲 android.intent.category.DEFAULT的Intent,但咱們的程序並何嘗試啓動這樣的Activity,能夠本身嘗試用這樣的Intent來啓動Activity,將會看到程序也會啓動該Activity。

    上面的配置代碼中配置了一個實現類爲SecondActivity的Activity,所以程序還應該提供這個Activity代碼。代碼以下:

package com.jinyu.cqkxzsxy.android.intent.actionattr;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView showTv = (TextView) findViewById(R.id.show_tv);
        // 獲取該Activity對應的Intent的Action屬性
        String action = getIntent().getAction();
        // 顯示Action屬性
        showTv.setText("Action爲:" + action);
    }
}

    上面的程序代碼很簡單,它只是在啓動時把啓動該Activity的Intent的Action屬性值顯示在指定文本框內。

    運行上面的程序,單擊程序中的「啓動指定 Action、默認Category對應的Activity」按鈕,將看到下圖所示界面。 

    實際上Android內部提供了大量標準的Action常量,其中用於啓動Activity的標準的Action常量及對應的字符串以下表所示。

 

 

3、Category屬性

 

    Intent的Category屬性的值也是一個普通的字符串,用於爲Action增長額外的附加類別信息。一般Action 屬性與Category屬性結合使用。

    一個Intent對象最多隻能包括一個Action屬性,程序可調用Intent的 setAction(String str)方法來設置Action屬性值;但一個Intent對象能夠包括多個Category屬性, 程序可調用Intent的addCategory (String str)方法來爲Intent添加Category屬性。當程序建立 Intent時,該Intent默認啓動Category屬性值爲Intent.CATEGORY_DEFAULT常量(常量值爲 android.intent.category.DEFAULT)的組件。

    接下來的示例程序將會示範Category屬性的用法。該程序的第一個Activity的代碼以下:

package com.jinyu.cqkxzsxy.android.intent.categoryattr;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
    private static final String TEST_ACTION = "com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION";
    private static final String TEST_CATEGORY = "com.jinyu.cqkxzsxy.android.intent.category.TEST_CATEGORY";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button startBtn = (Button) findViewById(R.id.start_btn);
        // 爲bn按鈕綁定事件監聽器
        startBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                // 建立Intent對象
                Intent intent = new Intent();
                // 爲Intent設置Action屬性(屬性值就是一個普通字符串)
                intent.setAction(MainActivity.TEST_ACTION);
                // 添加Category屬性
                intent.addCategory(MainActivity.TEST_CATEGORY);
                startActivity(intent);
            }
        });
    }
}

    上面程序中的onClick回調方法裏面的代碼指定了該Intent的Action屬性值爲com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION字符串,併爲該 Intent 添加 了 字符串爲com.jinyu.cqkxzsxy.android.intent.category.TEST_CATEGORY屬性。這意味着上面的程序所要啓動的目標Activity裏應該包含 <action.../> 子元素和<category.../>子元素。

    下面是程序要啓動的目標Action所對應的配置代碼:

<activity android:name=".SecondActivity">
            <intent-filter>
                <!-- 指定該Activity能響應action爲指定字符串的Intent -->
                <action android:name="com.jinyu.cqkxzsxy.android.intent.action.TEST_ACTION" />
                <!-- 指定該Activity能響應category爲指定字符串的Intent -->
                <category android:name="com.jinyu.cqkxzsxy.android.intent.category.TEST_CATEGORY" />
                <!-- 指定該Activity能響應category爲android.intent.category.DEFAULT的Intent -->
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

    上面配置Activity時也指定該Activity的實現類爲SecondActivity,該實現類的代碼以下:

package com.jinyu.cqkxzsxy.android.intent.categoryattr;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import java.util.Set;

public class SecondActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        TextView showTv = (TextView) findViewById(R.id.show_tv);
        // 獲取該Activity對應的Intent的Action屬性
        String action = getIntent().getAction();
        // 獲取該Activity對應的Intent的Category屬性
        Set<String> cates = getIntent().getCategories();
        // 顯示Category屬性
        showTv.setText("Action爲:" + action + "\nCategory屬性爲:" + cates);
    }
}

    上面的程序也很簡單,它只是在啓動時把啓動該Activity的Intent的Action、Catetory屬 性值分別顯示在不一樣的文本框內。

    運行上面的程序,單擊程序中的「啓動指定Action、指定 Category對應的Activity」按鈕,將看到下圖所示的界面。

    實際上Android內部也提供了大量標準的Catetory常量,其中標準的Category常量及對應的字符串以下表所示。

    關於Intent的Component、Action、Category三個屬性先分享到這裏,若是還不夠熟悉,建議多加練習。

    因爲內容較多,本期先學習到這裏,下期接着學習其餘四個屬性。

 

    今天就先到這裏,若是有問題歡迎留言一塊兒探討,也歡迎加入Android零基礎入門技術討論微信羣,共同成長!

    若是該系列分享對你有幫助,就動動手指關注、點贊、留言吧,你的互動就是對我最大的鼓勵!

   此文章版權爲微信公衆號分享達人秀(ShareExpert)——鑫鱻全部,若需轉載請聯繫做者受權,特此聲明!

 

往期總結回顧:

Android零基礎入門第1節:Android的前世此生

Android零基礎入門第2節:Android 系統架構和應用組件那些事

Android零基礎入門第3節:帶你一塊兒來聊一聊Android開發環境

Android零基礎入門第4節:正確安裝和配置JDK, 高富帥養成第一招

Android零基礎入門第5節:善用ADT Bundle, 輕鬆邂逅女神

Android零基礎入門第6節:配置優化SDK Manager, 正式約會女神

Android零基礎入門第7節:搞定Android模擬器,開啓甜蜜之旅

Android零基礎入門第8節:HelloWorld,個人第一趟旅程出發點

Android零基礎入門第9節:Android應用實戰,不懂代碼也能夠開發

Android零基礎入門第10節:開發IDE大升級,終於迎來了Android Studio

Android零基礎入門第11節:簡單幾步帶你飛,運行Android Studio工程

Android零基礎入門第12節:熟悉Android Studio界面,開始裝逼賣萌

Android零基礎入門第13節:Android Studio個性化配置,打造開發利器

Android零基礎入門第14節:使用高速Genymotion,跨入火箭時代

Android零基礎入門第15節:掌握Android Studio項目結構,揚帆起航

Android零基礎入門第16節:Android用戶界面開發概述

Android零基礎入門第17節:文本框TextView

Android零基礎入門第18節:輸入框EditText

Android零基礎入門第19節:按鈕Button

Android零基礎入門第20節:複選框CheckBox和單選按鈕RadioButton

Android零基礎入門第21節:開關組件ToggleButton和Switch

Android零基礎入門第22節:圖像視圖ImageView

Android零基礎入門第23節:圖像按鈕ImageButton和縮放按鈕ZoomButton

Android零基礎入門第24節:自定義View簡單使用,打造屬於你的控件

Android零基礎入門第25節:簡單且最經常使用的LinearLayout線性佈局

Android零基礎入門第26節:兩種對齊方式,layout_gravity和gravity大不一樣

Android零基礎入門第27節:正確使用padding和margin

Android零基礎入門第28節:輕鬆掌握RelativeLayout相對佈局

Android零基礎入門第29節:善用TableLayout表格佈局

Android零基礎入門第30節:兩分鐘掌握FrameLayout幀佈局

Android零基礎入門第31節:少用的AbsoluteLayout絕對佈局

Android零基礎入門第32節:新推出的GridLayout網格佈局

Android零基礎入門第33節:Android事件處理概述

Android零基礎入門第34節:Android中基於監聽的事件處理

Android零基礎入門第35節:Android中基於回調的事件處理

Android零基礎入門第36節:Android系統事件的處理

Android零基礎入門第37節:初識ListView

Android零基礎入門第38節:初識Adapter

Android零基礎入門第39節:ListActivity和自定義列表項

Android零基礎入門第40節:自定義ArrayAdapter

Android零基礎入門第41節:使用SimpleAdapter

Android零基礎入門第42節:自定義BaseAdapter

Android零基礎入門第43節:ListView優化和列表首尾使用

Android零基礎入門第44節:ListView數據動態更新

Android零基礎入門第45節:網格視圖GridView

Android零基礎入門第46節:列表選項框Spinner

Android零基礎入門第47節:自動完成文本框AutoCompleteTextView

Android零基礎入門第48節:可摺疊列表ExpandableListView

Android零基礎入門第49節:AdapterViewFlipper圖片輪播

Android零基礎入門第50節:StackView卡片堆疊

Android零基礎入門第51節:進度條ProgressBar

Android零基礎入門第52節:自定義ProgressBar炫酷進度條

Android零基礎入門第53節:拖動條SeekBar和星級評分條RatingBar

Android零基礎入門第54節:視圖切換組件ViewSwitcher

Android零基礎入門第55節:ImageSwitcher和TextSwitcher

Android零基礎入門第56節:翻轉視圖ViewFlipper

Android零基礎入門第57節:DatePicker和TimePicker選擇器

Android零基礎入門第58節:數值選擇器NumberPicker

Android零基礎入門第59節:經常使用三大Clock時鐘組件

Android零基礎入門第60節:日曆視圖CalendarView和定時器Chronometer

Android零基礎入門第61節:滾動視圖ScrollView

Android零基礎入門第62節:搜索框組件SearchView

Android零基礎入門第63節:值得借鑑學習的選項卡TabHost

Android零基礎入門第64節:揭開RecyclerView廬山真面目

Android零基礎入門第65節:RecyclerView分割線開發技巧

Android零基礎入門第66節:RecyclerView點擊事件處理

Android零基礎入門第67節:RecyclerView數據動態更新

Android零基礎入門第68節:RecyclerView添加首尾視圖

Android零基礎入門第69節:ViewPager快速實現引導頁

Android零基礎入門第70節:ViewPager打造TabHost效果

Android零基礎入門第71節:CardView簡單實現卡片式佈局

Android零基礎入門第72節:SwipeRefreshLayout下拉刷新

Android零基礎入門第73節:Activity建立和配置

Android零基礎入門第74節:Activity啓動和關閉

Android零基礎入門第75節:Activity狀態和生命週期

Android零基礎入門第76節:Activity數據保存和橫豎屏切換

Android零基礎入門第77節:Activity任務棧和啓動模式

Android零基礎入門第78節:四大組件的紐帶——Intent

相關文章
相關標籤/搜索