四大组件-----Intent
2016-11-21 00:00
316 查看
摘要: Intent的详解
1.2隐式意图
2.2Intent传递对象类型
Android 中自定义的对象序列化的问题有两个选择Parcelable、Serializable.
序列化原因:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象.
选择原则:
1.在使用内存的时候,Parcelable 类比Serializable性能高,所以推荐使用Parcelable类.
2.Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC.
3.Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下.尽管Serializable效率低点,也不提倡用,但在这种情况下,还是建议你用Serializable .
传递Serializable对象
传递Parcelable对象
Parcelable接口是Android特定序列化接口,它比Serializable接口更有效,通常用于Binder和AIDL场景中.
Parcelable接口序列化的数据可以存储在Parcel中,继承Parcelable接口的类必须具有一个CREATOR的静态变量.
用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是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做
结果码
在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法.为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity):
在Intent中,目前仅支持GET方式提交数据,为了打开网址,采用的action为ACTION_VIEW
4.2地图相关
4.3电话相关
4.4消息相关
4.5 电子邮件相关
4.6多媒体相关
4.7系统相关
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);
相关文章推荐
- Android四大组件+Intent详解
- android四大组件之intent
- android四大组件之Service和子类IntentService
- Android四大组件之Activity (IntentFilter匹配规则)
- Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)
- 野人学Android基础篇之四大组件第一课--Activity的Intent传递
- Android初始篇五 Android四大组件之Intent和Content Provider
- 四大组件出现:android The activity must be exported or contain an intent-filter
- 四大组件之一Service——应用实例二(IntentService类的使用)
- Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)
- Android四大组件之Intent
- Android 四大组件之一:Service后台服务之IntentService
- Android零基础入门第78节:四大组件的纽带——Intent
- android 四大组件之Service(4)IntentService
- 和四大组件关系最紧密的Intent-----意图(一)
- Android Interview Preparation——四大组件【Activity Intent,序列化】
- Android 四大组件之(1)Activity与Intent通信机制
- Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)
- 安卓四大组件之一#3-使用Intent的隐式意图访问系统app
- Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务