Intent是什么?
Intent 是Android程序中各个组件之间进行交互的重要方式之一,它既可以在当前Activity中指定想要完成的动作,还可以在不同组件间进行数据传递。
Intent可分为两种,显示Intent和隐式Intent。
1.显示Intent
使用构造方法实例化一个显示Intent:
Intent(Context pageContext,Class<?> cls)
- 参数Context 指定启动活动的上下文,一般为当前Activity
- 参数Class 指定启动的目标活动,通过这个构造函数就可以构造出代表我们”意图”的Intent对象。
mybutton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { #构造了一个Intent(显示Intent) #FirstActivity.this作为上下文,SecondActivity.class作为目标活动 #这样明确了我们的意图: #在FirstActivity这个活动中通过点击mybutton按钮打开SecondActivity这个活动 Intent intent = new Intent(FirstActivity.this,SecondActivity.class); #执行该意图操作 startActivity (intent); } });
startActivity() 方法是Activity类中提供的,专门用于启动活动的方法,它接收一个Intent对象。
2.隐式Intent
不指定要启动哪个活动,而是通过配置一些相关信息如:action,category等信息,然后交给系统去分析并找出合适的活动去启动。
每个Intent中只能指定一个action,但却能指定多个category。
Action:用来指明要实施的动作是什么,比如说ACTION_VIEW, ACTION_EDIT等。
具体的可以查阅android SDK-> reference中的Android.content.intent类,里面的constants中定义了所有的action。
一些常用的Action:
ACTION_CALL 启动一个电话.
ACTION_EDIT 显示用户编辑的数据.
ACTION_MAIN 作为Task中第一个Activity启动
ACTION_SYNC 同步手机与数据服务器上的数据.
ACTION_BATTERY_LOW 电池电量过低警告.
ACTION_HEADSET_PLUG 插拔耳机警告
ACTION_SCREEN_ON 屏幕变亮警告.
ACTION_TIMEZONE_CHANGED 改变时区警告.
Category:一个字符串,包含了关于处理该intent的组件的种类的信息。一个intent对象可以有任意个category。
intent类定义了许多category常数.
addCategory() 为一个intent对象增加一个category,
removeCategory() 删除一个category,
getCategories() 获取intent所有的category.
mybutton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { #初始化了一个Intent对象,并指定action参数 Intent intent = new Intent("android.intent.action.ALL_APPS"); #添加一个category intent.addCategory("com.example.intent_test.MY_CATEGORY"); startActivity (intent); } });
为了能使SecondActivity能继续响应该Intent,我们可以在AndroidManifest.xml文件下的<Activity>标签下配置<intent -filter>的内容,来指定当前活动能够响应的action和category:
<intent-filter> <action android:name="android.intent.action.ALL_APPS"/> <category android:name="android.intent.category.DEFAULT"></category> <category android:name="com.example.intent_test.MY_CATEGORY"/> </intent-filter>
通过Intent向下一个活动传递数据
在当前活动中调用PutExtra()方法把要传递的数据暂存在Intent中,并在新启动的Activity中取出Intent中的数据即可。
putExtra()方法接收两个参数
- 第一个是键
- 第二个是值,代表真正要传递的数据。
把FristActivity中的一个字符串传递到SecondActivity中,就可以如下方式实现:
mybutton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String data = "I com from FirstActivity"; Intent intent = new Intent(FirstActivity.this,SecondActivity.class); intent.putExtra("extra_data",data); startActivity(intent); } });
在SecondActivity中将Intent对象中的数据取出,并进行其他操作,代码如下:
public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Intent intent = getIntent(); String data = intent.getStringExtra("data"); Toast.makeText(SecondActivity.this, data, Toast.LENGTH_LONG).show(); } }
通过Instent对象返回数据给上一个活动
startActivityForResult()方法,也是用来启动活动的,但是这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
接收两个参数
- 第一个是Intent
- 第二个是请求码用于判断回调的来源,请求吗必须唯一。
用法如下:
1.在FristActivity中启动SecondActivity
mybutton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this,SecondActivity.class); #启动SecondActivity startActivityForResult(intent,1 ); } });
2.在SecondActivity中添加返回数据的逻辑
setResult()方法。该方法专门用于向上一个活动返回数据,接收两个参数,第
- 第一个参数用于向上一个活动返回处理结果
- 第二个参数则是把带有数据的Intent传递回去。
mybutton2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.putExtra("return_date","I com from SecondActivity"); setResult(RESULT_OK,instent); finish(); } });
3.在FristActivity中重写onActivityResult()方法
在SecondActivity被销毁之后会回调上一个活动的onActivityResult()方法
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 1: if (resultCode == RESULT_OK) { String returnData = data.getStringExtra("data_result"); Toast.makeText(this, returnData, Toast.LENGTH_LONG).show(); } break; default: break; } }
end.