您好,登錄后才能下訂單哦!
Android中的Intent
顯式intent:
使用Intent的intent(Contect packageContext,Class<?> cls)構(gòu)造器構(gòu)建一個intent,第一個參數(shù)Context 要求提供一個啟動活動的上下文,可以是當(dāng)前activity,第二個參數(shù)class則是要指定要啟動的目標(biāo)活動,構(gòu)建好intent后將intent傳入Activity類提供的startActivity()方法就可以啟動目標(biāo)活動。
案例:(忽略activity、button以及監(jiān)聽事件的創(chuàng)建過程)
FirstActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button)findViewById(R.id.but1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(Viewview) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
SecondActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
}
點(diǎn)擊第一個activity中的button會跳轉(zhuǎn)到第二個activity。
隱式intent:
隱式intent不明確指出要啟動哪一個活動,而是指定一系列更抽象的action和category交由系統(tǒng)找到適合的activity去啟動。
在secondactivity的<activity>標(biāo)簽下配置<intent-filter>可以指定當(dāng)前activity能夠響應(yīng)的action和category,在androidMainFest.xml中配置
<activity
android:name=".SecondActivity"
android:label="SecondActivity">
<intent-filter>
<action android:name="com.example.zhangwd.firstapplication.ACTION_START" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
在action中指定了當(dāng)前活動可以響應(yīng)com.example.zhangwd.firstapplication.ACTION_START這個action,<category>包含了一些附加信息,更精確地指明當(dāng)前活動能響應(yīng)的intent中還可能帶有的category。只有<action><category>內(nèi)容能夠同時匹配上intent指定的action和category時這個活動才能響應(yīng)該intent。
修改FirstActivity中的代碼:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button) findViewById(R.id.but1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent("com.example.zhangwd.firstapplication.ACTION_START");
//intent.addCategory("android.intent.category.DEFAULT")
//android.intent.category.DEFAULT是一種默認(rèn)的category,在調(diào)用startActivity()方法時會自動將此category加上
startActivity(intent);
}
});
}
Intent啟動其他程序的活動:
修改FirstActivity的代碼:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button)findViewById(R.id.but1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(Viewview) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
}
這次指定的action是Intent.ACTION_VIEW ,是android內(nèi)置的動作,常量值為android.intent.action.VIEW。setData()方法用于指定當(dāng)前intent正在操作的數(shù)據(jù),此數(shù)據(jù)需要使用Uri.parse()將一個網(wǎng)址字符串解析成一個Uri對象。
與此對應(yīng),我們可以在<intent-filter>中<data>標(biāo)簽,更準(zhǔn)確地表示當(dāng)前活動能夠響應(yīng)什么類型的數(shù)據(jù)。
android:scheme。用于指定數(shù)據(jù)的協(xié)議部分,如http。
android:host。用于指定數(shù)據(jù)的主機(jī)名部分,如www.baidu.com
android:port。用于指定數(shù)據(jù)的端口部分。
android:path。用于指定主機(jī)名和端口之后的部分。
android:mimeType。用于指定可處理的數(shù)據(jù)類型,可使用通配符。
只有data和intent攜帶的data一致時才能響應(yīng)該intent,一般<data>中不會指定過多。像瀏覽器的示例中只需指定scheme可以響應(yīng)所有http協(xié)議的intent。
如果我們再增加一個ThirdActivity,在androidMeanFest.xml中修改注冊信息:
<activity
android:name=".ThirdActivity"
android:label="ThirdActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/>
</intent-filter>
</activity>
在我們再點(diǎn)擊FirstActivity的but1時會彈出所有能響應(yīng)此intent的程序(browser、FirstApplication),選擇瀏覽器還會像之前一樣打開瀏覽器,選擇FirstAplication會打開ThiredActivity,但并不會加載網(wǎng)頁。所以真正項(xiàng)目中不要出現(xiàn)這種誤導(dǎo)用戶的行為。
除了http協(xié)議還可以指定其他協(xié)議,如:geo表示地理位置,tel表示撥打電話(intent.setData(Uri.parse("tel:10086")))。
向下一個活動傳遞數(shù)據(jù):
Intent中提供了一系列putExtra()方法的重載,可以將要傳遞的數(shù)據(jù)暫存到Intent中,啟動另一個activity后再將數(shù)據(jù)從intent中取出即可。
FirstActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button)findViewById(R.id.but1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(Viewview) {
String data = "Hello World";
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
intent.putExtra("extra_data",data);
startActivity(intent);
}
});
}
SecondActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
Log.d("SecondActivity",data);
}
如果傳遞的是布爾類型數(shù)據(jù)可以使用getBoolenExtra();
返回?cái)?shù)據(jù)給上一個activity:
Activity中有一個startActivityForResult()方法也用于啟動活動,但這個方法期望在活動銷毀時返回一個結(jié)果給上一個活動。
StartActivityForResult()接收兩個參數(shù),第一個參數(shù)還是intent第二個參數(shù)是請求碼,用于在之后的回調(diào)中判斷數(shù)據(jù)源的來源。
FirstActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.first_layout);
Button btn = (Button)findViewById(R.id.but1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(Viewview) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
}
});
}
SecondActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button btn2 = (Button)findViewById(R.id.button2);
setContentView(R.layout.second_layout);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(Viewview) {
Intent intent = getIntent();
intent.putExtra("data_extra","helloworld");
setResult(RESULT_OK,intent);
finish();
}
});
}
這里創(chuàng)建的intent只用于傳遞數(shù)據(jù),將要傳遞的數(shù)據(jù)保存發(fā)哦intent中后調(diào)用setResult()方法,這個方法接收兩個參數(shù),第一個參數(shù)是用于向上一個參數(shù)返回處理結(jié)果,一般使用RESULT_OK或RESULT_CANCELED這兩個值,第二個參數(shù)是intent,然后調(diào)用finish()銷毀當(dāng)前activity。
由于是使用startActivityForResult()方法啟動的SecondActivity,當(dāng)這個activity銷毀時會調(diào)用上一個活動的onActivityResult()方法,我們需要在FirstActivity中重寫此方法來獲取數(shù)據(jù)。
@Override
protected void onActivityResult(int requestCode,int resultCode, Intent data) {
switch (requestCode){
case 1:
if(RESULT_OK == resultCode){
String returnData =data.getStringExtra("data_extra");
Log.d("FirstActivity", returnData);
}
break;
default:
}
}
不增加按鈕,按下BACK按鈕也可以返回上一activity,只需要在SecondActivity中重寫onBackPressed()方法:
@Override
public void onBackPressed() {
Intent intent = getIntent();
intent.putExtra("data_extra","helloworld");
setResult(RESULT_OK,intent);
finish();
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。