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)