未分类

Android第五课——进阶组件之Intent初探

Intent

Intent 会在运行时将各个组件相互绑定(您可以将 Intent 视为从其他组件请求操作的信使),无论组件属于您的应用还是其他应用。

  • Intent是Android程序中各组件之间交互的重要方式,不仅可指明当前组件想要的动作,还能在不同组件间传递数据。
  • Intent包含的部分:组件名称,操作,数据,类别,Extra,标志

显式Intent

  • 显式Intent指定明确的上下文和要转到的活动的class对象
    1
    2
    3
    4
    5
    6
    7
    8
    Intent(Context packageContext, Class<> cls)//第二个参数指定想要启动的目标活动

    button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(intent);
    }
    });

隐式Intent

系统通过将接收到的 Intent 与设备上的其他应用的清单文件中提供的 Intent 过滤器进行比较来确定可以响应 Intent 的组件。

  • 隐式Intent不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。创建隐式Intent时,Android系统通过将Intent的内容与在设备上其他应用的清单文件中声明的Intent过滤器进行比较,从而找到要启动的相应组件。如果Intent与Intent过滤器匹配,则系统将启动该组件,并向其传递Intent对象。如果多个Intent过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用。
  • Intent过滤器是应用清单文件中的一个表达式,它指定该组件要接收的Intent类型。例如,通过为Activity声明Intent过滤器,您可以使其他应用能够直接使用某一特定类型的Intent启动Activity。同样,如果您没有为Activity声明任何Intent过滤器,则Activity只能通过显式Intent启动。只有Intent过滤器action标签与catogory标签同时与Intent中指定的actioncategory匹配时活动才能响应该Intent。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    button1.setOnClickListener(new View.OnClickListener(){
    @override
    public void onClick(View v){
    Intent intent = new Intent("com.example.activitytest.ACTION_START");
    //此处使用Intent的另一个构造函数,传入action字符串即可。
    startActivity(intent);
    //"android.intent.category.DEFAULT"是一种默认的category,调用startActivity()方法时会自动将其添加到Intent中。
    //或intent.addCategory("categoryName");来添加category
    }
    });
  • 还可以利用隐式Intent启动其他应用程序内的活动,比如分享到其他App,打开网页等操作。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    //这是Android系统内置的一个动作,其常量值为android.intent.action.VIEW
    intent.setData(Uri.parse("http://www.baidu.com"));
    //通过Uri.parse()方法将网址字符串解析成Uri对象,使用setData()方法把URI赋给Intent。(Intent的Data使用URI来表示)
    startActivity(intent);
    }
    });
  • AndroidManifest.xml文件中,可以为活动的Intent过滤器指定额外的<data>标签限定活动能响应的URI类型。只有<data>标签中指定的内容和Intent中携带的Data完全 一致时,当前活动才能够响应该Intent。以下是常用的标签内容:

    • android:scheme。用于指定数据的协议部分,如http,geo(地理位置),tel(拨打电话)等。
    • android:host。用于指定数据的主机名部分,如www.baidu.com。
    • android:port。用于指定数据的端口部分,一般紧随在主机名之后。
    • android:path。用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容。
    • android:mimeType。用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
  • 可以使用Intent在启动活动的同时传递数据。
    1. 把需要传递的数据用putExtra()方法存放在Extra
    2. 在另一个活动中用getIntent()方法取得传来的Intent
    3. getStringExtra()方法取回数据(其他类型类似)
  • 也可以使用Intent给上一个活动返回数据。开发文档中有一个startActivityForResult()方法用于启动活动并向上一个活动返回数据。

    1. 给它传递一个启动活动用的Intent和一个唯一的requestCode参数
    2. 在另一个活动中用另一个Intent的Extra携带要返回的信息
    3. 用setResult()方法设置传回Intent和结果(RESULT_OKRESULT_CANCELED
    4. finish()方法结束当前活动并传回Intent
    5. 返回到上一个活动后会回调onActivityResult()方法,重写该方法添加从中得到返回的数据的逻辑
    6. 注意“返回到上一个活动时”包含所有返回的情况,如按Back键等,在按Back键返回的情况下需要重写onBackPressed()方法来执行setResult()方法。(此时super.onBackPressed()要写在最后)
  • 更多Intent的例子会在之后的广播中遇到。

分享到