您的位置:首页 > 其它

Intent基本用法

2015-09-30 22:47 295 查看

Intent基本用法

Intent是四大组件(Activity、Service、Broadcast Receiver、Content Provider)的纽带,它解决了Android应用各项组件的通信,它使得调用者与被调用者之间解耦。

Intent的主要属性有
action、data
,另外还有
category、type、component、extras


值得注意的是:

当隐式调用Intent时,将使用
action、type、category
来推断合理的组件启动。

type
是一个MIME类型,可以通过
data
推断出来,如果显式指出,则会禁止推断。

当指定了
component
属性时(显式调用Intent),其他属性都是可选的,也不会启用推断。

data
不是指传递的信息,而是
Uri
scheme
(如
http:
mailto:
)。

可以使用
extras
传递
Bundle
对象来传递信息。

Demo地址:https://github.com/Getnway/IntentDemo



显式和隐式调用

显式调用(Explicit Intents)是指通过
setComponent(ComponentName)
setClass(Context, Class)
来指定组件(
component
)的调用Intent方式。如在
MainActivity.java
中:

mBtnA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显示Intent
Intent intent = new Intent();
intent.setClass(MainActivity.this, AActivity.class);
startActivity(intent);
}
});


隐式调用(Implicit Intents )即不明确指定组件,而是靠Intent参数来推断出适合的组件。如:

AndroidManifest.xml
中添加了BActivity

<activity
android:name=".BActivity"
android:label="BActivity" >
<intent-filter>
<action android:name="com.luojiawei.intentdemo.action.B_ACTIVITY"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>


则可以在
MainActivity.java
通过以下代码来启动BActivity

mBtnB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//隐式Intent
Intent intent = new Intent();
intent.setAction("com.luojiawei.intentdemo.action.B_ACTIVITY");
intent.addCategory("android.intent.category.DEFAULT");
startActivity(intent);
}
});


学会使用隐式Intent后,我们就可以使用它来调用系统应用或其他应用,如:

打电话:

mBtnPhone.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//拨打电话10086
Intent intent = new Intent();
intent.setAction("android.intent.action.DIAL");
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}
});


回到主界面:

mBtnHome.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//隐式Intent
Intent intent = new Intent();
intent.setAction("android.intent.action.MAIN");
intent.addCategory("android.intent.category.HOME");
startActivity(intent);
}
});


通过Intent传递数据

向下一个活动传递数据

要通过Intent传递数据,则要使用Intent的另一个属性
extras
,可以通过调用
putExtra()
重载方法来实现。如在
MainActivity.java
中:

mBtnA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String data = "message_from_MainActivity";//待传送信息
//显式Intent
Intent intent = new Intent();
intent.setClass(MainActivity.this, AActivity.class);
intent.putExtra("my_data", data);//第一个参数为键值
startActivityForResult(intent, REQUEST_CODE);
}
});


AActivity.java
中获取数据:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);

Intent intent = getIntent();
String data = intent.getStringExtra("my_data");
mTextView = (TextView)findViewById(R.id.text_view);
mTextView.setText(data);

}




返回数据给上一个活动

要想返回数据给上一个活动,只要将原来的启动Activity代码
startActivity(Intent intent)
换为
startActivityForResult(Intent intent, int requestCode)
并重写方法
onActivityResult(int requestCode, int resultCode, Intent data)
即可。

MainActivity.java
中:

mBtnA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//显式Intent
Intent intent = new Intent();
startActivityForResult(intent, REQUEST_CODE);
}
});


并且重载
onActivityResult()
方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode,resultCode,data);
switch (requestCode){
case REQUEST_CODE:  //处理AActivity返回的数据
if(resultCode == Activity.RESULT_OK){
String returnData = data.getStringExtra("return_data");
mTextView.setText(returnData);
}
break;
default:
break;
}
}


AActivity.java
中:

//按下返回键,传递信息给上一个Activity
@Override
public void onBackPressed(){
String retrunData = "return_message_from_AActivity";
Intent intentReturn = new Intent();
intentReturn.putExtra("return_data", retrunData);
setResult(Activity.RESULT_OK, intentReturn);
finish();
}




Intent的更多应用

获取联系人

监听按钮

mBtnContact.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取联系人
Intent intent = new Intent();
intent.setAction("android.intent.action.GET_CONTENT");
intent.setType("vnd.android.cursor.item/phone");
startActivityForResult(intent, PICK_CONTACT);
}
});


重载onActivityForResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode,resultCode,data);
switch (requestCode){
case PICK_CONTACT:  //显示联系人姓名和号码
if(resultCode == Activity.RESULT_OK){
CursorLoader cursorLoader = new CursorLoader(MainActivity.this,data.getData(), null, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();
if(cursor != null && cursor.moveToFirst()){
String name = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.PhoneLookup.NUMBER));
mTextView.setText(name + " " + number);
}else{
mTextView.setText("请选择一个联系人");
}
}
break;
default:
break;
}
}


获取相册照片

监听按钮

mBtnPhoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//选择一张照片
Intent intent = new Intent();
intent.setAction("android.intent.action.GET_CONTENT");
intent.setType("image/*");
intent.addCategory("android.intent.category.OPENABLE");
startActivityForResult(intent, PICK_RESOURCE);
}
});


重载onActivityForResult()

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode,resultCode,data);
switch (requestCode){
case PICK_RESOURCE: //显示选择的照片
if (resultCode == Activity.RESULT_OK) {
try{
//使用ContentProvider通过URI获取原始图片
Bitmap photo = MediaStore.Images.Media.getBitmap(getContentResolver(),data.getData());
if(photo != null){
mImgView.setImageBitmap(photo);
}else{
mTextView.setText("请选择一张照片");
}
} catch (FileNotFoundException e) {
mTextView.setText("照片打开失败!请重试...");
e.printStackTrace();
} catch (IOException e) {
mTextView.setText("照片打开失败!请重试...");
e.printStackTrace();
}
}
break;
default:
break;
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: