亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Android理解:顯式和隱式Intent

系統 1808 0
Intent是Android初學者比較難理解的一個東西。我這里以通俗易懂的語言和通俗易懂的代碼,讓初學者簡單感受一下Intent。

intent就是意圖的意思。Intent分兩種: 顯式(Explicit intent)和隱式(Implicit intent)


一、顯式(設置Component)

顯式,即直接指定需要打開的activity對應的類。
以下多種方式都是一樣的,實際上都是設置Component直接指定Activity類的顯式Intent,由MainActivity跳轉到SecondActivity:
1、構造方法傳入Component,最常用的方式

    Intent intent = new Intent(this, SecondActivity.class);
startActivity(intent);
  

2、setComponent方法

    ComponentName componentName = new ComponentName(this, SecondActivity.class);
// 或者ComponentName componentName = new ComponentName(this, "com.example.app016.SecondActivity");
// 或者ComponentName componentName = new ComponentName(this.getPackageName(), "com.example.app016.SecondActivity");

Intent intent = new Intent();
intent.setComponent(componentName);
startActivity(intent);
  

3、setClass/setClassName方法

    Intent intent = new Intent();

intent.setClass(this, SecondActivity.class);
// 或者intent.setClassName(this, "com.example.app016.SecondActivity");
// 或者intent.setClassName(this.getPackageName(), "com.example.app016.SecondActivity");
		
startActivity(intent);
  

顯式Intent通過Component可以直接設置需要調用的Activity類,可以唯一確定一個Activity,意圖特別明確,所以是顯式的。設置這個類的方式可以是Class對象(如SecondActivity.class),也可以是包名加類名的字符串(如"com.example.app016.SecondActivity")。這個很好理解,在應用程序內部跳轉界面常用這種方式。


二、隱式

隱式,即不是像顯式的那樣直接指定需要調用的Activity,隱式不明確指定啟動哪個Activity,而是設置Action、Data、Category,讓系統來篩選出合適的Activity。篩選是根據所有的<intent-filter>來篩選。

下面以Action為例:

AndroidManifest.xml文件中,首先被調用的Activity要有一個帶有<intent-filter>并且包含<action>的Activity,設定它能處理的Intent,并且category設為"android.intent.category.DEFAULT"。action的name是一個字符串,可以自定義,例如我在這里設成"abcdefg":

            <activity
            android:name="com.example.app016.SecondActivity">
            <intent-filter>
                <action android:name="abcdefg"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
  

然后,在MainActivity,才可以通過這個action name找到上面的Activity。下面兩種方式分別通過setAction和構造方法方法設置Action,兩種方式效果相同。

1、setAction方法

    Intent intent = new Intent();
intent.setAction("abcdefg");
startActivity(intent);
  

2、構造方法直接設置Action

    Intent intent = new Intent("abcdefg");
startActivity(intent);
  

通過設置Action字符串,表明自己的意圖,即我想干嘛,需要由系統解析,找到能夠處理這個Intent的Activity并啟動。比如我想打電話,則可以設置Action為"android.intent.action.DIAL"字符串,表示打電話的意圖,系統會找到能處理這個意圖的Activity,例如調出撥號面板。

有幾點需要注意:
1、
這個Activity其他應用程序也可以調用,只要使用這個Action字符串。這樣應用程序之間交互就很容易了,例如手機QQ可以調用QQ空間,可以調用騰訊微博等。
因為如此,為了防止應用程序之間互相影響,一般命名方式是包名+Action名,例如這里命名"abcdefg"就很不合理了,就應該改成"com.example.app016.MyTest"。
2、
當然,你可以在自己的程序中調用其他程序的Action。
例如可以在自己的應用程序中調用撥號面板:

    Intent intent = new Intent(Intent.ACTION_DIAL);
// 或者Intent intent = new Intent("android.intent.action.DIAL");
// Intent.ACTION_DIAL是內置常量,值為"android.intent.action.DIAL"
startActivity(intent);
  
Android理解:顯式和隱式Intent

