1、首先在需要跳转的Activity写此代码:
Intent intent = new Intent(from, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("flag", 3);
startActivity(intent);
2、在MainActivity中写此代码:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
int mFlag = intent.getIntExtra("flag", 0);
if (mFlag == 3) { //判断获取到的flag值
changeTab(mFlag);
}
}
// 跳转到对应的fragment
public void changeTab(int position) {
switch (position) {
case 0:
mRgTab.check(R.id.rb_0);
break;
case 1:
mRgTab.check(R.id.rb_1);
break;
case 2:
mRgTab.check(R.id.rb_2);
break;
case 3:
mRgTab.check(R.id.rb_3);
break;
}
}
Activity的启动模式有四种:
standard 默认的启动方式。在该模式中,每启动一个新活动,都会创建一个新的实例,并在任务栈中入栈,处于栈顶的位置。假设你不停地进入同一个活动,你点击了十次,就要返回十次才能退出程序,因为你在返回栈中创造了十个相同的实例,尽管活动是一样的。
singleTop 栈顶单实例。启动一个新活动时,系统会检查该活动是否已经位于任务栈栈顶,如果是的话直接使用已存在的栈顶活动,否则就创建新活动并压入栈顶。
(当该activity处于task栈顶时,可以复用,直接onNewIntent)
singleTask 栈中单实例。 和 singleTop 类似,不过这里是检查整个任务栈的活动,如果发现已经存在该活动就将位于该活动上方的活动全部出栈,该活动成为新的栈顶。
(oncreate该activity并销毁在他之上的其他activity)
singleInstance 全局单实例。最特殊的模式,系统为该模式的活动分配一个独立的任务栈,该任务栈有且只有一个该活动实例。也就是说,如果已经创建过目标活动实例,那么将不会创建新的任务栈,而是唤醒之前创建过的活动实例。
(应用场景:地图,Activity初始化需要大量资源)
这四种模式中,standard模式是默认的模式,其他三个想要使用的话,要在 AndroidMainFest 文件中进行修改(通过给对应的 activity 设置 launchMode 属性)。
上面分析的启动模式都是静态设置的,也就是在 Manifest 文件中设置的。
Task
Task就是一个任务栈,里面用来存放Activity,第一个进去的(Activity)处于栈的最下面,而最后创建的(Activity)则处于栈的最上面。从Task中取出(Activity)是从最顶端取出,也就是说先进后出,后进先出。而Activity在Task中的顺序是可以控制的,在Activity跳转时用到Intent Flag可以设置新建Activity的创建方式。
详细的概念可以查找与Intent的Flag标志相关的资料。
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP ||Intent.FLAG_ACTIVITY_CLEAR_TOP);
这行代码的意思是 不再启动新的activity,并且系统会把要启动的Activity之上的Activity全部d出栈空间。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)