• android 手机开发( 什么是intent)


     
    Intent是一种运行时绑定(runtime binding)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来响应。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION请求给AndroidAndroid 会根据Intent的内容,查询各组件注册时的声明的IntentFilter,找到网页浏览器Activity来浏览网页。
     
    Android如何解析Intent
     
    在应用中,我们可以以两种形式来使用Intent:
    直接Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。
    间接Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。
     
     
    Intent解析
     
    对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver 或Service。
    Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:
    如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;
    如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。
    如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto: ) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
    如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
     
     
    Intent的匹配
     
    对于明确指出了目标组件名称的Intent,我们称之为“显式Intent”。对于没有明确指出目标组件名称的Intent,则称之为“隐式Intent”。Android系统使用Intent Filter 来寻找与隐Intent相关的对象。
      显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。
     
     
    显式intent
     
    public void onClick(View v) {
    Intent intent=new Intent();
    intent.putExtra("string","获得了Activity01的数据");
    intent.setClass(this, Activity02.class);
    this.startActivity(intent);
    }
    代码简洁明了,执行了onClick()函数,就会马上跳转到名为Activity02的Activity中 ,并将参数带入到Activity中。
     
     
    隐式intent
     
    在显式Intent消息中,决定目标组件的唯一要素就是组件名称,因此,如果你的Intent中已经明确定义了目标组件的名称,那么你就完全不用再定义其他Intent内容。而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。具体的选择方法是:Android将Intent的请求内容和一个叫做Intent Filter的过滤器比较,Intent Filter中包含系统中所有可能的待选组件。如果Intent Filter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。
     
     
    隐式intent例子
     
    public void onClick(View v) {
    Uri uri=Uri.parse("smsto:0800000123");
    Intent intent=new Intent(Intent.ACTION_SENDTO,uri);
    intent.putExtra("sms_body","the sms text");
    startActivity(intent);
    }
    执行onClick()方法,会执行进入到系统自带的发短信窗口。
     
     
    Intent用例
     
    public class Activity01 extends Activity implements OnClickListener{
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button button=(Button) findViewById(R.id.button1);
            button.setOnClickListener(this);
        }
    public void onClick(View v) {
    // TODO Auto-generated method stub
    //Intent intent=new Intent();
    //intent.putExtra("string","获得了Activity01的数据");
    //intent.setClass(this, Activity02.class);
    //this.startActivity(intent);
    Uri uri=Uri.parse("smsto:0800000123");
    Intent intent=new Intent(Intent.ACTION_SENDTO,uri);
    intent.putExtra("sms_body","the sms text");
    startActivity(intent);
    }
    }
     
    public class Activity02 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
    TextView textView=(TextView) findViewById(R.id.text);
    Intent intent=getIntent();
    String string=intent.getStringExtra("string");
    textView.setText(string);
    }
    }
     
    附录
     
    •用Intent调用系统中经常被用到的组件
    1 ,web浏览器
    Uri uri = Uri. parse ( "http://kuikui.javaeye.com" );
    returnIt =  new  Intent (Intent . ACTION_VIEW ,  uri );
    2,地图
    Uri mapUri = Uri. parse ( "geo:38.899533,-77.036476" );
    returnIt =  new  Intent (Intent . ACTION_VIEW , mapUri);
    3,调拨打电话界面
    Uri telUri = Uri. parse ( "tel:100861" );
    returnIt =  new  Intent (Intent . ACTION_DIAL , telUri);
    4,直接拨打电话
    Uri callUri = Uri. parse ( "tel:100861" );
    returnIt =  new  Intent (Intent . ACTION_CALL , callUri);
     
    5,卸载
    Uri uninstallUri = Uri. fromParts ( "package" ,  " xxx " ,  null );
    returnIt =  new  Intent (Intent . ACTION_DELETE , uninstallUri);
    6,安装
    Uri installUri = Uri. fromParts ( "package" ,  " xxx " ,  null );
    returnIt =  new  Intent (Intent . ACTION_PACKAGE_ADDED , installUri);
    7,播放
    Uri playUri = Uri. parse ( "file:///sdcard/download/everything.mp3" );
    returnIt =  new  Intent (Intent . ACTION_VIEW , playUri);
    8,掉用发邮件
    Uri emailUri = Uri. parse ( "mailto:shenrenkui@gmail.com" );
    returnIt =  new  Intent (Intent . ACTION_SENDTO , emailUri);
    9,发邮件
    returnIt  =  new  Intent (Intent . ACTION_SEND );
    String[] tos = {  "shenrenkui@gmail.com"  };
    String[] ccs = {  "shenrenkui@gmail.com"  };
    returnIt .putExtra(Intent . EXTRA_EMAIL , tos);
    returnIt .putExtra(Intent . EXTRA_CC , ccs);
    returnIt .putExtra(Intent . EXTRA_TEXT ,  "body" );
    returnIt .putExtra(Intent . EXTRA_SUBJECT ,  "subject" );
    returnIt .setType( "message/rfc882" );
    Intent . createChooser ( returnIt ,  "Choose Email Client" );
     
    10,发短信
    Uri smsUri = Uri. parse ( "tel:100861" );
    returnIt =  new  Intent (Intent . ACTION_VIEW , smsUri);
    returnIt.putExtra( "sms_body" ,  "shenrenkui" );
    returnIt.setType( "vnd.android -dir/mms-sms" );
    11,直接发邮件
    Uri smsToUri = Uri. parse ( "smsto://100861" );
    returnIt =  new  Intent (Intent . ACTION_SENDTO , smsToUri);
    returnIt.putExtra( "sms_body" ,  "shenrenkui" );
    12,发彩信
    Ur i  mmsUri = Uri. parse ( "content://media/external/images/media/23" );
    returnIt =  new  Intent (Intent . ACTION_SEND );
    returnIt.putExtra( "sms_body" ,  "shenrenkui" );
    returnIt.putExtra(Intent . EXTRA_STREAM , mmsUri);
    returnIt.setType( "image/png" );

     
  • 相关阅读:
    Objective-C基础教程读书笔记(6)
    Objective-C基础教程读书笔记(7)
    [置顶] android网络通讯之HttpClient4不指定参数名发送Post
    一些常见的正在表达式
    给EditText中的图片加监听
    HDU 4569Special equations2012长沙邀请赛E题(数学知识)
    Linux malloc大内存的方法
    优秀员工的做法-领先的专业、道路管理
    ZOJ 3324 Machine
    DateUtil
  • 原文地址:https://www.cnblogs.com/zhwl/p/2106167.html
Copyright © 2020-2023  润新知