安卓開發之Intent使用介紹(顯式Intent和隱式Intent)
Intent
Intent是 Android程序中各組件之間進行交互的一種重要方式,它不僅可以指明當前組件想要執行的動作,還可以在不同組件之間傳遞數據。Intent一般可被用于啟動活動、啟動服務以及發送廣播等場景,這次我們運用在啟動活動上面。
Intent大致可以分為兩種:顯式Intent和隱式Intent,我們先來看一下顯式Intent如何使用。
首先我創建了2個活動.
1.FirstActivity(第一個活動)
package activitytest.example.administrator.activitytest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class FirstActivity extends AppCompatActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.add_item:
Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
break;
case R.id.remove_item:
Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
break;
default:
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
return true;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button button1 = (Button) findViewById(R.id.button_1);
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
}
第一個活動的配置文件(first_layout.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:orientation="vertical">
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 1" />
</LinearLayout>
2.SecondActivity(第二個活動)
package activitytest.example.administrator.activitytest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
}
}
第二個活動的配置文件(second_layout.xml):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/second_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="activitytest.example.administrator.activitytest.SecondActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button 2"/>
</LinearLayout>
</RelativeLayout>
總的配置文件(AndroidManifest.xml):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="activitytest.example.administrator.activitytest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".FirstActivity"
android:label="This is FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SecondActivity"></activity>
</application>
</manifest>
Intent有多個構造函數的重載,其中一個是Intent(Context packageContext,Class<?>cls)。這個構造函數接收兩個參數,第一個參數Context要求提供一個啟動活動的上下文,第二個參數class 則是指定想要啟動的目標活動,通過這個構造函數就可以構建出Intent的”意圖”。然后我們應該怎么使用這個Intent呢? Activity 類中提供了一個startActivity()方法,這個方法是專門用于啟動活動的,它接收一個Intent參數,這里我們將構建好的Intent傳入startActivity()方法就可以啟動目標活動了。
FirstActivity 中按鈕的點擊事件的代碼如下所示:
@Override
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
我們首先構建出了一個Intent,傳入 FirstActivity.this 作為上下文,傳入SecondActivity.class 作為目標活動,這樣我們的“意圖”就非常明顯了,即在FirstActivity這個活動的基礎上打開SecondActivity這個活動。然后通過startActivity()方法來執行這個Intent.
運行結果:
這時候已經切換到了第二個應用.
可以看到,我們已經成功啟動SecondActivity這個活動了。如果你想要回到上一個活動怎么辦呢?很簡單,按下Back鍵就可以銷毀當前活動,從而回到上一個活動了。
使用這種方式來啟動活動,Intent的“意圖”非常明顯,因此我們稱之為顯式 Intent。
隱式Intent
相比于顯式Intent,隱式Intent則含蓄了許多,它并不明確指出我們想要啟動哪一個活動,而是指定了一系列更為抽象的action和 category 等信息,然后交由系統去分析這個Intent,并幫我們找出合適的活動去啟動。
什么叫作合適的活動呢?簡單來說就是可以響應我們這個隱式Intent的活動,那么目前SecondActivity可以響應什么樣的隱式Intent呢?額,現在好像還什么都響應不了,不過很快就會有了。
通過在標簽下配置的內容,可以指定當前活動能夠響應的action和 category,打開AndroidManifest.xml,添加如下代碼:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="activitytest.example.administrator.activitytest.ACTION_START"></action>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
!這里的activitytest.example.administrator.activitytest是活動所在的地址
在標簽中我們指明了當前活動可以響應activitytest.example.administrator.activitytest.ACTION_START這個action,而標簽則包含了一些附加信息,更精確地指明了當前的活動能夠響應的Intent中還可能帶有的category。只有和中的內容同時能夠匹配上Intent中指定的action和 category時,這個活動才能響應該Intent。
修改FirstActivity 中按鈕的點擊事件,代碼如下所示:
@Override
public void onClick(View v) {
Intent intent = new Intent("activitytest.example.administrator.activitytest.ACTION_START");
startActivity(intent);
}
可以看到,我們使用了Intent 的另一個構造函數,直接將action的字符串傳了進去,表明我們想要啟動能夠響應activitytest.example.administrator.activitytest.ACTION_START這個action的活動。那前面不是說要和同時匹配上才能響應的嗎?怎么沒看到哪里有指定category呢?這是因為android.intent.category.DEFAULT是一種默認的category,在調用startActivity()方法的時候會自動將這個category添加到 Intent中。
重新運行程序,在FirstActivity 的界面點擊一下按鈕,你同樣成功啟動SecondActivity了。不同的是,這次你是使用了隱式Intent 的方式來啟動的,說明我們在標簽下配置的action和 category 的內容已經生效了!
運行結果:
每個Intent中只能指定一個action,但卻能指定多個category。目前我們的Intent中只有一個默認的category,那么現在再來增加一個吧。
修改FirstActivity中按鈕的點擊事件,代碼如下所示:
public void onClick(View v) {
Intent intent = new Intent("activitytest.example.administrator.activitytest.ACTION_START");
intent.addCategory("activitytest.example.administrator.activitytest.MY_CATEGORY");
startActivity(intent);
}
});
現在我們在AndroidManifest.xml的中再添加一個category的聲明,如下所示:
<activity android:name=".SecondActivity">
<intent-filter>
<action android:name="activitytest.example.administrator.activitytest.ACTION_START"></action>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="activitytest.example.administrator.activitytest.MY_CATEGORY"/>
</intent-filter>
</activity>
再次重新運行程序,你就會發現一切都正常了。
謝謝大家觀看,周某不才, 剛剛學Android開發, 如有問題和建議,歡迎指出來。
望君與吾共進
智能推薦
隱式Intent
啟動自己程序內的Activity 不明確指出啟動哪一個活動,指定一系列action和category,信息交給系統處理,找到適合啟動的活動。 只有當action和category中的內容同時匹配Intent中指定的action和category時,Intent才能被啟動。 AndroidManifest.xml 因為android.intent.category.DEFAULT是默認的catego...
Android Studio(五)CriminalIntent—隱式intent、使用intent拍照
Android Studio(五)CriminalIntent—5.隱式intent、6.使用intent拍照 隱式intent 使用intent拍照 Android編程權威指南 第3版 第15、16章 學習總結 代碼來源于《Android編程權威指南》第三版 14-4F-8A-A2-D1-90 60 7 14-4F-8A-A2-D1-90 60 8 以下操作基于上一個blog已完成的...
Android Intent 隱式與顯式意圖
意圖的應用場景:一般開啟系統的應用用隱式意圖 開啟自己應用的界面用顯示意圖 1,隱式意圖 :通過指定一組動作和數據來開啟頁面 【1】注意事項,當setdata方法和settype方法清除效果,我們是使用intent.setDataAndType方法 ★setType 方法 會自動清楚set...
Intent詳解(一)----顯、隱式開啟Activity
Intent開啟Activity 1.Intent的作用 Intent是一個可以消息傳遞對象,可以通過它來進行組件之間的信息傳遞。Intent主要有以下三個作用: l 開啟一個activity l 開啟一個service l 發送廣播消息 本篇主要介紹Intent如何開啟一個Activity。 Intent可以啟動Activity,啟動的方式有顯式啟動和隱式啟動...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...