【android学习】重要组件-intent
来源:互联网 发布:恩比德最新体测数据 编辑:程序博客网 时间:2024/05/16 11:56
1,概念
意图,意向。
在android中用Intent机制来协助应用间的交互与通讯。
Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。
优点:减少组件间的耦合。
使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。
1)Intent可传递数据类型
①8种基本数据类型及其数组
②String/CharSequence实例类型的数据及数组
String实现了Serializable。
③实现了Serializable的对象及数组
如:File。
④实现了Parcelable的对象及数组
2)分类
①显式意图
调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。
指明明确的activity路径:
Intent intent=new Intent(this,TestActivity.class);intent.setData(Uri.parse(fileUrl));startActivity(intent);
Intent intent=new Intent();intent.setClassName(context.getPackageName(),”com.google.sample.TestActivity”);startActivity(intent);
Intent intent=new Intetn();intent.setComponent(new ComponentName(context.getPackageName(),"com.google.sample.TestActivity"));startActivity(intent);
②隐式意图
没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。
通过这种方式来启动发送短信的activity:
Intent intent=new Intent(Intent.ACTION_SEND);intent.putExtra(Intent.EXTRA_TEXT,textMessage);intent.setType("text/plain");startActivity(intent);
2,场景
1)启动一个Activity
①切换当前界面到NcActivity.class
Intent intent = new Intent(mContext, NcActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent);
②读取APK存储路径并自动安装
Intent intent = new Intent(Intent.ACTION_VIEW);// 设置intent的data和Type属性。intent.setDataAndType(FileUtils.getUriFromFile(Url.apkPath + Url.apkName),"application/vnd.android.package-archive");startActivity(intent);
2)启动一个Service
①startService方法
serviceIntent = new Intent(this, HttpService.class);startService(serviceIntent);stopService(serviceIntent);
②bindService方法
3)发起一个广播Broadcasts
①sendBroadcasts方法
Intent intent = new Intent(); intent.setAction("cn.login"); Bundle bundle = new Bundle(); bundle.putString("username", userName); bundle.putString("password",Password); bundle.putString("server", Server); bundle.putInt("port", Port); intent.putExtras(bundle); sendBroadcast(intent);
②sendOrderedBroadcasts方法
③sendStickyBroadcasts方法
4)打开系统拍照
/** * 拍照 */ public void takePhoto() { Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File vFile = FileUtil.getImageFile(); Uri cameraUri = Uri.fromFile(vFile); openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri); ((Activity) context).startActivityForResult(openCameraIntent, Variable.TAKE_PICTURE); }
package com.luo.util;import java.io.File;import android.os.Environment;public class FileUtil { public static String ImagePath = ""; public static File getImageFile(){ File vFile = new File(Environment.getExternalStorageDirectory() + "/myimage/", String.valueOf(System.currentTimeMillis()) + ".jpg"); if (!vFile.exists()) { File vDirPath = vFile.getParentFile(); vDirPath.mkdirs(); } else { if (vFile.exists()) { vFile.delete(); } } ImagePath = vFile.getPath(); return vFile; }}
public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case Variable.TAKE_PICTURE: String path = FileUtil.ImagePath; List<ImageBean> mData = new ArrayList<ImageBean>(); if (mData.size() < Variable.MAX_IMAGE_SIZE && resultCode == -1 && !TextUtils.isEmpty(path)) { ImageBean item = new ImageBean(); item.sourcePath = path; mData.add(item); } initData(mData); initview(); break; } }
默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片,可以通过dat extra能够得到原始图片位置。
如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据!
5)显示用户数据
Intent.ACTION_VIEW用于显示用户的数据。根据用户的数据类型打开相应的Activity。比如 tel:13400010001打开拨号程序,http://www.g.cn则会打开浏览器等。
Intent的动态注册,通过指定一个action让操作系统判断并执行,http会被判断为打开浏览器。
用于在浏览器浏览这个网址:
Intent intent = new Intent(Intent.ACTION.VIEW,Uri.parse("http://mail.google.com"))
3,属性:
1)动作(Action)
指Intent要完成的动作,是一个字符串常量。
2)数据(Data)
执行动作的URI和MIME(或mimeType)类型,不同的Action又不同的Data数据指定。
MIME(或mimeType)指媒体类型,如:image/jpeg、audio/mpeg4-generic和video/*等,可以表示图片、文本、视频等。
3)分类(Category)
执行动作Action的附加信息。
4)类型(Type)
指定Intent的数据类型(MIME)。
一般的Intent的数据类型根据数据本身判定,通过设置这个属性,强制采用显示指定类型。
5)组件(Compent)
指定Intent的目标组件的类名称。
通常android会根据Intent中包含的其它属性的信息进行查找,最终找到一个与之相配的目标组件。通过设置这个属性,将直接使用它指定的组件。
6)扩展信(Extra)
添加一些组件的附加信息。
比如用Activity发送Email,可以通过此属性来添加subject和body。
举例:传递参数(用于2个activity)
i>在发送Intent的activity中,添加键值对:
intent.putExtra("NAME","luo");
ii>在接受Intent的activity中,取值:
Intent intent = getIntent();String Str_name = intent.getStringExtra("NAME");
iii>传递列表
intent.putExtra(VariableUtil.EXTRA_IMAGE_LIST,(Serializable) new ArrayList<ImageItem>selectedImgs.values()));
intent.getSerializableExtra(VariableUtil.EXTRA_IMAGE_LIST);
- 【android学习】重要组件-intent
- 【android学习】重要组件-intent
- Android重要的组件--Intent
- android的四大组件+intent重要组件
- [Android开发]Android 重要组件 之 Intent
- 黑马程序员——Android之重要组件Intent-active_Activity
- Android基础(一):四大组件与另一个重要组件Intent的简单认识
- Android 重要的组件
- android组件之Intent
- Android Intent组件使用
- Android组件之Intent
- Android Intent组件使用
- Android Intent组件使用
- Android Intent组件使用
- android组件-Intent
- Android Intent组件
- Android组件通信--Intent
- Android通信组件Intent
- 清除缓存方法
- Spring Data Redis (Redis Support)
- 五.Core组件进阶(1.颜色空间缩减)
- VUE开始之路的问题记录
- 算术运算符
- 【android学习】重要组件-intent
- 使用RSA对C++ 客户端和 PHP 服务端之间通信的数据进行加密
- 队花的烦恼一
- 近几天的总结
- JavaScript中七种函数调用方式及对应 this 的含义
- onsubmit事件与eval()函数
- Activiti流程引擎配置
- MATLAB M-Files
- 视频摘要简介