Intent的隐式用法
隐式Intent是通过对注册Activity是自定义了一些action、category属性,然后在代码中通过new Intent(“android.intent.action.自定义action”)启动,或者在代码中添加intent.addCategory(“android.intent.category.自定义category”),再通过startActivity(Intent intent)的方式启动。代码如下:
<activity
android:name=".SecondActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.SECONDACTIVITY" />
<category android:name="android.intent.category.MYCATEGORY"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com"));
//隐式Intent打开浏览器
//然后通过 Uri.parse()方法,将一个网址字
//符串解析成一个 Uri 对象,再调用 Intent 的 setData()方法将这个 Uri 对象传递进去
startActivity(intent);
}
});
}
setData():接收一个 Uri 对象。指定当前 Intent 正在操作的数据,而
这些数据通常都是以字符串的形式传入到 Uri.parse()方法中解析产生的。
< intent-filter>标签中还可配置< data>标签,有以下内容:
1.android.scheme : 用于指定数据协议部分,例如http://;
2.android.host : 用于指定数据的主机名部分,如:www.baidu.com;
3.android:port : 用于指定数据的端口部分,紧随在主机名之后;
4.android:path : 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容;
5.android:mimeType : 用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
隐式Intent用来打电话的时候代码如下:
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setdata(Uri.parse("tel:10086"));//双引号中的字符串的格式都是固定的,例如电话的tel:是小写的字母,换成大写的则不能启动打电话的View
startActivity(intent);
Intent数据的互相传输
1.从一个活动【传入】另一个活动
在需要传数据的地方加入如下代码:
@Override
public void onClick(View v) {
String str = "7月过N3!!!";
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("flag", str);
startActivity(intent);
}
在被启动的activity中加入如下代码:
Intent intent = getIntent();
数据类型 引用 = intent.get数据类型Extra();
最后使用获取的数据。
2.从一个活动【返回】一个数据回一个活动
在发送数据的地方写类似如下代码:
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);//第二个参数是请求码,只要是一个唯一值就可以了,这里传入了1。
}
在另一个启动的activity中设置要返回的数据:
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("SecondActivity", "Hello Ativity");
setResult(RESULT_OK, intent);//这个方法十分重要,是专门用于向上一个活动返回数据的
//一 般只 使用 RESULT_OK 或RESULT_CANCELED 这两个值,第二个参数则是把带有数据的 Intent 传递回去,然后调用
//了 finish()方法来销毁当前活动
finish();
}
再回到需要接受数据的activity,重写如下方法接收数据:
/**
* 第一个参数 requestCode,即我们在启动活动时传入的请求码。用来判断数据的来源,既从哪个activity传回来的
* 第二个参数 resultCode, 即我们在返回数据时传入的处理结果,根据具体的使用场景使用
* 第三个参数 data,即携带着返回数据的 Intent。
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case 1:
if(resultCode == RESULT_OK){
String returnedData = data.getStringExtra("SecondActivity");
Log.i("FirstActivity", returnedData);
}
}
}
如果是按下Back键的数据返回需要在当前的activity中重写onBackPressed()方法:
@Override
public void onBackPressed(){
Intent intent = new Intent();
intent.putExtra("flag", "传递信息");
setResult(RESULT_OK, intent);
finish();
}
这一篇关于intent数据之间传递的内容十分重要,在今后的开发当中可能经常会用到,所以要熟练掌握并灵活使用。