如何使用Intent在活动中穿梭

显式Intent的使用

  • Intent的 Intent(Context packageContext,Class<?> cls),这个函数中,第一个参数Context要求提供一个启动活动的上下文,第二个参数Class则是指定想要启动的目标活动。Activity类中提供一个startActivity()方法,专门用来启动活动
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivity(intent);
     }
 });

隐式Intent的使用

  • 隐式Intent不明确指出要启动哪个活动,而是指定了一系列更为抽象的action和category等信息,由系统分析Intent并帮我们找出合适的活动去启动。
  • 只有<action>和<category>中的内容同时能匹配上Intent中指定的action和category时,这个活动才能响应这个Intent。
  • 一个Intent中只能指定一个action,而可以指定多个category。可以调用Intent中的addCategory()来添加一个category,添加之后,需要在<intent-filter>标签中添加一个category的声明,否则会导致程序的崩溃。

向下一个活动传递数据

  • Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递数据暂存在Intent中,启动了另一个活动之后,只需把这些数据再从Intent中拿出来即可。
public void onClcik(View v){
    String data = "Hello SecondActivity";
    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    intent.putExtra("extra_data",data);
    startActivity(intent);
}

putExtra()方法中接收两个参数,第一个是键,用于后面从Intent中取值,第二个才是真正要传递的数据。

  • 如上代码所示,将字符串data存储在Intent中后,要在SecondActivity中用到时,方法如下所示:
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_layout);
    Intent intent = getIntent();
    String data = intent.getStringExtra("extra_data");
    Log.d("SecondActivity",data);
 }

首先通过getIntent()方法获取用于启动SecondActivity的Intent,然后调用getStringExtra()方法,传入相应键值。

返回数据给上一个活动

  • Activity中还有一个startActivityForResult()方法,期望在活动销毁时能返回一个结果给上一个活动。这个方法有两个参数,第一个仍是intent,第二个是请求码,用于在之后的回调中判断数据的来源。
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
        startActivityForResult(intent,1);
    }
}

这里使用startActivityForResult()方法来启动SecondActivity,请求码只要是一个唯一值即可。在SecondActivity中给按钮注册点击事件,并在点击事件添加返回数据的逻辑

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_layout);    
    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中后,调用了setResult()方法,专门用于向上一个活动返回数据的。此方法接收两个参数,第一个用于向上一个活动返回处理结果,一般只使用RESULT_OK或RESULT_CANCELED,第二个则是把带有数据的Intent传递回去,然后用finish()方法销毁当前活动。

  • 由于我们是使用startActivityForResult()方法来启动SecondActivity的,活动被销毁后会回调回上一个活动的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,即在我们返回数据时传入的处理结果(判读数据处理是否成功)。第三个是data,即携带数据返回的Intent。

发布了25 篇原创文章 · 获赞 18 · 访问量 2126

猜你喜欢

转载自blog.csdn.net/weixin_43568110/article/details/94863165