您的位置:首页 > 其它

四大组件-----Intent

2016-11-21 00:00 316 查看
摘要: Intent的详解

Intent基础

1.跳转

1.1显式意图

Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
或
Intent intent = new Intent();
intent.setClass(FirstActivity.this,SecondActivity.class);
startActivity(intent);
或
Intent intent = new Intent();
intent.setComponent(new ComponentName(FirstActivity.this,SecondActivity.class));
startActivity(intent);
或
Intent mIntent = new Intent();
ComponentName comp= new ComponentName("com.android.camera","com.android.camera.Camera");//包名,类名
mIntent.setComponent(comp);
mIntent.setAction("android.intent.action.VIEW"); //Intent.ACTION_VIEW
startActivity(mIntent);

1.2隐式意图

public class FirstActivity extends Activity {

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

public void clickMe(View v){
Intent intent = new Intent();
intent.setAction("com.sina.www");
startActivity(intent);
}
}
<activity android:name="com.smart.SecondActivity">
<intent-filter >
<action android:name="com.sina.www"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>


2.传递数据

2.1Intent传递基本类型数据

//发送方
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
intent.putExtra(“name”,”Jack”);
intent.putExtra(“age”,22);
startActivity(intent);
//接收方
Intent intent = getIntent();
String name = intent.getStringExtra(“name”);
int age = intent.getIntExtra(“age”,0);
或
//发送方
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name",”Jack”);
intent.putExtras(bundle);
startActivity(intent);
//接收方
Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");

2.2Intent传递对象类型

Android 中自定义的对象序列化的问题有两个选择Parcelable、Serializable.

序列化原因:

1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象.

选择原则:

1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类.
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC.
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下.尽管Serializable效率低点,也不提倡用,但在这种情况下,还是建议你用Serializable .

传递Serializable对象

//发送方
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name",name);
bundle.putSerializable(“person”,person); //person必须实现Serializable接口
intent.putExtras(bundle);
//intent.putExtra("person", person);
startActivity(intent);
//接收方
Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");
Person person = (Person)bundle.getSerializableExtra("person");//获取Person对象

传递Parcelable对象

Parcelable接口是Android特定序列化接口,它比Serializable接口更有效,通常用于Binder和AIDL场景中.

Parcelable接口序列化的数据可以存储在Parcel中,继承Parcelable接口的类必须具有一个CREATOR的静态变量.

public class Mp3Info implements Parcelable {

private String id;
private String mp3Name;
private String mp3Size;
private String lrcName;
private String lrcSize;

public Mp3Info() {
super();
}

public Mp3Info(String id, String mp3Name, String mp3Size, String lrcName,
String lrcSize) {
super();
this.id = id;
this.mp3Name = mp3Name;
this.mp3Size = mp3Size;
this.lrcName = lrcName;
this.lrcSize = lrcSize;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getMp3Name() {
return mp3Name;
}

public void setMp3Name(String mp3Name) {
this.mp3Name = mp3Name;
}

public String getMp3Size() {
return mp3Size;
}

public void setMp3Size(String mp3Size) {
this.mp3Size = mp3Size;
}

public String getLrcName() {
return lrcName;
}

public void setLrcName(String lrcName) {
this.lrcName = lrcName;
}

public String getLrcSize() {
return lrcSize;
}

public void setLrcSize(String lrcSize) {
this.lrcSize = lrcSize;
}

public static final Parcelable.Creator<Mp3Info> CREATOR = new Creator<Mp3Info>() {
@Override
public Mp3Info createFromParcel(Parcel source) {
Mp3Info mp3Info = new Mp3Info();
mp3Info.id = source.readString();
mp3Info.mp3Name = source.readString();
mp3Info.mp3Size = source.readString();
mp3Info.lrcName = source.readString();
mp3Info.lrcSize = source.readString();
return mp3Info;
}

@Override
public Mp3Info[] newArray(int size) {
return new Mp3Info[size];
}

};

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(mp3Name);
dest.writeString(mp3Size);
dest.writeString(lrcName);
dest.writeString(lrcSize);
}

@Override
public String toString() {
return "Mp3Info [id=" + id + ", lrcName=" + lrcName + ", lrcSize="
+ lrcSize + ", mp3Name=" + mp3Name + ", mp3Size=" + mp3Size
+ "]";
}
}


3. 返回数据

3.1Intent返回数据

//发送方
Intent intent = new Intent();
intent.setClass(FirstActivity.this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name",name);
intent.putExtras(bundle);
startActivityForResult(intent,0);

protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
switch(resultCode)
{
case RESULT_OK:
Bundle bundle = data.getExtras();
String temp = bundle.getString("my");
editText.setText(temp);
break;
default:
break;
}
}

//接收方
Intent intent = new Intent();//数据是使用Intent返回
intent.putExtra("my", "我返回的数据");//把返回数据存入Intent
setResult(RESULT_OK, intent);//设置返回状态和数据
finish();//关闭当前Activity,调用onActivityResult方法

用startActivityForResult跳转到子activity,子activity可以返回结果给父activity.

调用startActivityForResult(intent, REQUEST_CODE);可以设置请求码,可以根据不同的请求码做不同的处理,子activity处理完之后执行setResult(RESULT_CODE, intent);finish();返回到父activity,可以设置返回码.子activity处理完之后会回调父activity的protected void onActivityResult(int requestCode, int resultCode, Intent data)方法,对返回的结果进行处理

请求码

使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,我们需要为startActivityForResult()方法传入一个请求码(第二个参数).请求码的值是根据业务需要由自已设定,用于标识请求来源.例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法.在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做

@Override  public void onCreate(Bundle savedInstanceState) {
....
button1.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1);
}});

