记录Android学习-更多隐式Intent的用法

使用隐式Intent,不仅可以启动自己程序内的活动,也可以启动其他程序内的活动。可以实现不同Android应用程序之间的功能共享

举个栗子:在自己的活动中调用系统的浏览器打开网页

button1.setOnClickListener(new onClickListener() {
	@Override
	public void OnClick(View v) {
		//指定Intent的action时Intent.ACTION_VIEW,这是android系统的内置动作
		Intent intent = new Intent(Intent.ACTION_VIEW);
		//通过Uri.parse()方法将网址字符串解析成Uri对象,用setData()方法将Uri传入
		intent.setData(Uri.parse("http://www.baidu.com"));
		startActivity(intent);
						
		//另一种写法
		Uri webViewUri = Uri.parse("http://www.baidu.com");
		Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri);
		startActivity(intent);
	}
})

与此对应,可以再<intent-filter>标签中再配置一个<data>标签,用于更精确的指定当前活动能够响应什么类型的数据

<data>标签中主要可以配置以下内容:

android:scheme - 用于指定数据的协议部分,如上例中的http部分

android:host - 用于指定数据的主机名部分,如上例的www.baidu.com部分

android:port - 用于指定数据的端口部分

android:path - 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容

android:mimeType - 用于指定可以处理的数据类型,允许使用通配符的方式进行指定

只有在<data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应Intent。

 

在使用Intent的过程中,我们不仅可以用它来启动活动,可以在启动活动时携带数据给下一个活动

Intent 中提供了一系列 putExtra() 方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出即可。

------FirstActivity------
button1.setOnClickListenerI(new View.onClickListener() {
	@Override
	public void onClick(View v) {
		String data = "Hello SecondActivity";
		Intent intent = new Intent(FirstActivity.this, SencondActivity.class);
		intent.putExtra("extra_data", data);
		startActivity(intent);
	}
});
		
------SecondActivity------
public class SecondActivity extends AppCompateActivity {
	@Override
	protected void onCreat(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.second_layout);
		Intent intent = getIntent();
		String data = intent.getStringExtra("extra_data");
		Log.d("SecondAcitvity", data);
	}
}

通过 getIntent() 方法获取到用于启动SecondActivity 的Intent,然后调用getString Extra()方法,传入相应的键值,就可以得到传递的数据了。

  • getString Extra() - 传递字符串型
  • getInt Extra() - 传递整型
  • getBooleanExtra() - 传递布尔型

既然可以在启动下一个活动的同时携带数据传递给它,那么能不能给上一个活动也传递信息呢,答案是:那不必须的嘛。

由于返回上一个活动只需要按一下Back键就可以了,所以不需要使用一个启动活动Intent来传递数据。

使用StartActivityForResult() 也可以用去启动活动,但这个方法的期望是在活动销毁时能够返回一个结果给上一个活动

StartActivityForResult() 接收两个参数,Intent和请求码

------FirstActivity------
button1.setOnClickListener(new onClickListener() {
	@Override
	public void onClick(View v) {
		Intent intent = new Intent(FirstActivity.this, SecondActivity.this);
		startActivityForResult(intent, 1);
	}
})
				
//由于我们是使用startActivityForResult()方法来启动SencondActivity的,在SecondActivity销毁之后会回调上一个活动的onActivityResult()
//因此我们需要在FirstActivity中重写这个方法来得到返回的数据
    @Override
	//onActivityResult()方法带有三个参数:requestCode - 启动活动时传入的请求码,resultCode - 返回时传入的处理结果,data - 携带返回数据的Intent
	proctected void onActivityResult(int requestCode, int resultCode, Intent data) {
	    //判断数据来源,确定数据是从SecondActivity返回的
		swtich (requsetCode) {
			case 1:
			//通过resultCode的值来判断处理结果是否成功
				if (resultCode == RESULT_OK) {
					String returnedData = data.getStringExtra("data_return");
					Log.d("FristActivity", returnedData);
				}
		}
	}
------SecondActivity------
public class SecondActivity extends AppCompatAcitvity {
	@Override
	proctected void onCreat(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.scend_layout);
		Button button2 = (Button)findViewById(R.id.button_2);
		button2.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
			//构建一个Intent 仅仅用于传递数据,没有指定任何的“意图”
				Intent intent = new Intent();
				intent.putExtra("data_return", "Hello FirstActivity");
			//调用setResult() - 专门用于向上一个活动返回数据
			//setResult()接收两个参数:1-返回处理结果,一般为RESULT_OK/RESULT_CANCELED;2-带有数据的Intent
				setResult(RESULT_OK, intent);
				finish();
			}
		});
	}
}

这个时候有一个疑问,如果我们使用Back键的话就不会给上一个活动返回数据了,这可真的是太在糟糕了,不过,不用担心,我们可以重写onBackPressed()来解决这个问题

@Override
public void onBackPressed() {
	Intent intent = new Intent();
	intent.putExtra("data_return", "Hello FristActivity");
	setResult(RESULT_OK, intent);
	finish();
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值