Android中Intent的使用

一、介绍

        Android手机软件开发中,Intent作为手机软件开发时很重要的对象需要引起我们的重视,实际上,intent也是体现Android开发具有其独特性的一个标志性的对象。  当一个Activity要启动另外一个Activity的时候,也许一个以前较为熟悉的模式是:调用一个new函数,直接创建具有窗口特征类的对象,又或者直接调用一个启动函数来启动。这种方式简洁、明了,但是却违背了Android开发的理念。Android使用Intent来“封装”程序的“调用意图”,不管程序想启动什么组件,启动一个Activity也好,一个service也好,或者一个Broadcast Receiver也好,Android统一使用Intent对象来封装这种“启动意图”。

        除此之外,使用Intent也有好处,某些时候,应用程序只是想启动具有某些特征的组件或者应用程序,却并不想和这类程序有硬性的代码耦合;另外,应用程序有时候或许只是知道要启动的东西的一些特征,并不知道要启动的程序具体指的是什么(比如,某程序想启动发短信的应用程序,而此时系统中存在多个发信息的软件,我们无法知道要打开什么软件),此时程序要做的就应该是发送一个启动短信应用程序的意图,而不是指定要打开什么软件。当然更一般的,Intent也可以指定打开那个应用程序,而与一些程序有硬性的耦合关系。

       Intent还是应用程序组件之间通信的重要媒介,两个Activity把需要交换的数据封装成Bundle对象,然后使用Intent来携带Bundle对象,这样就实现了两个Activity之间的数据交换。

      Intent存在以下几个属性:Component,Action,Category,Data,Type,Extra,Flag七个属性,其中Component属性用来指定需要启动的目标组件,Extra属性用于携带需要交换的数据。

二、实现

<一>显式Intent方式

1 、如下图所示,建立新项目,其余均采取默认设置,一直点击“”next“”按钮到项目创建完成

 

 

2、在包com.lutsoft.android_009_intenttest下创建Aty1类,用于作为要进入的类其中代码如下图所示:

package com.lutsoft.android_009_intenttest;

import android.app.Activity;
import android.os.Bundle;
public class Aty1 extends Activity{
	  @Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.aty1);
	}
}

3、MainActivity类的代码如下所示:在这里我们能够进行页面的转换,在这个转换页面中,主要代码为:

    Intent i=new Intent();
    i.setComponent(new ComponentName("com.lutsoft.android_009_intenttest", "com.lutsoft.android_009_intenttest.Aty1"));
    startActivity(i);

第一行程序为创建一个新的意图,第二行程序为打开一个新的类,第三行为启动这个意图

package com.lutsoft.android_009_intenttest;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.btnStartAty1).setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent i=new Intent();
				i.setComponent(new ComponentName("com.lutsoft.android_009_intenttest", "com.lutsoft.android_009_intenttest.Aty1"));
				startActivity(i);
			}
		});
	}
	
}

4、activity-main布局文件代码如下所示:

<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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.lutsoft.android_009_intenttest.MainActivity" 
    android:orientation="vertical">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Intent的使用" />
    <Button
        android:id="@+id/btnStartAty1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="start Aty1" />
</LinearLayout>

5、配置文件AndroidManifest.xml中,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="<a target=_blank href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>"
    package="com.lutsoft.android_009_intenttest"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="Aty1"></activity>
    </application>
</manifest>

6、结果显示

(1)首页显示结果如下:

 

 

(2)点击“”start Aty1“”之后出现如下所示界面:

从结果可以看出,能够顺利地从activity-main到aty1界面

<二>隐式Intent方式

1、在原有项目上,及上一个项目中保持其余部分不变,仅仅改变AndroidManifest.xml文件中

<activity android:name="Aty1"></activity>

将其改为如下代码,其中com.lutsoft.android_009_intenttest为项目类Aty1所在的包:

 <activity android:name="Aty1">
   <intent-filter>
     <action android:name="com.lutsoft.android_009_intenttest.intent.action.Aty1"/>
     <category android:name="android.intent.category.DEFAULT"/>
   </intent-filter>
 </activity>

2、并将MainActivity类中Onclick函数中的内容改变为如下内容,(即隐藏第一种方法,使用新的方法打开界面):

	@Override
    public void onClick(View v) { 
		/**
	    * 进入Activity
		*/
		//	Intent i=new Intent();
		//	i.setComponent(new ComponentName("com.lutsoft.android_009_intenttest", "com.lutsoft.android_009_intenttest.Aty1"));
		//	startActivity(i);
		/**
		* Action
		*/
		Intent i=new Intent("com.lutsoft.android_009_intenttest.intent.action.Aty1");
		startActivity(i);
	}

3、结果显示:效果和第一种一样

4、打开图片文件,只需将MainActivity类中Onclick函数的内容改变为如下所示:

@Override
			public void onClick(View v) {
				/**
				 * 进入Activity
				 */
			//	Intent i=new Intent();
			//	i.setComponent(new ComponentName("com.lutsoft.android_009_intenttest", "com.lutsoft.android_009_intenttest.Aty1"));
			//	startActivity(i);
				/**
				 * Action
				 */
			//	Intent i=new Intent("com.lutsoft.android_009_intenttest.intent.action.Aty1");
			//	startActivity(i);
				
			File f=new File("/mnt/sdcard/1.png");
			Intent i=new Intent(Intent.ACTION_VIEW);
			i.setDataAndType(Uri.fromFile(f), "image/*");
			startActivity(i);
			}

并且在mnt/sdcard中含有图片文件1.png,如下图所示(导入图片文件的方法是在DDMS中使用右上角的文件导入图标进行导入):

 

 

5、显示结果如下所示,既能够正常显示所导入的图片文件:

6、下面我们就进行实现拨打电话界面和进入浏览器界面的设置,首先添加两个独立的按钮在activity-main中,代码如下图所示:

  <Button
        android:id="@+id/btnStartAty1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="start Aty1" />
        <Button
        android:id="@+id/btnDel10086"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="拨打10086" />
        <Button
        android:id="@+id/btnNav"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="打开百度" />
    

添加完毕后,其显示界面如下图所示,当点击拨打10086按钮时,能够弹出拨打电话界面,当点击打开百度按钮时,能够打开百度主页:

 

之后在MainActivity类中添加如下代码,即添加响应事件:

		findViewById(R.id.btnDel10086).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			Intent i=new Intent(Intent.ACTION_VIEW);
			i.setData(Uri.parse("tel:10086"));
			startActivity(i);
			}
		});
		findViewById(R.id.btnNav).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			Intent i=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
			startActivity(i);
			}
		});


添加完成后运行能够进入到拨打电话界面和进入浏览器界面 

三、Intent中参数的传递

 上面说明了两种Intent打开活动的两种方法,一种显示的打开,一种隐式的打开,两种各有千秋,在最终使用时还是要根据自己的业务进行使用,下面,我们就来说一说怎么通过Intent进行参数的传递。

在进行参数传递时,通过使用putExtra()方法进行传递,如下面程序说明:

        // 参数传递
        Button button1 = findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                   String data = "Hello SecondActivity";
                   Intent intent = new Intent(SecondActivity.this, ThirdActivity.class);
                   intent.putExtra("params", data);
                   startActivity(intent);
            }
        });

如上面代码,我们将字符串data通过putExtra()方法进行传递下去,其中putExtra()方法中需要两个参数,第一个是参数是键,用于在后一个页面中进行取值,而第二个参数是真正需要传递的值,在上面代码中我们能够传递的键是params,值是data。

  在第二个页面中,我们能够取到我们上个activity传递下来的数据,代码如下所示:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
        Intent intent = getIntent();
        String params = intent.getStringExtra("params");
        Log.d("SecondActivity", params);

    }
}

如上代码中,我们通过 getStringExtra方法取到了上一个activity中传递过来的字符串值,在取值的过程中首先通过getIntent()方法进行获取Intent对象,然后通过键params进行取到具体地值,在取值时,如果传递的是证书数据,则使用getInExtra()方法进行获取,如果传递的是布尔型数据,则使用getBooleanExtra()方法进行获取,也就是说传递是什么类型,就通过对应类型的方法进行获取

四、返回数据给上一个活动

既然能够从上一个界面向下传递数据,那么能不能从下一个活动传递到上一个页面呢?答案是可以的,在这里我们就看看如何返回数据给上一个活动,在返回数据时,我们能够通过startActivityForResult()方法进行数据的返回,其中startActivityForResult方法接受两个参数,第一个参数还是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源。

如下面代码:

        Button button1 = (Button) findViewById(R.id.button_1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(FirsrActivity.this, SecondActivity.class);
                startActivityForResult(intent, 1);
            }
        });

我们在上面代码中使用startActivityForResult方法进行启动SecondActivity,请求码只要是唯一一个就可以了,在上面代码中,我们传入的值为1,接下来我们就可以在SecondActivity中进行注册点击事件添加返回值了,如下面代码所示:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
        Button button2 = (Button) findViewById(R.id.button_2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.putExtra("data_return", "Hello FirstActivity");
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }
}

在上述代码中,可以看到,我们还是构建了一个Intent,只不过在这个Intent中没有用于启动另外一个活动,而是仅仅用来传递数据,由于在上一个活动中使用了startActivityForResult方法来启动SecondActivity,所以在SecondActivity销毁之后会调用上一个活动的onActivityResult()方法,因此我们还需要在FirstActivity活动中进行重写onActivityResult方法,代码如下所示:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch(requestCode) {
            case 1: 
                if (resultCode == RESULT_OK) {
                    String returnedData = data.getStringExtra("data_return");
                    Log.d("FirstActivity", returnedData);
                }
            break;
            default:
        }
    }

其中onActivityResult方法带有三个参数,第一个参数是requestCode,即我们启动活动时的请求码,第二个参数是 resultCode,即我们在返回数据时的处理结果,第三个是 Intent data,即携带者要返回的数据

---

参考文档:http://hukai.me/android-training-course-in-chinese/

以上就是Intent的介绍与使用




 


 


 


 


 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

suwu150

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值