3、一個Activity可以處理多種Action
只要你的應用程序夠牛逼,一個Activity可以看網頁,打電話,發短信,發郵件。。。當然可以。
Intent的Action只要是其中之一,就可以打開這個Activity。

            <activity
            android:name="com.example.app016.SecondActivity">
            <intent-filter>
                <!-- 可以處理下面三種Intent -->
                <action android:name="com.example.app016.SEND_EMAIL"/>
                <action android:name="com.example.app016.SEND_MESSAGE"/>
                <action android:name="com.example.app016.DAIL"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
  

對于一個Action字符串,系統有可能會找到一個Activity能處理這個Action,也有可能找到多個Activity,也可能一個都找不到。
1、找到一個Activity
很簡單,直接打開這個Activity。這個不需要解釋。
2、找到多個Acyivity
系統會提示從多個activity中選擇一個打開。
例如我們自己開發一個撥號面板應用程序,可以設置activity的<intent-filter>中Action name為"android.intent.action.DIAL",這樣別的程序調用撥號器時,用戶可以從Android自帶的撥號器和我們自己開發的撥號器中選擇。

            <activity
            android:name="com.example.app016.SecondActivity">
            <intent-filter>
                <action android:name="android.intent.action.DIAL"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
  
Android理解:顯式和隱式Intent
這也就是當Android手機裝上UC瀏覽器后,打開網頁時會彈出選擇Android自帶瀏覽器還是UC瀏覽器,可能都會遇到過。
3、一個Activity都沒找到
一個都沒找到的話,程序就會出錯,會拋出ActivityNotFoundException。比如隨便寫一個action字符串:

    Intent intent = new Intent("asasasas");
startActivity(intent);
  

Android理解:顯式和隱式Intent

所以應該注意try catch異常。

    Intent intent = new Intent("asasasas");
try
{
	startActivity(intent);
}
catch(ActivityNotFoundException e)
{
	Toast.makeText(this, "找不到對應的Activity", Toast.LENGTH_SHORT).show();
}
  
或者也可以使用Intent的resolveActivity方法判斷這個Intent是否能找到合適的Activity,如果沒有,則不再startActivity,或者可以直接禁用用戶操作的控件。
    Intent intent = new Intent(Intent.ACTION_DIAL);
if(intent.resolveActivity(getPackageManager()) == null)
{
    // 設置控件不可用
}
  

注意resolveActivity方法返回值就是顯式Intent上面講到的ComponentName對象,一般情況下也就是系統找到的那個Activity。但是如果有多個Activity可供選擇的話,則返回的Component是com.android.internal.app.ResolverActivity,也就是用戶選擇Activity的那個界面對應的Activity,這里不再深究。

    Intent intent = new Intent(Intent.ACTION_DIAL);
ComponentName componentName = intent.resolveActivity(getPackageManager());
if(componentName != null)
{
    String className = componentName.getClassName();
    Toast.makeText(this, className, Toast.LENGTH_SHORT).show();
}
  


作者:叉叉哥 轉載請注明出處: http://blog.csdn.net/xiao__gui/article/details/11392987



Android理解:顯式和隱式Intent


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: japanese乱子另类| 四虎永久在线精品视频播放 | 国产不卡视频在线 | 欧美日韩国产成人高清视频 | 黄色日本视频 | 亚洲国产精品乱码一区二区三区 | 男女免费视频 | 免费观看一级欧美大 | 亚洲高清色 | 关婷哪一级毛片高清免费看 | 91福利视频网站 | 日本不卡视频 | 国产精品福利久久 | 一区二区三区在线免费观看视频 | 欧美亚洲一区二区三区 | 国产一级毛片午夜 | 久久综合久久精品 | www色婷婷 | 伊人精品网 | 高清国产天干天干天干不卡顿 | 亚洲欧洲免费 | 91中文字幕在线观看 | 国产中文字幕在线免费观看 | 欧美三级久久 | 久草在线新免费 | 免费一级欧美片在线观免看 | 国产精品成在线观看 | 欧美一级aa免费毛片 | 精品一区二区久久 | 精品99视频 | 日日日夜夜操 | 玖玖在线播放 | 狠狠色丁香婷婷综合久久来 | 色综合精品 | 亚洲国产精品视频 | 91精品全国免费观看 | 夜夜爽天天狠狠九月婷婷 | 亚洲欧洲日韩国产一区二区三区 | 黄色毛片小视频 | 全免费午夜一级毛片一级毛 | 97av视频 |