一、介绍
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的介绍与使用