定义
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是写到持久化存储单元里的;
老师的笔记上有把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();
}