Intent详解

   我们已经知道了Android的基本组件了,今天讲的Intent就是连接他们之间的桥梁,确切的说是对Activity,Service,BroadcastReceiver的激活并作为他们之间的连接器。

   总的来说Intent的功能有以下三点:

(1)激活组件,前面提到的三个基本组件的激活,但是激活方式不同;

(2)使用Android系统内置的Intent来完成发送短信、拨打电话,浏览网页和查看地图等手持设备的基本功能;

(3)激活组件时在组件之间传递数据;

   

   下面我们将详细的介绍Intent的相关知识和使用。

一.Intent对象的属性

整理为下列表格中:

属性字段 名称 数据类型 获取方法 设置方法
Component Name 组件名 ComponentName getComponent()

setComponent()

setClass()

setClassName()

Action 动作 String getAction() setAction()
Data 数据 URI

getData()

getType()

setData()

setType()

setDataAndType()

Category 分类 String getCategories()

addCategory()

removeCategpry()

Extra 额外信息

1.键值对形式

<String,Object>

2.Bundle类型

1.get***Extra():

获取不同的数据类型

2.getExtras():

获取封装好的Bundle数据包

1.putExtra():

以键值对的形式存放各种类型的数据

2.putExtras():

放入包装好的Bundle数据包

Flag 标志 Integer getFlags() setFlags()

下面具体讲解每一个属性:

1.Component Name:


――组件名用来处理Intent的匹配问题,它可以被设置也可以不被设置:

(1)设置了组件名的Intent为显示的Intent,直接使用组件名里的参数而实现连接器的功能,在开发过程中常用于一个应用程序内部的组件激活;

(2)未设置组件名的Intent为隐式的Intent,则将会从Action、Data(URI和Type)或者Category中寻找匹配信息,在开发中常用于激活其他应用程序的组件;


――用显示的方式指定Intent的匹配信息的方法有如下四种:

(1)直接在Intent的定义中指定组件名(最常用):

Intent i=new Intent(MainActivity.this,Act2.class);
       startActivity(i);

(2)使用setComponent()方法:

Intent i=new Intent();
       ComponentName cn=new ComponentName(MainActivity.this, Act2.class);
       i.setComponent(cn);
       startActivity(i);

(3)使用setClass()方法:

Intent i=new Intent();
       i.setClass(MainActivity.this, Act2.class);
       startActivity(i);

(4)使用setClassName()方法:

Intent i=new Intent();
    i.setClassName(getBaseContext(), Act2.class.getName());
    startActivity(i);

――用隐式的方式指定Intent的匹配信息,就要用到IntentFilter(Intent过滤器)了,通过在IntentFilter中的Action、URI、Category属性配置,先放一放后面再说。


2.Action:

   用于描述Intent将要完成什么动作,分为系统自带的和自己定义的两种:

(1)常用的Android内置的Action列入下表格中:

   Activity组件的:

Action的值 完成的动作
ACTION_CALL 直接拨打Data属性指定的电话号码
ACTION_EDIT 给用户显示可编辑的数据
ACTION_MAIN 开启一个Activity并作为整个应用程序的入口Activity
ACTION_SYNC 同步服务器上的数据和移动设备上的数据
ACTION_DIAL 将Data中的电话号码放入拨打电话的界面中显示给用户,用户可以手动拨出
ACTION_VIEW 使用与Data中的数据相对应的应用程序来显示Data中指定的数据
ACTION_SEND 发送数据
ACTION_SENDTO 使用与Data中的数据相对应的应用程序向Data中指定的地址发送数据

   BroadcastReceiver组件的:

Action的值 完成的动作
ACTION_BATTRY_LOW 一个电池电量低的警告
ACTION_TIMEZONE_CHANGED 时区改变的广播
ACTION_SCREEN_ON 屏幕被打开

(2)自定义Action以后讲到广播时在进行详细讲解

(3)Action使用的例子,一会先说完Data之后一起使用。


3.Data:

(1)Data属性包括两个部分:URI和Type

(2)Data的常用取值如下:

Data取值 说明

file:///