button2.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2);
}});

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:
//来自按钮1的请求,作相应业务处理
case 2:
//来自按钮2的请求,作相应业务处理
}
}
}

结果码

在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法.为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):

public class ResultActivity extends Activity {
.....
ResultActivity.this.setResult(1, intent);
ResultActivity.this.finish();
}
public class NewActivity extends Activity {
......
NewActivity.this.setResult(2, intent);
NewActivity.this.finish();
}
public class MainActivity extends Activity { // 在该Activity会打开ResultActivity和NewActivity
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(resultCode){
case 1:
// ResultActivity的返回数据
case 2:
// NewActivity的返回数据
}
}
}


4.其它用法

4.1网络相关

在Intent中,目前仅支持GET方式提交数据,为了打开网址,采用的action为ACTION_VIEW

//打开网址
Uri uri = Uri.parse("http://google.com.hk");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

//搜索某个应用
Uri uri = Uri.parse("market://search?q=pname:pkg_name");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

//网络中搜索相关信息
Intent it = new Intent(Intent.ACTION_WEB_SEARCH);
It.putExtra(SearchManager.QUERY,”android123”);
startActivity(it);

<uses-permission android:name="android.permission.INTERNET" />

4.2地图相关

//显示Google地图
Uri uri = Uri.parse("geo:38.899533,-77.036476");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

//路径规划
Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

4.3电话相关

//进入电话簿
Intent intent = new Intent(Intent.ACTION_VIEW);
Intent.setData(People.CONTENT_URI);
startActivity(intent);

//叫出拨号程序
Uri uri = Uri.parse(“tel:10086”);
Intent it = new Intent(“android.intent.action.DIAL”,uri);
startActivity(it);

//直接打电话出去
Uri uri = Uri.parse("tel:10086");
Intent it = new Intent(Intent.ACTION_CALL, uri);
startActivity(it);

<uses-permission android:name="android.permission.CALL_PHONE" />

//调用通话记录
Intent callButtonIntent = new Intent(Intent.ACTION_CALL_BUTTON);
startActivity(callButtonIntent);

4.4消息相关

//查看短信
Intent it = new Intent(Intent.ACTiON_VIEW);
it.setType(“vnd.android-dir/mms-sms”);
startActivity(it);

<uses-permission android:name="android.permission.READ_SMS"/>

//调用短信程序
Intent it = new Intent(Intent.ACTION_VIEW, uri);
it.putExtra("sms_body", "The SMS text");
it.setType("vnd.android-dir/mms-sms");
startActivity(it);

//传送消息
Uri uri = Uri.parse("smsto:10086");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
it.putExtra("sms_body", "The SMS text");
startActivity(it);

<uses-permission android:name="android.permission.WRITE_SMS"/>

//发送 MMS
Uri uri = Uri.parse("content://media/external/images/media/23");
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra("sms_body", "some text");
it.putExtra(Intent.EXTRA_STREAM, uri);
it.setType("image/png");
startActivity(it);

//  android.telephony.SmsManager;
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// 发送号码输入框
EditText mobileText = (EditText) findViewById(R.id.mobile);
String mobile = mobileText.getText().toString();
EditText contentText = (EditText) findViewById(R.id.content);
// 短信内容输入框
String content = contentText.getText().toString();
SmsManager smsManager = SmsManager.getDefault();
// 按照一条短信,最大容量拆分成多条短信
List<String> divideContents = smsManager.divideMessage(content);
for (String text : divideContents) {
smsManager.sendTextMessage(mobile, null, text, null, null);
}
}
});

-- destinationAddress:目标电话号码
-- scAddress:短信中心号码,测试可以不填
-- text: 短信内容
-- sentIntent:发送 -->中国移动 --> 中国移动发送失败 --> 返回发送成功或失败信号 --> 后续处理   即,这个意图包装了短信发送状态的信息
-- deliveryIntent: 发送 -->中国移动 --> 中国移动发送成功 --> 返回对方是否收到这个信息 --> 后续处理即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)

<uses-permission android:name="android.permission.SEND_SMS"/>

4.5 电子邮件相关

//发送Email
Uri uri = Uri.parse("mailto:xxx@abc.com");
Intent it = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(it);

Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.setType("text/plain");
startActivity(Intent.createChooser(it, "Choose Email Client"));

Intent it=new Intent(Intent.ACTION_SEND);
String[] tos={"me@abc.com"};
String[] ccs={"you@abc.com"};
it.putExtra(Intent.EXTRA_EMAIL, tos);
it.putExtra(Intent.EXTRA_CC, ccs);
it.putExtra(Intent.EXTRA_TEXT, "The email body text");
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.setType("message/rfc822");
startActivity(Intent.createChooser(it, "Choose Email Client"));

//传送附件
Intent it = new Intent(Intent.ACTION_SEND);
it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");
it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");
sendIntent.setType("audio/mp3");
startActivity(Intent.createChooser(it, "Choose Email Client"));

<uses-permission android:name="android.permission.INTERNET" />

4.6多媒体相关

//播放多媒体
Uri uri = Uri.parse("file:///sdcard/song.mp3");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
it.setType("audio/mp3");
startActivity(it);
Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");
Intent it = new Intent(Intent.ACTION_VIEW, uri);
startActivity(it);

4.7系统相关

//安装应用
Uri uri = Uri.fromParts("package", strPackageName, null);
Intent it = new Intent(Intent.ACTION_DELETE, uri);
startActivity(it);

//卸载应用
Uri uri = Uri.fromParts("package", strPackageName, null);
Intent it = new Intent(Intent.ACTION_PACKAGE_ADDED, uri);
startActivity(it);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Intent的详解