一、手機(jī)安卓系統(tǒng)開發(fā)中的Intent是什么,作用是什么?
Android的應(yīng)用程序包括三大組件:Activity、Service、BroadcastReceiver,為了方便不同組件之間的交流通信,應(yīng)用程序就采用了一種統(tǒng)一的方式啟動(dòng)組件及傳遞數(shù)據(jù),即使用Intent。 Intent封裝了Android應(yīng)用程序需要啟動(dòng)某個(gè)組件的"意圖",Intent類的對(duì)象是組件間的通信載體,一個(gè)Intent對(duì)象就是一組信息,其包含接收Intent組件所關(guān)心的信息(如action 和 Data)和Android 系統(tǒng)關(guān)心的信息(如Category等)。也就是說(shuō),發(fā)送"意圖"的組件通過(guò)Intent對(duì)象所包含的內(nèi)容,來(lái)啟動(dòng)指定的(即Component屬性)或通過(guò)篩選(即Action&Category屬性)的某(些)組件,然后實(shí)施相應(yīng)的動(dòng)作(即Action屬性)并傳遞相應(yīng)的數(shù)據(jù)(即Data屬性)以便完成相應(yīng)的動(dòng)作。
二、手機(jī)安卓系統(tǒng)開發(fā)中的Intent的Component屬性
Component需要指定包名和類名唯一確定一個(gè)組件類,代碼如下:
intent=new Intent();
ComponentName com_name=new ComponentName(MainActivity.this,Component.class);
intent.setComponent(com_name);
展示結(jié)果的代碼:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_component);
ComponentName com_name=getIntent().getComponent();
TextView text=(TextView)findViewById(R.id.textView1);
text.setText("組件包名:"+com_name.getPackageName()+"\n組件類名:"+com_name.getClassName());
運(yùn)行截圖:
點(diǎn)擊第一個(gè)按鈕顯示運(yùn)行結(jié)果。
三、手機(jī)安卓系統(tǒng)開發(fā)中的Intent的Action、Category屬性
使用Action和Category需要在程序清單文件androidMinifest.xml文件中進(jìn)行配置,代碼如下:
<activity
android:name=".Action">
<intent-filter>
<action android:name="cn.wangbaiyuan.task5.action" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="cn.wangbaiyuan.category_action" />
</intent-filter>
</activity>
使用Action、category啟動(dòng)這個(gè)Activity的代碼為:
intent=new Intent();
intent.setAction("cn.wangbaiyuan.task5.action");
intent.addCategory("cn.wangbaiyuan.category_action");
展示結(jié)果的代碼:
setContentView(R.layout.activity_component);
TextView text=(TextView)findViewById(R.id.textView1);
text.setText("此activity由含有action和category的intent啟動(dòng)\nAction:"+getIntent().getAction()+"\ncategory:"+getIntent().getCategories());
截圖:
Intent的Action、category屬性
四、手機(jī)安卓系統(tǒng)開發(fā)中的Intent的Data、Type屬性
Data屬性通常用于向Action屬性提供操作的數(shù)據(jù),Data屬性接受一個(gè)Uri對(duì)象,一個(gè)Uri對(duì)象通過(guò)如下形式的字符串來(lái)表示:
content://www.aushadhiyoga.com/
tel:1880000000
冒號(hào)前面指定了數(shù)據(jù)的類型,后面的是數(shù)據(jù)部分。
Type屬性則用于明確指定Data屬性的數(shù)據(jù)類型或MIME類型,但是通常來(lái)說(shuō),當(dāng)Intent不指定Data屬性時(shí)Type屬性才會(huì)起作用,否則Android系統(tǒng)將會(huì)根據(jù)Data屬性值來(lái)分析數(shù)據(jù)的類型,所以無(wú)需指定Type屬性。
一旦為Intent同時(shí)指定了Action和Data屬性,那么Android將可根據(jù)指定的數(shù)據(jù)類型來(lái)啟動(dòng)特定的應(yīng)用程序,并對(duì)指定的數(shù)據(jù)執(zhí)行相應(yīng)的操作。
在我的代碼文件中我分別測(cè)試了5個(gè)用Activity和Data組合的情況,為五個(gè)按鈕分別設(shè)置一下監(jiān)聽器:
public OnClickListener scheme=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
// 只設(shè)置Intent的Data屬性
intent.setData(Uri.parse("lee://www.baidu.com:1234/test"));
startActivity(intent);
}
};
public OnClickListener schemeHostPort=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
// 只設(shè)置Intent的Data屬性
intent.setData(Uri.parse("lee://wangbaiyuan.cn:8888/test"));
startActivity(intent);
}};
public OnClickListener schemeHostPath=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
// 只設(shè)置Intent的Data屬性
intent.setData(Uri.parse("lee://wangbaiyuan.cn:1234/android"));
startActivity(intent);
}};
public OnClickListener schemeHostPortPath=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
// 只設(shè)置Intent的Data屬性
intent.setData(Uri.parse("lee://wangbaiyuan.cn:8888/android"));
startActivity(intent);
}};
public OnClickListener schemeHostPortPathType=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
// 同時(shí)設(shè)置Intent的Data、Type屬性
intent.setDataAndType(Uri.parse("lee://wangbaiyuan.cn:8888/android")
, "abc/xyz");
startActivity(intent);
}};
public OnClickListener systemActivity=new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
// 同時(shí)設(shè)置Intent的Data、Type屬性
intent.setData(Uri.parse("http://wangbaiyuan.cn"));
startActivity(intent);
}};
運(yùn)行截圖:
Intent的Data、Type屬性Intent的Data、Type屬性
五、手機(jī)安卓系統(tǒng)開發(fā)中的Intent創(chuàng)建Tab頁(yè)面:
代碼:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab);
TabHost tabhost=getTabHost();
tabhost.addTab(tabhost.newTabSpec("tab1")
.setIndicator("IT業(yè)界",getResources().getDrawable(R.drawable.ic_launcher))
.setContent(new Intent(this,webview.class)
.putExtra("url", "http://wangbaiyuan.cn/itindustry"))
);
tabhost.addTab(tabhost.newTabSpec("tab2")
.setIndicator("程序算法")
.setContent(new Intent(this,webview.class)
.putExtra("url", "http://wangbaiyuan.cn/code"))
);
tabhost.addTab(tabhost.newTabSpec("tab3")
.setIndicator("電腦技巧")
.setContent(new Intent(this,webview.class)
.putExtra("url", "http://wangbaiyuan.cn/computer-experience"))
);
tabhost.addTab(tabhost.newTabSpec("tab3")
.setIndicator("關(guān)于我")
.setContent(new Intent(this,webview.class)
.putExtra("url", "http://wangbaiyuan.cn/leave-message/about"))
);
}
運(yùn)行結(jié)果:
Intent創(chuàng)建tab頁(yè)面