Acitivity加载模式说起
我想实现的一个方案是两个activity相互传递值,而且这两个activity都不finish,而是保持在后台。
当前有四种加载模式android:launchMode
- standard:默认 ,每次在栈内只要startactivity都会产生一个新的activity
- singleTop:栈顶单例,如果此activity在栈顶则不产生新的activity,如果不在栈顶则产生新的activity
- singleTask:栈内单例 ,
- singleInstance:全局单例,在新栈中创建一个activity,并一直保持。
注意当调用finish方法的时候,那么这个activity会被杀死,那么无论什么模式都将直接创建新的activity。
一个activity开启本身activity
当然直接解释文字没有任何说服力,我们直接代码进行展示,然后看出区别;
贴出主要代码
MainActivity
//在界面显示一个TEXT展示出ACTIVITY的实例编号,和TASK编号 TextView textView = (TextView) findViewById(R.id.text); textView.setText("Activity为"+ this.toString() + "\n" + "Task ID为:"+ this.getTaskId());//点击按钮开启新的activity,这里每次都开启mainactivity FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this,MainActivity.class); startActivity(intent); } });
分别四种模式比较
- standard: 栈不变,acitivity编号改变。结论:每次开启新的activity
- singleTop: 栈不变,acitivity编号不变。结论:没有开启新的activity
- singleTask: 栈不变,acitivity编号不变。结论:没有开启新的activity
- singleInstance: 栈不变,acitivity编号不变。结论:没有开启新的activity
一个acitivity开启另一个activity
MainActivity.java
TextView textView = (TextView) findViewById(R.id.text); textView.setText("Activity为"+ this.toString() + "\n" + "Task ID为:"+ this.getTaskId()); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivity(intent); } });
SecondActivity.java
TextView textView = (TextView) findViewById(R.id.text2); textView.setText("Activity为"+ this.toString() + "\n" + "Task ID为:"+ this.getTaskId()); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab2); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(SecondActivity.this,MainActivity.class); startActivity(intent); } });
mainActivity—standard
SecondActivity–standard
这样会不断创建新的activity。
mainActivity—singleTop
SecondActivity–standard
同上,也不断创建新的acitivity
mainActivity—singleTask
SecondActivity–standard
MainActivity是唯一的,而SecondAcitivity每次都创建新的
mainActivity—singleInstance
SecondActivity–standard
栈号不同,两者的activity都没生成新的。两者不在同一个栈中,而且按返回按钮每次都生成在新的栈中。
mainActivity—singleTask
SecondActivity–singleTask
SecondActivity每次都创建新的。因为singletask模式是在同一个栈中的,而栈中的两个activity不能相互调换位置,不是说用谁谁就在最上面。
mainActivity—singleTask
SecondActivity–singleInstance
这两个activity分别在两个不同的栈中,所以都可以保持,而不需要销毁。符合我所想的需求,但是按返回按钮时候会finish掉activity所以在此需要重写返回键的方法。
因为我要做的是搜索功能,研究了一下淘宝,他是通过MAIN–>(startActivity)字符串Search–>(startActivityforresult)search页面。每次都是开启新的Search页面,而保持前两个页面。
而我的搜索功能需求是,Main–>(startactivityforresult)字符串search–>传回给MAIN页面进行搜索。我的实现方式是每次对字符串search页面进行刷新。
那么最后我没有运用singleinstance虽然符合我的需求,但是我没有运用它来解决我的问题。
更多相关文章
- Android与Flutter桥接指南
- Android(安卓)数据库创建字段时的数据类型
- Android(安卓)OpenGL ES 绘图 --简单绘图
- Android中定时任务的实现(总结)
- 卷二 Dalvik与Android源码分析 第二章 进程与线程 2.2 Dalvik线
- android studio 2.3.1 NDK开发入门实例
- android:taskAffinity使用详解
- Android(安卓)的一些基本问题解决方法(android studio)
- MTP 看不到软件创建的文件夹(Android端)