Android安卓 按返回键时将activity的数据传递给另一个activity

背景:作业里边有一题,要求为物理按键——返回键,实现数据传递的功能。当点击返回键时,保存已经在当前activity中输入的数据,并将数据传递给目标activity(这里目标activity为mainactivity)。如图↓
在这里插入图片描述

于是先在网上搜索,Android 按返回键怎么传递数据?

网上的描述都很简单,寥寥几行代码。主要有两种方法。

方法一:重写返回键方法

public boolean onKeyDown(int keyCode, KeyEvent event){
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)
        {
     这里写自己的操作,此方法兼容Android 1.0到Android 2.1
 }
    }

我这里的代码:
//注:Intent黄色因为我在搜索Intent。backIntent有下划线是我重复定义了两次,当时写的时候小失误,后面已更正。
在这里插入图片描述
乍一看,这里的代码好像就可以实现功能了。但是实际上运行的时候,并不能达到想要的效果,点击返回时,不但没有保存我在当前activity已经输入的数据,而且还将我的mainactivity给重置为了初始状态。
问题出在哪里呢?问题在于我这里少写了一句话,又多写了一句话。
少写的代码:setResult(RESULT_OK,backIntent);将这句代码加入到最后一行。

该方法的原型:setResult(int resultCode, Intent data)
第一个参数:当Activity结束时resultCode将归还在onActivityResult()中,一般为RESULT_CANCELED , RESULT_OK该值默认为-1。
第二个参数:一个Intent对象,返回给主Activity的数据。在intent对象携带了要返回的数据,使用putExtra( )方法。

加入这句话后,成功实现事件。点击返回键,成功保存数据。直到这里我才得到了启发:实际上我们需要做的事就是,给返回键添加一个相当于确定键的功能。点击返回键,相当于点击了确定键。

确定键的部分代码如下:
在这里插入图片描述
我只需要给返回键添加与确定键一样的返回值,就可以实现事件。点击确定键返回RESULT_OK,即resultCode==RESULT_OK。所以我给上面的代码添加了setResult(RESULT_OK,backIntent);之后,返回键的返回值就跟确定键的返回值一样了。

多的一句话是startActivity(backIntent);
为什么呢?
我们知道,activity的调用实际上在内存中是一个压栈的过程,调用一个activity就压一次栈。
以这个代码为例,这个app有两个activity:
在这里插入图片描述
启动app,首先调用的是LifePriceMainActivity,将该Activity压栈,随后我们通过事件(在这不特别指出调用事件的代码,这不是我们的重点)调用了GoodEditActivity,此时压栈GoodEditActivity。

所以我们不需要为返回键添加startActivity方法,因为点击返回键,GoodEditActivity出栈,LifePriceMainActivity回到栈顶,也就是此时显示的是LifePriceMainActivity,所以调用这个方法是多此一举的,删掉删掉。

完整代码:

    @Override
//    重写物理返回键方法
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if(keyCode == KeyEvent.KEYCODE_BACK){
            String back_name=((EditText)findViewById(R.id.edit_text_good_name)).getText().toString();
            String back_price=((EditText)findViewById(R.id.edit_text_good_price)).getText().toString();

            Intent backIntent = new Intent(GoodEditActivity.this,LifePriceMainActivity.class);
            Bundle back_bundle = new Bundle();
            back_bundle.putCharSequence("back_name",back_name);
            back_bundle.putCharSequence("back_price",back_price);
            backIntent.putExtras(back_bundle);
            setResult(RESULT_OK,backIntent);
            GoodEditActivity.this.finish();
        }
        return super.onKeyDown(keyCode,event);
    }
}

方法二:捕获返回按钮事件


@Override
public void onBackPressed() {
// 这里写自己的操作,该方法仅适用于2.0或更新版的sdk
return;
}

有了上面的思考,用这个方法写就很顺利了,一样的思路,写完操作代码后,加上这句代码setResult(RESULT_OK,backIntent);就可以

完整代码:

    @Override
    //捕获返回按钮事件方法
    public void onBackPressed(){
        Intent backIntent = new Intent();
        backIntent.putExtra("edit_position",editPosition);
        backIntent.putExtra("good_name",editTextGoodName.getText().toString());
        backIntent.putExtra("good_price",Double.parseDouble(editTextGoodPrice.getText().toString()));
        setResult(RESULT_OK,backIntent);
        GoodEditActivity.this.finish();
    }

总结:多思考,多尝试,就会得到启发。(随便吐槽一句,网上这方面的代码好多都没有注释,对初学者太不友好了)

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,这是一个关于Android编程的问题,我来尽可能详细地回答一下。 首先,我们需要明确一下,什么是隐式启动Activity?隐式启动Activity是指当我们不知道或不关心应用程序的包名和类名时,可以通过指定Intent的Action、Category、Data等信息来启动相应的Activity。 下面是实现internet以隐式方式启动Activity并完成数据传递和结果返回的步骤: 1. 在AndroidManifest.xml文件中配置Activity,设置Action、Category、Data等信息。例如: ``` <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> </intent-filter> </activity> ``` 这个配置表示,当系统接收到一个http协议的Intent时,会打开MainActivity这个Activity。 2. 在MainActivity中,获取Intent中的数据。例如: ``` Uri data = getIntent().getData(); ``` 这个代码可以获取到Intent中的Uri数据,也就是访问的网址。 3. 在MainActivity中,将数据传递给另一个Activity。例如: ``` Intent intent = new Intent(); intent.setClass(MainActivity.this, SecondActivity.class); intent.putExtra("data", data.toString()); startActivityForResult(intent, 1); ``` 这个代码会启动另一个Activity,并将data数据传递给它。其中,putExtra()方法用于传递数据,第一个参数是键名,第二个参数是值。 4. 在SecondActivity中,获取传递过来的数据。例如: ``` String data = getIntent().getStringExtra("data"); ``` 这个代码可以获取到MainActivity传递过来的data数据。 5. 在SecondActivity中,将结果返回给MainActivity。例如: ``` Intent intent = new Intent(); intent.putExtra("result", "success"); setResult(RESULT_OK, intent); finish(); ``` 这个代码会将一个结果值返回给MainActivity,并关闭SecondActivity。其中,setResult()方法用于设置结果值,第一个参数是结果码,一般用RESULT_OK表示成功;第二个参数是Intent对象,用于传递结果数据。 6. 在MainActivity中,获取返回的结果。例如: ``` @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 1 && resultCode == RESULT_OK) { String result = data.getStringExtra("result"); if (result.equals("success")) { // 处理成功的情况 } else { // 处理失败的情况 } } } ``` 这个代码会在SecondActivity返回结果后被调用,可以在其中获取到返回的结果值。 以上就是实现internet以隐式方式启动Activity并完成数据传递和结果返回的步骤。需要注意的是,如果要启动一个网页,需要添加INTERNET权限。例如: ``` <uses-permission android:name="android.permission.INTERNET" /> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值