您的位置:首页 > 其它

Activity的总结(二)

2017-07-03 16:57 190 查看
关于Activity的含义,创建,启动,生命周期,请查看Activity的总结(一)

此篇博客是关于Activity使用intent进行通信和Activity启动模式的介绍。

一.Acitivity之间通信

Activity使用Intent跳转进行传值和回传值,以MainActivitiy跳转SecondActivity为例进行说明:

1.Activity通过startActivity方法使用Intent进行传值:

(1)使用Intent的putExtra方法传值:

MainActivity.java文件中传递参数:

Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("name", "test");
intent.putExtra("type", 1);
intent.putExtra("flag", true);
startActivity(intent);


SecondActivity.java文件中接收参数:

在onCreate方法中:

String name = getIntent().getStringExtra("name");
int type = getIntent().getIntExtra("type", 0);
boolean flag = getIntent().getBooleanExtra("flag", false);


(2)使用Bundle传递参数:

MainActivity.java文件中传递参数:

Intent intent = new Intent(this, SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name", "test");
bundle.putInt("type", 2);
bundle.putBoolean("flag", true);
intent.putExtra("bundle", bundle);
startActivity(intent);


SecondActivity.java文件中接收参数:

在onCreate方法中:

Bundle bundle = getIntent().getBundleExtra("bundle");
String name = bundle.getString("name");
int type = bundle.getInt("type", 0);
boolean flag = bundle.getBoolean("flag", false);


2.使用startActivityForResult方法进行回传值

Activity使用Intent进行回传值只需要三步:

(1)在MainActivity中将上述中的startActivity(intent)方法替换为startActivityForResult(intent, requestCode)进行跳转。

Intent intent = new Intent(this, SecondActivity.class);
startActivityForResult(intent, 100);


(2)在SecodActivity中使用setResult(resultCode, intent)给MainActivity回传值。

Intent intent = new Intent();
intent.putExtra("result", name);
setResult(200, intent);


(3)在MainActivity中实现onActivityResult(int requestCode, int resultCode, Intent data)方法接收值。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(data != null){
switch(requestCode){
case 100:
if(resultCode == 200){
String result = data.getStringExtra("result");
textView.setText(result);
}
break;
}
}

}


如有需要请下载使用intent传值和回传值的demo

二.Activity的四种启动模式

正常情况下,启动多个相同Activity的时候会默认新建多个实例,并将他们入栈。为了优化这个问题,提供了四种启动模式。

1.四种启动模式:

假设A,B,C,D代表四个Activity。

(1)standard:

系统默认模式,每次启动一个Activity都会重新创建一个新的实例,而不管Activity是否已经创建了一个实例。谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中。

例子:

A跳转B,B跳转到C,C再跳转到C,C为standard模式:

栈内情况为:A->B->C->C

(2)singleTop:

栈顶复用模式,如果需要启动的activity已经位于栈顶,则不需要创建新的Activity而直接引用这个Activity,调用它的onNewIntent方法。如果栈顶不存在该Activity的实例,则会创建新的Activity实例。

例子:

如果A跳转B,B跳转到C,C再跳转到C,C为singleTop模式:

则栈内情况为:A->B->C

如果如果A跳转B,B跳转到C,C再跳转到A,A为singleTop模式:

则栈内情况为:A->B->C->A

(3)singleTask:

栈内复用模式,如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法。

这个过程还存在一个任务栈的匹配,因为这个模式启动时,会在自己需要的任务栈中寻找实例,这个任务栈就是通过taskAffinity属性指定。(taskAffinity默认是包名)如果这个任务栈不存在,则会创建这个任务栈。

此种模式通常用于应用中的主页面。

例子:

如果A跳转B,B跳转到C,C再跳转到C,C为singleTask模式:

则栈内情况为:A->B->C

如果如果A跳转B,B跳转到C,C再跳转到A,A为singleTask模式:

则栈内情况为:A

此时会将原先栈中A上面的B和C销毁。

(4)singleInstance:

单实例模式,具有singleTask所有特点,并且此种模式下Activity只有一个实例,并且只能单独的存在一个任务栈中。

在一个新栈中创建该Activity实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity的实例存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。

2.启动模式的设置方法:

(1)在清单文件中通过launchMode属性进行设置:

<activity android:name=".SecondActivity"
android:launchMode="singleTask">
</activity>


(2)通过Intent启动Activity的时候,通过添加标志位来进行设置:

Intent intent = new Intent(this, SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);


关于intent的flag标志说明请查看https://wangkuiwu.github.io/2014/06/26/IntentFlag/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息