對於Android Intent大家肯定不陌生,Intent顧名思義就是“意圖”的意思。其實這個“意圖”有點不好理解。其實簡單點就是我想要“幹什麼”。你比如說,我想要“去火車站”、我想要“啓動一個Activity”、我想要“啓動一個server”、我想要XXX都是意圖。Intent有顯式Intent和隱式Intent兩種情況。
那麼問題來了:
一.那到底什麼樣的Intent是顯式的Intent,什麼樣的Intent是隱式的Intent呢?
爲了回答這個問題,請看下面對於隱式Intent和顯式Intent的具體介紹
1 隱式Intent
說起隱式Intent就不得不先說在清單文件(AndroidManifest.xml)中的intent-filter。你隨便創建一個Android 項目都會在清單文件中看見intent-filter,顧名思義就是Intent的過濾器。而且一個Activity組件的聲明中,可以有多個intent-filter。當然也可以沒有intent-filter。
舉個例子如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--1個intent-filter-->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--沒有intent-filter-->
<activity android:name=".Main2Activity" />
<!--多個intent-filter-->
<activity android:name=".Main3Activity">
<intent-filter>
<action android:name="com.mytest.MyIntentAction" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="aa/bb"/>
</intent-filter>
<intent-filter>
<action android:name="com.mytest.MyIntentAction1" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="myIntent1" android:host="8080"/>
</intent-filter>
<intent-filter>
<action android:name="com.mytest.MyIntentAction2" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="myIntent2"/>
</intent-filter>
</activity>
</application>
</manifest>
講完了AndroidManifest.xml中的Intent-filter.就要看一下如何在代碼中一個隱式的Intent,去啓動一個組件。下面我們來看一個代碼例子,我創建了一個Android 項目,除了默認的MainActivity我又增加了兩個Activity:Main2Activity、Main3Activity。
其中Main2Activity由MainActivity啓動,暫時不看啓動Main2Activity的代碼,現在我們先看在Main2Activity中使用隱式的Intent啓動Main3Activity的代碼。根據AndroidManifest.xml中Main3Activity的聲明來看,有三個intent-filter可以啓動Main3Activity,所以我隨機選一個intent-filter進行Intent的設置就可以了。我選用第三個intent-filter來啓Main3Activity。
<intent-filter>
<action android:name="com.mytest.MyIntentAction2" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="myIntent2"/>
</intent-filter>
AndroidManifest.xml中的action中的內容和Data中的內容都是我隨便寫的,因爲在android默認的那些action和data的數據中也是一個字符串,所以我們可以設置其爲任意字符串。根據這個intent-filter我在Main2Activity.java中的代碼實現如下:
package com.mytest;
import android.content.Intent;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
//創建隱式Intent
Intent intent = new Intent();
//爲隱式Intent添加過濾Action,Data和Category的字段,
// 不是說必須這三個字段同時有,這個設置那些是根據清單文件中Main3Activity的某一個intent-filter確定的
intent.setAction("com.mytest.MyIntentAction2");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("myIntent2:" + 110));//後邊的110是隨便加的,暫時沒有什麼具體的意思,這就是他的一個用法
//啓動Main3Activity
startActivity(intent);
}
}
這就是使用隱式的Intent啓動組件。
2 顯式Intent
其實顯式Intent就很簡單了,我們直接來看代碼。我在MainActivity.java中使用顯式Intent啓動Main2Activity,代碼如下
package com.mytest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//創建顯示Intent
Intent intent = new Intent(getApplicationContext(),com.mytest.Main2Activity.class);
//啓動Activity
startActivity(intent);
}
}
這就是顯式的Intent去啓動組件。
總的一句話,如果創建Intent的時候,明確指出了要啓動的class的名字,就是顯示Intent。如果沒有明確的指出要啓動的class的名,而是通過設置intent的過濾字段啓動class,就是隱式Intent.
二.什麼時候用顯示Intent,什麼時候用隱式Itent呢?
一句話:當你啓動自己寫的同一個APP中的Activity時使用顯示Intent,當你要啓動其他人寫APP中的Activity時使用隱式Intent。