Activity的总结(二)
2017-07-03 16:57
190 查看
关于Activity的含义,创建,启动,生命周期,请查看Activity的总结(一)。
此篇博客是关于Activity使用intent进行通信和Activity启动模式的介绍。
1.Activity通过startActivity方法使用Intent进行传值:
(1)使用Intent的putExtra方法传值:
MainActivity.java文件中传递参数:
SecondActivity.java文件中接收参数:
在onCreate方法中:
(2)使用Bundle传递参数:
MainActivity.java文件中传递参数:
SecondActivity.java文件中接收参数:
在onCreate方法中:
2.使用startActivityForResult方法进行回传值
Activity使用Intent进行回传值只需要三步:
(1)在MainActivity中将上述中的startActivity(intent)方法替换为startActivityForResult(intent, requestCode)进行跳转。
(2)在SecodActivity中使用setResult(resultCode, intent)给MainActivity回传值。
(3)在MainActivity中实现onActivityResult(int requestCode, int resultCode, Intent data)方法接收值。
如有需要请下载使用intent传值和回传值的demo。
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属性进行设置:
(2)通过Intent启动Activity的时候,通过添加标志位来进行设置:
关于intent的flag标志说明请查看https://wangkuiwu.github.io/2014/06/26/IntentFlag/
此篇博客是关于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/
相关文章推荐
- 总结:AppWidget Notification PendingIntent Activity...
- Android Activity生命周期总结
- android从一个activity跳到另一个activity 报错 经验总结
- ApiDemo的学习总结,个人心得,App模块之Activity
- 基础总结篇之二:Activity的四种launchMode (转载 liuhe688)
- Android中Activity之间数据传递的几种方法总结
- activity生命周期总结
- Android Activity总结
- android,activity界面编程总结
- android startActivityForResult(Intent intent, int requestCode) 整理与总结!
- 屏蔽Activity, Dialog风格Activity, AlertDialog的Home键功能方法(总结)
- activity标签总结2
- Activity生命周期总结
- 基础总结篇之三:Activity的task相关
- Android中Activity生命周期学习总结。
- 总结Android中TabActivity 的使用方法
- Activity总结
- 总结篇之一:Activity生命周期
- 基础总结篇之一:Activity生命周期 (转载liuhe688)
- 基础总结篇之三:Activity的task相关 (转载liuhe688)