Android Intent详细介绍及使用说明(显式、隐式和值传递)

    Intent 是Android程序中各个组件之间进行交互的一种重要方式,不仅可以指明当前组件想要执行的动作,还可以在不同组件中传递数据。我们一般可以用Intent启动活动(Activity)、启动服务(service)、以及发送广播(broadcastreceiver)等。

    Intent用法大致分为两种,一种是显式Intent,一种是隐式Intent。

    一、显式Intent

    Intent有多个构造函数的重载,我们一般用Intent(Context packageContext,Class<?>cls)这个构造方法,其中接收的第一个参数Context要求提供一个启动活动的上下文,第二个参数Class指定想要启动的目标活动。Intent也叫意图,就是想要做什么地意思。比如在主活动中加入加入一个Button,通过点击Button来开启其他活动,我们可以这样做: 

button.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// 传递意图,启动一个活动
				Intent intent = new Intent(MainActivity.this, OtherActivity.class);
				startActivity(intent);
			}
		});

    那么如何启动服务呢?同样需要实例化一个服务(Service,稍后博客会有相关服务知识的介绍),然后可以在代码中这样写:

    Intent intent = new Intent(MainActivity.this, DownLoadService.class);
    startService(intent);

这样就可以了。

    那么广播呢?下面就介绍隐式Intent,在里边简单介绍。

    二、隐式Intent

    隐式Intent相比显式Intent含蓄了好多,不明确指出想要启动那一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮助我们找出合适的活动去启动。那么我们怎么可以像上边那样启动OtherActivity呢?

    1.打开项目下的AndroidManifest.xml,找到OhterActivity的<activity>标签。

    2.在标签中配置<intent-filter>的内容

    具体如下:

  	<activity
            android:name="com.example.androidintent.OtherActivity" >
            <intent-filter >
                <action android:name="android.example.androidintent.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>

    3.在需要启动活动的地方这样写就行了:

    Intent intent = new Intent("android.example.androidintent.ACTION_START");
    startActivity(intent);

    那么出现了一个问题,<action>和<category>同时匹配才能像相应启动一个活动,那上边为什么可以呢?

    其实是因为android.intent.category.DEFAULT 是一种默认的category,在调用MainActivity的时候会自动将这个category添加到Intent中。

    我们可以这样写:

    Intent intent = new Intent("android.example.androidintent.ACTION_START");
    intent.addCategory("android.example.androidintent.OHTER_CATEGORY");
    startActivity(intent);

    可以看到我们通过调用Intent中的addCategory()方法来添加一个category,那么怎么才能正常启动活动呢?这时就必须在配置文件AndroidManifest.xml中把这条category添加上去,这样写程序就不报错了:

	<activity
            android:name="com.example.androidintent.OtherActivity" >
            <intent-filter >
                <action android:name="android.example.androidintent.ACTION_START"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <span style="color:#ff0000;"><category android:name="android.example.androidintent.OHTER_CATEGORY"/></span>
            </intent-filter>
        </activity>

    我们现在可以试着发一个广播了,很简单,广播以后会写篇文章,在这我们就默认程序中有一个广播,怎么去传递意图呢?

    Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");

    sendBroadcast(intent); 

    使用隐式的Intent我们不仅可以启动自己程序内的活动,还可以启动其他应用的活动,这使得Android多个应用程序之间的功能共享成为可能,比如说你的应用程序中需要打开一个网页,我们就可以调用系统的浏览器来打开这个网页。怎么写呢?

		Intent intent = new Intent(Intent.ACTION_VIEW); // Android系统内置的一个动作
		// 通过Uri.parse()方法将一个网址字符串解析成一个Uri对象,再调用Intent的setData()
		// 方法将这个Uri对象传递出去
		intent.setData(Uri.parse("http://blog.csdn.net/shr957250701"));
		startActivity(intent);

    当然我们也可以调用系统拨号界面:

		Intent intent = new Intent(Intent.ACTION_DIAL);
		intent.setData(Uri.parse("tel:10086"));
		startActivity(intent);

    好了,基本都讲完了,那个现在在说一下Intent携带数据,通过调用intent.putExtra("传递的名",需要传递的参数)方法来传递参数;

		Intent intent = new Intent(MainActivity.this,OtherActivity.class);
		intent.putExtra("name", data);
		startActivity(intent);

    那么如何接收呢?

		Intent intent = getIntent();
		String data = intent.getStringExtra("name");

    这样就可以接收了。

    那么我们怎么可以再当前活动结束的时候,将数据返回上一个活动呢,这时候就需要用到startActivityForResult(intent, requestCode),其中第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。

    我们可以再MAinActivity的Button点击事件中这样写

<span style="white-space:pre">		</span>Intent intent = new Intent(MainActivity.this, OtherActivity.class);
		startActivityForResult(intent, 1);
   然后我们在OtherActivity的Button点击事件中这样写,把这个页面结束,把值回传给MainActivity。

<span style="white-space:pre">		</span>button.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent();
				intent.putExtra("return_data", "这是第一个页面接收到的结果");
				setResult(RESULT_OK, intent);
				finish();
			}
		});

    这样我们就可以在MainActivity的onActivityResult(int requestCode, int resultCode, Intent data)这个方法中获取结果。

<span style="white-space:pre">	</span>@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		case 1:
			if (resultCode==RESULT_OK) {
				//这里我们就可以得到从OtherActivity回传的值了
				String resultData = data.getStringExtra("return_data");		
			}
			break;
		default:
			break;
		}
	}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值