后接本地文件数据的路径
mailto:// 后接电子邮件地址
geo:// 地理位置信息,后接经纬度
smsto:// 发短信的电话号码
tel:// 打电话的电话号码
content:// 后接内容的定位
http:// 超文本,后接网络资源的URI

(3)到目前为止我们该拿出示例代码了:

   MainActivity.java

package com.example.l0824_intent_actionanddata;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
    private Button btn_call,btn_send,btn_http,btn_file;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_call=(Button)findViewById(R.id.button_call);
        btn_send=(Button)findViewById(R.id.button_send);
        btn_http=(Button)findViewById(R.id.button_http);
        btn_file=(Button)findViewById(R.id.button_file);
        btn_call.setOnClickListener(this);
        btn_send.setOnClickListener(this);
        btn_http.setOnClickListener(this);
        btn_file.setOnClickListener(this);
                                                                                                                                                                                                                                                                             
    }
    @Override
    public void onClick(View v) {
        Intent i=null;
        switch (v.getId()) {
        case R.id.button_call:
            i=new Intent(Intent.ACTION_CALL,Uri.parse("tel://10086"));
            break;
        case R.id.button_send:
            i=new Intent(Intent.ACTION_SENDTO,Uri.parse("smsto://10086"));
            break;
        case R.id.button_http:
            i=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
            break;
        case R.id.button_file:
            i=new Intent(Intent.ACTION_VIEW);
            i.setDataAndType(Uri.parse("file:///mnt/sdcard/a.mp3"), "audio/mp3");
            break;
        default:
            break;
        }
        startActivity(i);
                                                                                                                                                                                                                                                                             
    }
                                                                                                                                                                                                                                                                         
}

   AndroidManiFest.xml

//添加打电话的权限
<uses-permission android:name="android.permission.CALL_PHONE"/>

   main_activity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
    <Button
        android:id="@+id/button_call"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="打电话" />
    <Button
        android:id="@+id/button_send"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="发短信" />
    <Button
        android:id="@+id/button_http"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="浏览网页" />
    <Button
        android:id="@+id/button_file"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="播放影音" />
</LinearLayout>

   运行效果:


4.Category:

常用的Category列如下表:

CATEGORY_HOME 显示Home界面的Activity
CATEGORY_LAUNCHER 用于一个应用程序的入口Activity
CATEGOYR_DEFAULT 隐式Intent用到

隐式Intent的例子:

前面讲过隐式Intent多用于不同的应用程序之间,那我们下面就创建两个应用程序来说明:

(1)MainActivity.java

package com.example.l0824_intent_default;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
                                                                                                               
            @Override
            public void onClick(View arg0) {
                Intent i=new Intent("com.example.l0824_intent_default.intent.action.Act_Default");
                startActivity(i);
            }
        });
    }
                                                                                                       
}

(2)Act_Default.java

package com.example.l0824_intent_default;
import android.app.Activity;
import android.os.Bundle;
public class Act_Default extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_default);
    }
}

(3)ActivityMainfest.xml

<activity
          android:name="com.example.l0824_intent_default.Act_Default">
          <action android:name="com.example.l0824_intent_default.intent.action.Act_Default" />
           <category android:name="android.intent.category.DEFAULT" />
      </activity>


5.Extra(额外信息)和Intent数据传递

有一下两种传递方式:

(1)直接以键值对的形式传递

   发送方:

Intent i=new Intent(MainActivity.this,Act2.class);
       i.putExtra("name", "张菲");
       i.putExtra("password", "123");
       startActivity(i);

   接收方:

String name=getIntent().getStringExtra("name");
String password=getIntent().getStringExtra("password");

(2)使用Bundle数据包装数据

   发送方:

Intent i=new Intent(MainActivity.this,Act2.class);
       Bundle b=new Bundle();
       b.putString("name", "张菲");
       b.putInt("password", 123);
       i.putExtras(b);
       startActivity(i);

   接收方:

Bundle b=getIntent().getExtras();
        String name =b.getString("name");
        int pass=b.getInt("password");


6.flag(标志)

   用的很少,几乎不用。

你可能感兴趣的:(android,intent,连接器)