• Android Intent


     
    一.什么是Intent
    概念:
    Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,
    Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。
    Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。
     
    用途:
    1.根据intent意图来启动一个与之匹配的活动
    2.活动与活动之前附加数据的传递
     
    分类:
    Intent分为2种
    显示Intent
    隐式Intent
     
    1. 显示Intent
    Intent(Context packageContext, Class<?> cls) 
    Context: 要求提供启动活动的上下文
    Class<?> cls: 想要启动的目标活动
    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    startActivity(intent);
    如上代码:意图较为明确,通过FirstActivity作为上下文来启动SecondActivity,所以成为显示Intent
     
    2.隐式Intent
    AndroidManifest文件中在目标Activity中声明intent-filter
    <intent-filter>
    <action android:name="com.example.bingghost.TEST" />

    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    代码中调用:
    Intent intent = new Intent("com.example.bingghost.TEST");
    startActivity(intent);
    这样系统会自动匹配指定Action和category都符合要求的Activity来启动
     
    3.使用intent传值
    intent发送方
    Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
    intent.putExtra("extra_data","Hello");
    startActivity(intent)
    ;
     
    intent接受方
    Intent intent = getIntent();
    String data = intent.getStringExtra("extra_data");
     
    4.向上一个Activity返回值
    ●发送方
    使用startActivityForResult传递intent
    startActivityForResult(intentREQUEST_CODE);
     
    重载OnActivityResult方法
     
     
    接受方
     
     
    扩展:
    Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Activity来浏览网页
     
    Android的三个基本组件——Activity,Service和Broadcast Receiver——都是通过Intent机制激活的,不同类型的组件有不同的传递Intent方式:
     
    1.要激活一个新的Activity,或者让一个现有的Activity做新的操作,可以通过调用Context.startActivity()或者Activity.startActivityForResult()方法。 
    2. 要启动一个新的Service,或者向一个已有的Service传递新的指令,调用Context.startService()方法或者调用Context.bindService()方法将调用此方法的上下文对象与Service绑定。
    3 Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()这三个方法可以发送Broadcast Intent。
    发送之后,所有已注册的并且拥有与之相匹配IntentFilter的BroadcastReceiver就会被激活。 Intent一旦发出,Android都会准确找到相匹配的一个或多个Activity,
    Service或者BroadcastReceiver作响应。所以,不同类型的Intent消息不会出现重叠,即Broadcast的Intent消息只会发送给BroadcastReceiver,
    而决不会发送给Activity或者Service。由startActivity()传递的消息也只会发给Activity,由startService()传递的Intent只会发送给Service。
     
     
    Intent的构成
    要在不同的activity之间传递数据,就要在intent中包含相应的内容,一般来说数据中最基本的应该包括:
    Action:用来指明要实施的动作是什么,比如说ACTION_VIEW, ACTION_EDIT等。具体的可以查阅android SDK-> reference中的Android.content.intent类,里面的constants中定义了所有的action。
     
    一些常用的Action:
    ACTION_CALL activity 启动一个电话.
    ACTION_EDIT activity 显示用户编辑的数据.
    ACTION_MAIN activity 作为Task中第一个Activity启动
    ACTION_SYNC activity 同步手机与数据服务器上的数据
    ACTION_BATTERY_LOW broadcast receiver 电池电量过低警告
    ACTION_HEADSET_PLUG broadcast receiver 插拔耳机警告
    ACTION_SCREEN_ON broadcast receiver 屏幕变亮警告
    ACTION_TIMEZONE_CHANGED broadcast receiver 改变时区警告.
     
    Data: 要事实的具体的数据,一般由一个Uri变量来表示
    Category:一个字符串,包含了关于处理该intent的组件的种类的信息。一个intent对象可以有任意个category。intent类定义了许多category常数.
    addCategory()方法为一个intent对象增加一个category,
    removeCategory删除一个category,
    getCategories()获取intent所有的category.
     
    Type:显式指定Intent的数据类型(MIME)(多用途互联网邮件扩展,Multipurpose Internet Mail Extensions)。比如,一个组件是可以显示图片数据的而不能播放声音文件。很多情况下,data类型可在URI中找到,比如content:开头的URI,表明数据由设备上的content provider提供。但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。
     
    MIME类型有2种形式:
    1.1  单个记录的格式: vnd.android.cursor.item/vnd.yourcompanyname.contenttype,如:content://com.example.transportationprovider/trains/122(一条列车信息的uri)的MIME类型是vnd.android.cursor.item/vnd.example.rail
    1.2 多个记录的格式:vnd.android.cursor.dir/vnd.yourcompanyname.contenttype,如:content://com.example.transportationprovider/trains (所有列车信息)的MIME类型是vnd.android.cursor.dir/vnd.example.rail
     
    component:指定Intent的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。例如:
    Intent it = new Intent(Activity.Main.this, Activity2.class); startActivity(it);
    startActivity(it);
    extras:附加信息,例如ACTION_TIMEZONE_CHANGED的intent有一个"time-zone"附加信息来指明新的时区,而ACTION_HEADSET_PLUG有一个“state”附加信息来指示耳机是被插入还是被拔出。intent对象有一系列put...()和set...()方法来设定和获取附加信息。 这些方法和Bundle对象很像。事实上附加信息可以使用putExtras()和getExtras()作为Bundle来读和写。例如:
     
     
    //用Bundle传递数据
     Intent it = new Intent(Activity.Main.this, Activity2.class); 
    Bundle bundle=new Bundle(); 
    bundle.putString("name", "This is from MainActivity!"); 
    it.putExtras(bundle); 
    startActivity(it); 
     
    //获得数据 
    Bundle bundle=getIntent().getExtras(); 
    String name=bundle.getString("name");
     
     
    intent的解析:
    在应用中,我们可以以两种形式来使用Intent:
    1.1 显式Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
    2.2 隐式Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
    对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析将 Intent映射给可以处理此Intent的Activity、Service或Broadcast Receiver。
     
    Intent解析机制
    Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有<intent-filter>及其中定义的Intent,通过PackageManager(注:PackageManager能够得到当前设备上所安装的
    application package的信息)来查找能处理这个Intent的component。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
    1.1  如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
    1.2  如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
    1.3  如果Intent中的数据不是content:类型的URI,而且Intent也没有明确指定type,将根据Intent中数据的scheme(比如 http:或者mailto:)进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
    1.4 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
     
     
    使用范例
    1.无参数Activity跳转
    Intent it = new Intent(Activity.Main.this, Activityclass);
    startActivity(it);

    2.向下一个Activity传递数据(使用BundleIntent.putExtras
    Intent it = new Intent(Activity.Main.this, Activityclass);
    Bundle bundle = new Bundle();
    bundle.putString("name", "This is from MainActivity!");
    it.putExtras(bundle); // it.putExtra("test","shuju");
    startActivity(it); // startActivityForResult(it,REQUEST_CODE);

    3.对于数据的获取可以采用:
    Bundle bundle=getIntent().getExtras();
    String name=bundle.getString("name");

    4.向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity
    Intent intent = getIntent();
    Bundle bundle2 = new Bundle();
    bundleputString("name", "This is from ShowMsg!");
    intent.putExtras(bundle2);
    setResult(RESULT_OK, intent);

    5.回调上一个Activity的结果处理函数(onActivityResult
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode==REQUEST_CODE){
    if(resultCode==RESULT_CANCELED)
    setTitle("cancle");
    else if (resultCode==RESULT_OK) {
    String temp=null;
    Bundle bundle=data.getExtras();
    if(bundle!=null) temp=bundle.getString("name");
    setTitle(temp);
    }
    }
    }



    下面是转载来的其他的一些Intent用法实例(转自javaeye
    ○显示网页
    Uri uri = Uri.parse("http://google.com");
    Intent it = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(it);

    显示地图
    Uri uri = Uri.parse("geo:3899533,-7036476");
    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);

    打电话
    //叫出拨号程序
    Uri uri = Uri.parse("tel:0800000123");
    Intent it = new Intent(Intent.ACTION_DIAL, uri);
    startActivity(it);

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


    传送SMS/MMS
    //调用短信程序
    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://0800000123");
    Intent it = new Intent(Intent.ACTION_SENDTO, uri);
    it.putExtra("sms_body", "The SMS text");
    startActivity(it);

    //传送 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);

    传送 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"));

    播放多媒体
    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);

    Market 相关
    //寻找某个应用
    Uri uri = Uri.parse("market://search?q=pname:pkg_name");
    Intent it = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(it);
    //where pkg_name is the full package path for an application
    //显示某个应用的相关信息
    Uri uri = Uri.parse("market://details?id=app_id");
    Intent it = new Intent(Intent.ACTION_VIEW, uri);
    startActivity(it);
    //where app_id is the application ID, find the ID
    //by clicking on your application on Market home
    //page, and notice the ID from the address bar

    Uninstall 应用程序
    Uri uri = Uri.fromParts("package", strPackageName, null);
    Intent it = new Intent(Intent.ACTION_DELETE, uri);
    startActivity(it);



  • 相关阅读:
    wireshark解析https协议方法
    (转)python requests 高级用法 -- 包括SSL 证书错误的解决方案
    selenium--判断元素是否存在
    lambda(匿名函数)---基于python
    python单元测试之参数化
    获取文件夹下某个类型的文件名---基于python
    python操作Excel读写--使用xlrd
    PCAP文件格式分析(做抓包软件之必备)
    pip安装Crypto注意事项
    使用PYTHON解析Wireshark的PCAP文件
  • 原文地址:https://www.cnblogs.com/bingghost/p/5720716.html
Copyright © 2020-2023  润新知