Activity(活动)之Intent(意图)(显式与隐式)的使用
Intent(意圖)是Android中各個組件之間進行交互的一種重要方式,它不僅可以指明當前組件想要執(zhí)行的動作,還可以在不同組件之間傳遞數據。Intent一般可以用于啟動活動、啟動服務以及發(fā)送廣播,發(fā)送通知等場景,Intent大致可以分為兩種:顯式Intent和隱式Intent,下面我們先看一下顯式Intent如何使用。
Intent有多個構造函數的重載,其中一個是Intent(Context packageContext,Class<?> cls)。這個構造函數接受兩個參數,第一個參數Context要求提供一個啟動活動的上下文,第二個參數Class則是指定想要啟動的目標活動,通過這個構造函數就可以構建出Intent的“意圖”。然后我們應該怎么使用這個Intent呢?Activity類中提供了一個startActivity()方法,這個方法是專門用于啟動活動的,他接受一個Intent參數,這里我們將構建好的Intent傳入startActivity()方法中就可以啟動目標活動了。
具體實現:
首先在res/layout/ activity_main.xml文件中添加兩個Button控件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:id="@+id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="顯示Intent"android:textAllCaps="false" /><Buttonandroid:id="@+id/btn2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="隱式Intent"android:textAllCaps="false" /> </LinearLayout>其次再MainActivity.java中聲名控件,初始化控件,為控件設置點擊監(jiān)聽事件,通過switch? case語句來判斷點擊的是哪個button按鈕,具體是通過判斷布局文件中設置好的Button id來監(jiān)聽的。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btn1, btn2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {btn1 = (Button) findViewById(R.id.btn1);btn2 = (Button) findViewById(R.id.btn2);btn1.setOnClickListener(this);btn2.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn1://這里用來寫點擊btn1按鈕之后需要進行的具體操作break;case R.id.btn2://這里用來寫點擊btn2按鈕之后需要進行的具體操作break;default:break;}} }這里為了實現Activity之間的切換,我們需要再創(chuàng)建一個SecondActivity.java,并為其綁定一個activity_second.xml文件,這里我們就使用AS自動一鍵創(chuàng)建Activity的功能。具體步驟請看下圖
Finish.之后等待一會,你的第二個Activity就創(chuàng)建好了。
接下來打開activity_second.xml文件,修改一下代碼
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="This is the SecondActivity."android:textSize="20sp" /> </LinearLayout>?
顯式Intent:
這個時候我們只需要在MainActivity.java中,btn1的點擊監(jiān)聽事件中加2行代碼就可以實現Activity之間的跳轉了,代碼如下。
@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn1://這里用來寫點擊btn1按鈕之后需要進行的具體操作Intent intent=new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);break;case R.id.btn2://這里用來寫點擊btn2按鈕之后需要進行的具體操作break;default:break;}}這個時候我們就可以運行一個我們的程序了,看一看是什么效果,點擊顯示Intent按鈕,會跳轉到SecondActivity,注意此時點擊隱式Intent是沒反應的,因為我們并沒有寫,隱式Intent點擊監(jiān)聽后的處理。
以上就是顯式Intent的具體用法,代碼其實就1行。
調用startActivity()方法,參數傳入Intent實例就行了。
startActivity(new Intent(MainActivity.this,SecondActivity.class));?
?
隱式Intent:
相比于顯示Intent,隱式Intent則含蓄了許多,他并不明確指出我們想要啟動哪一個活動,而是指定了一系列更為抽象的action和category等信息,然后交由系統(tǒng)去分析這個Intent,并幫我們找出合適的活動去啟動。那么什么叫做合適的活動去啟動呢?簡單來說就是可以響應我們這個隱式Intent的活動,那么目前SecondActivity可以響應什么樣的隱式Intent呢?額,現在好像還什么都響應不了,不過很快就會有了。通過在<activity>標簽下配置<intent-filter>的內容,可以指定當前活動能夠響應的action和category,打開AndroidManifest.xml,添加如下代碼:
<activity android:name=".SecondActivity"><intent-filter><action android:name="com.example.activitytest.ACTION_START"/><category android:name="android.intent.category.DEFAULT"/></intent-filter> </activity>在<action>標簽中我們指明了當前活動可以響應com.example.activitytest.ACTION_START這個action,而<category>標簽則包含了一些附加信息,更精確地指明了當前的活動能夠響應的Intent中還可能帶有的category。只有<action>和<category>中的內容能夠匹配上Intent中指定的action和category時,這個活動才能響應該Intent。
在MainActivity.java中,btn2的點擊監(jiān)聽事件中加2行代碼就可以實現Activity之間的隱式Intent跳轉了,代碼如下。
@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn1://這里用來寫點擊btn1按鈕之后需要進行的具體操作Intent intent=new Intent(MainActivity.this,SecondActivity.class);startActivity(intent);break;case R.id.btn2://這里用來寫點擊btn2按鈕之后需要進行的具體操作Intent intent1=new Intent("com.example.activitytest.ACTION_START");startActivity(intent1);break;default:break;}} Intent intent1=new Intent("com.example.activitytest.ACTION_START");startActivity(intent1);可以看到我們使用了Intent的另一個構造函數,直接將action的字符串傳了進去,表明我們想要啟動能夠響應com.example.activitytest.ACTION_START這個action的活動。那前面不是說要<action>和<category>同時匹配上才能響應的嗎?怎么沒看到哪里有指定category呢?因為android.intent.category.DEFAULT是一種默認的category,在調用startActivity()方法的時候會自動將這個category添加到Intent中。
重新運行一下程序,點擊隱式Intent的按鈕,我們發(fā)現界面跳轉到了SecondActivity界面,效果如下:
不過此次我們使用的是默認的category,如果我們希望使用自定義的category,可以使用Intent類中的addCategory方法
來主動添加category,與此同時Manifest中也要添加一行<category>標簽,
代碼如下
Intent intent1=new Intent("com.example.activitytest.ACTION_START"); intent1.addCategory("com.example.activitytest.MY_CATEGORY"); startActivity(intent1); <intent-filter><action android:name="com.example.activitytest.ACTION_START"/><category android:name="android.intent.category.DEFAULT"/><category android:name="com.example.activitytest.MY_CATEGORY"/></intent-filter>再運行一次程序,同樣點擊隱式Intent,效果一樣。
顯式Intent與隱式Intent的基本使用方法就是這么的簡單,是不是很easy呢,后面我還會總結一下Intent的其它使用方式。
?
總結
以上是生活随笔為你收集整理的Activity(活动)之Intent(意图)(显式与隐式)的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初识Android四大组件之一Activ
- 下一篇: 使用隐式Intent打开系统浏览器的百度