使用Intent啟動(dòng)系統(tǒng)內(nèi)的程序
使用隱式Intent印叁,不僅可以啟動(dòng)自己程序內(nèi)的活動(dòng)菜皂,還可以啟動(dòng)其他程序中的活動(dòng)协饲。
舉個(gè)例子,這里在當(dāng)前Activity中通過(guò)Intent啟動(dòng)系統(tǒng)的瀏覽器來(lái)打開網(wǎng)頁(yè)乘凸,其關(guān)鍵代碼如下:
public class MainActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
});
}
}
啟動(dòng)程序會(huì)發(fā)現(xiàn)程序打開了系統(tǒng)瀏覽器,并且打開了百度的首頁(yè)累榜,如下圖所示营勤,這是為什么呢灵嫌?首先,上面程序中指定了Intent的action為Intent.ACTION_VIEW葛作,這是一個(gè)Android系統(tǒng)內(nèi)置的動(dòng)作寿羞,其常量值為android.intent.action.VIEW,然后通過(guò)Uri.parse()方法赂蠢,將一個(gè)網(wǎng)址字符串解析成一個(gè)Uri對(duì)象绪穆,再調(diào)用Intent的setData()方法將這個(gè)Uri對(duì)象傳遞進(jìn)去。
與此對(duì)應(yīng)虱岂,我們還可以在<intent-filter>中再配置一個(gè)<data>標(biāo)簽玖院,用于更精確的指定當(dāng)前活動(dòng)可以響應(yīng)什么類型的數(shù)據(jù)。只有<data>標(biāo)簽中的內(nèi)容與Intent中攜帶的Data完全一致時(shí)第岖,當(dāng)前活動(dòng)才能響應(yīng)Intent难菌,不過(guò)在<data>標(biāo)簽中不會(huì)指定過(guò)多的內(nèi)容,如上面的瀏覽器中蔑滓,其實(shí)只需要指定android:scheme為http郊酒,就可以響應(yīng)http協(xié)議的Intent了。
使用Intent向下一個(gè)活動(dòng)傳遞數(shù)據(jù)
Intent提供了一系列putExtra()方法的重載键袱,可以把數(shù)據(jù)暫存在Intent中燎窘,啟動(dòng)另一個(gè)Activity后,只需要把數(shù)據(jù)從Intent讀出來(lái)就可以了杠纵,例如我們可以把一個(gè)字符串從一個(gè)Activity中傳遞到另一個(gè)Activity中:
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String data = "Hello SecondActivity";
Intent intent = new Intent(FirstActivity.this,
SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
}
});
這里通過(guò)顯式Intent啟動(dòng)SecondActivity荠耽,并通過(guò)putExtra()方法傳遞了一個(gè)字符串。注意這里 putExtra()方法接收兩個(gè)參數(shù)比藻,第一個(gè)參數(shù)是鍵铝量,用于后面從 Intent中取值,第二個(gè)參數(shù)才是真正要傳遞的數(shù)據(jù)银亲。
我們?cè)诘诙€(gè)Activity中可以將第一個(gè)Activity傳入的數(shù)據(jù)取出慢叨,代碼如下:
public class SecondActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
textView = (TextView) findViewById(R.id.textView);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");
textView.setText(data);
}
}
上述代碼中通過(guò)getIntent方法獲得啟動(dòng)SecondActivity的Intent,然后調(diào)用getStringExtra()方法务蝠,傳入相應(yīng)的鍵值來(lái)獲得相應(yīng)的數(shù)據(jù)拍谐。
返回?cái)?shù)據(jù)給上一個(gè)活動(dòng)
Activity中可以通過(guò)startActivityForResult()方法來(lái)啟動(dòng)Activity,但是這個(gè)方法期望在活動(dòng)銷毀的時(shí)候返回一個(gè)結(jié)果給上一個(gè)活動(dòng)馏段。
startActivity()方法需要兩個(gè)參數(shù)轩拨,第一個(gè)參數(shù)還是Intent,而第二個(gè)參數(shù)則表示請(qǐng)求碼院喜,用于在之后的回調(diào)中判斷數(shù)據(jù)的來(lái)源亡蓉,startActivity()的使用方法如下:
首先,在MainActivity中使用startActivityForResult()方法啟動(dòng)SecondActivity喷舀,代碼如下:
public class MainActivity extends AppCompatActivity {
private Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,
SecondActivity.class);
startActivityForResult(intent, 1);
}
});
}
}
緊接著砍濒,我們?cè)赟econdActivity中又創(chuàng)建了一個(gè)Intent淋肾,不過(guò)這個(gè)Intent僅僅用來(lái)傳遞數(shù)據(jù),把想要傳遞的數(shù)據(jù)放入Intent中之后爸邢,調(diào)用setResult()方法用來(lái)向上一個(gè)活動(dòng)返回?cái)?shù)據(jù)樊卓,setResult()方法接收兩個(gè)參數(shù) ,第 一個(gè) 參數(shù) 用于 向上一 個(gè)活 動(dòng)返 回處 理結(jié)果 杠河,一 般只 使用 RESULT_OK 或RESULT_CANCELED 這兩個(gè)值碌尔,第二個(gè)參數(shù)則是把帶有數(shù)據(jù)的 Intent 傳遞回去,然后調(diào)用了 finish()方法來(lái)銷毀當(dāng)前活動(dòng)感猛,這部分代碼如下:
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.second_layout);
Button button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello MainActivity");
setResult(RESULT_OK, intent);
finish();
}
});
}
}
由于我們是使用startActivityForResult()方法來(lái)啟動(dòng)SecondActivity的七扰,在SecondActivity被銷毀之后會(huì)回調(diào)上一個(gè)Activity的onActivityResult()方法,因此需要在第一個(gè)活動(dòng)中重寫這個(gè)方法陪白,代碼如下:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if(resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return");
Log.d("MainActivity", returnedData);
}
break;
default:
}
}
整個(gè)程序的運(yùn)行結(jié)果如下圖:
總結(jié):
使用Intent可以啟動(dòng)啟動(dòng)系統(tǒng)內(nèi)的程序颈走,此時(shí)在新建Intent的時(shí)候往往給Intent傳入一個(gè)參數(shù)action,例如Intent.ACTION_VIEW咱士,該參數(shù)表示一個(gè)查看動(dòng)作立由,例如查看網(wǎng)頁(yè)等等,創(chuàng)建完成之后可以使用Intent的setData()方法將一個(gè)網(wǎng)址字符串通過(guò)Uri.prase()方法將網(wǎng)址字符串解析成一個(gè)Uri對(duì)象序厉;
可以使用Intent的putExtra()方法傳遞數(shù)據(jù)锐膜,該方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)是鍵弛房,用于后面從Intent中取值道盏,第二個(gè)參數(shù)是希望通過(guò)Intent傳遞的數(shù)據(jù);
3.在Intent啟動(dòng)的Activity中通過(guò)getIntent()方法可以獲得啟動(dòng)這個(gè)Activity的Intent文捶,然后調(diào)用getStringExtra()結(jié)合鍵值就可以得到傳遞的數(shù)據(jù)荷逞,當(dāng)然此類方法還有很多,例如getIntExtra()等等粹排;
4.Intent還可以用來(lái)返回?cái)?shù)據(jù)給上一個(gè)Activity种远,此時(shí)在啟動(dòng)另一個(gè)Activity時(shí)使用startActivityForResult()方法,在另一個(gè)Activity中創(chuàng)建一個(gè)新的Intent顽耳,并綁定相應(yīng)的數(shù)據(jù)后通過(guò)setResult()方法返回?cái)?shù)據(jù)坠敷,在另一個(gè)Activity被銷毀之后會(huì)回調(diào)原來(lái)Activity中的onActivityResult()方法,在該方法中進(jìn)行相應(yīng)的處理