[Android应用]Android开发基础之Activity界面的跳转,组件间的数据传递

定义

Activity是Android组件中最基本也是最为常见用的四大组件之一

常见的Activity跳转方式

1.显示跳转

Intent intent = new Intent(MainActivity.this, AcitivityA.class); 
startActivity(intent );

一般应用内部跳转会经常使用该方法。

2.隐式跳转

Intent intent = new Intent(); 
intent.setAction("com.test.start.action"); 
//可不添加category,因为默认会添加 Intent.CATEGORY_DEFAULT
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);

不需要指定跳转的Activity名字,只需双方协定好指定的action即可,该方法一般常用于外部应用跳转。

//可不添加category,因为默认会添加 Intent.CATEGORY_DEFAULT,但是如果你要跳转到非 Intent.CATEGORY_DEFAULT,就必须得带上category,否则会匹配失败;隐形跳转也可以采用data进行匹配,详见后面的浏览器跳转;

3.通过ComponentName跳转

Intent intent = new Intent(); 
ComponentName componentName = new ComponentName("com.test.helleworld", "com.test.helloworld.ActivityA"); 
intent.setComponent(componentName); 
startActivity(intent);

通过组件名称跳转需要知道包名和Activity名称,该方法一般用于外部应用跳转。

4.通过包名、类名跳转

Intent intent = new Intent(); 
it.setClassName("com.test.helleworld", "com.test.helloworld.ActivityA"); 
startActivity(intent);

与上述第三种方法类似,都需要知道包名和Activit名称,其实setClassNmae里面也是通过设置ComponentName的,该方法一般用于外部应用跳转。

5.根据包名跳转

PackageManager pm = getPackageManager(); 
Intent intent = pm.getLaunchIntentForPackage("com.test.helloworld"); 
//it.setAction("android.intent.action.MAIN"); 
startActivity(intent);

根据应用包名跳转,这里打开的是跳转应用的默认启动Activity。

 

组件之间的数据传输

基本数据类型的传输

复习一下java的四类八种

1、整型:byte 、short 、int 、long

2、浮点型:float 、 double

3、字符型:char

4、布尔型:boolean

发送数据的Activity

Intent intent = new Intent(this,SecondActivity.class);
intent.putExtra("booleanKey",true);
intent.putExtra("byteKey",(byte)1);
intent.putExtra("shortKey",(short)1);
intent.putExtra("intKey",1);
intent.putExtra("longKey",4l);
intent.putExtra("floatKey",1.1f);
intent.putExtra("doubleKey",0.6d);
intent.putExtra("charKey",'*');
startActivity(intent);

接收数据的Activity

Intent intent = getIntent();
if (intent != null) {
    boolean booleanValue = intent.getBooleanExtra("booleanKey",false);
    byte byteValue = intent.getByteExtra("byteKey",(byte)0);
    short shortValue = intent.getShortExtra("shortKey",(short)0);
    int intValue = intent.getIntExtra("intKey",0);
    long longValue = intent.getLongExtra("longKey",0l);
    float floatValue = intent.getFloatExtra("floatKey",0.0f);
    double doubleValue = intent.getDoubleExtra("doubleKey",0.0d);
    char charValue = intent.getCharExtra("charKey",' ');
    Log.d(TAG, "booleanValue = " + booleanValue);
    Log.d(TAG, "byteValue = " + byteValue);
    Log.d(TAG, "shortValue = " + shortValue);
    Log.d(TAG, "intValue = " + intValue);
    Log.d(TAG, "longValue = " + longValue);
    Log.d(TAG, "floatValue = " + floatValue);
    Log.d(TAG, "doubleValue = " + doubleValue);
    Log.d(TAG, "charValue = " + charValue);
}

getXXXExtra方法必须得提供一个默认值,另外要判断intent不为null;

引用数据类型的传输

Android Api已经封装了对String类型传输的方法,另外getStringExtra不需要提供一个默认值;默认值为null;

intent.getStringExtra("stringKey");

我们按照类似String的方式实现引用数据类型序列化的接口;

java采用的是Serializable,打开String.java看一下;

也可以采用Android的Parcelable;

两者的不同是Parcelable比较高效,它是写到内存里的,Serializable是写到持久化存储单元里的;

24、Android开发基础之组件之间的数据传输

老师的笔记上有把User序列化的代码;

隐式跳转的data约束

打开浏览器并打开百度的网址;

打开源码Browser2的AndroidManifest.xml,查看源码中浏览器的scheme约束,以http://或者https://起始;

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="http" />
    <data android:scheme="https" />
</intent-filter>

传输数据:

Intent intent = new Intent("android.intent.action.VIEW");
intent.setData(Uri.parse("https://www.baidu.com/"));
startActivity(intent);

在另外一个界面,通过getData可以获取数据,包括约束:https://www.baidu.com/

数据回传

前面用的都是startActivity,而数据回传需要用到startActivityForResult

ActivityA通过startActivityForResult(Intent intent, int requestCode)方法传递意图和请求码给ActivityB,ActivityB通过setResult(int resultCode)或者setResult(int resultCode, Intent data)传递单返回码或者是返回码+意图,当你需要返回返回码给ActiivityA之外还需要传递数据时,可以采用后者。ActivityA通过重写onActivityResult,先判断请求码,再判断返回码(同一个Activity会有多种请求码或者多种返回码的情况);

ActivityA:

    public void recharge(View view){
        Intent intent = new Intent(this, ResultActivity.class);
        startActivityForResult(intent, requestCodeChrager);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == requestCodeChrager ){
            if(resultCode == 2){
                mRechargeResultTV.setText("充值成功,充值金额为"  + data.getIntExtra("charge",1));
            } else if (resultCode == -1){
                mRechargeResultTV.setText("充值失败");
            }
        }
    }

ActivityB:

    public void okRechargeBtn(View view){
        String targetInputText = mChargeInput.getText().toString().trim();

        if (TextUtils.isEmpty(targetInputText)) {
            Toast.makeText(this,"您没有输入金额",Toast.LENGTH_SHORT).show();
        }else {
            int targetInputInt = Integer.parseInt(targetInputText);
            Intent resultIntent = new Intent();
            resultIntent.putExtra("charge",targetInputInt);
            setResult(2,resultIntent);
            finish();
        }
    }

    public void cancelRechargeBtn(View view){
        setResult(-1);
        finish();
    }

相机拍照数据回传

参考

24、Android开发基础之组件之间的数据传输

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值