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; } }
相关文章推荐
- linux服务安装与配置(一):服务状态
- 傅里叶变换推导与证明
- VO、DTO、DO和PO
- 【c语言】 写一个函数返回参数二进制中 1 的个数
- JavaSE实战——反射技术
- 1. 数据采集基础问题
- [技术讨论]又看到99%的言辞
- JAVA 实例 判断偶数和判断瑞年
- 使用 CAS 在 Tomcat 中实现单点登录(二)
- C#学习之路,学习笔记 2.2 字符、字符串、数字的初始化与读取
- 个人博客2
- 一、Eclipce4.5.0 中安装FreeMarker插件
- C#集合类便捷使用和初始化方法
- [LeetCode]: 242: Valid Anagram
- 单选框实现联动一样的效
- 数据结构:单链表
- POJ - 1651 Multiplication Puzzle(区间dp)
- 【IOS 开发学习总结-OC-25】★★★objective-c——foundation 框架之字符串
- Spark修炼之道(基础篇)——Linux大数据开发基础:第九节:Shell编程入门(一)
- C++ 简单Vector模板类