【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);