Android开发,关于启动模式一点研究(Launch Mode)

网上分析设计模式的很多很多,都很详细,写这个只是为了自己能深刻认识一遍。

android启动模式有以下几种:standard、singleTop、singleTask、singleInstance

我对他们的效果进行了测试

下面是我进行测试书写的三个activity

public class LaunchFirstActivty extends AppCompatActivity {

    private ArrayList<String> activityList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_launch_mode_activty);
        if (getIntent().hasExtra("list")){
            activityList = getIntent().getStringArrayListExtra("list");
        }
        activityList.add(this.toString().substring(this.toString().lastIndexOf("."))+"");
        ListView listView = (ListView) findViewById(R.id.list1);
        listView.setAdapter(new Adapter());
        findViewById(R.id.btnmode1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), LaunchFirstActivty.class);
                intent.putStringArrayListExtra("list", activityList);
                startActivity(intent);
            }
        });
        findViewById(R.id.btnmode2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), LaunchSecendActivity.class);
                intent.putStringArrayListExtra("list", activityList);
                startActivity(intent);
            }
        });

        findViewById(R.id.btnmode3).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), LaunchThirdActivity.class);
                intent.putStringArrayListExtra("list", activityList);
                startActivity(intent);
            }
        });
    }

    public class Adapter extends BaseAdapter {

        @Override
        public int getCount() {
            return activityList.size();
        }

        @Override
        public Object getItem(int position) {
            return activityList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView view = new TextView(getApplicationContext());
            view.setTextColor(ContextCompat.getColor(getApplicationContext(),R.color.colorPrimaryDark));
            view.setText(activityList.get(position));
            return view;
        }
    }

}


这是第一个,剩下两个和这个一模一样,他们的xml文件一样,拥有三个按钮和一个listview

两个按钮用来指向另外两个activity

一个listview用来显示这些跳转的activity的信息

1、Standard 标准模式

允许存在相同的activity实例

这是不需要设置,默认采用的启动模式,使用这个方式,每次启动activity,都会新打开一个activity,这个activity与以前打开的activity是不一样的

根据下面的列表,可以看出,我是从FirstActivity跳转到SecendActivity再跳转到FirstActivity这样重复了几遍。

根据@后面的序列号可以看出,每个activity都不是同一个activity。

采用这个启动模式,每次启动一个activity都顺序添加到了任务栈中。


2、SingleTop 模式

该模式的意思是,可以允许存在相同的Activity,但是不允许出现重复的Activity(仅针对设置的那个Activity)。

比如我从FirstActivity中启动FirstActivity,就只会使用原先的FirstActivity,而不会创建新的。

但是如果从FirstActivity启动SecendActivity,再启动FirstActivity,这里的FirstActivity就和原先的FirstActivity不是同一个了。

这里我将SecendActivity设置为singleTop模式。

图上可能看不出来,我在SecendActivity中点击跳转到Secend是无效的,它会保持当前界面不变。只调用了SecendActivity的OnNewIntent方法。


3、SingleTask 模式

不允许存在相同的Activity(仅针对设置的那个Activity),如果启动的Activity在栈中已经存在,系统会把该Activity之后的所有Activtiy都给出栈。

比如设置FirstActivity为SingleTask,从FirstActivity启动SecendActivity,再启动ThirdActivity,再启动FirstActivity,这时候系统会把SecendActivity和ThirdActivity都finish了,这样FirstActivity就提升到了最上面。这时候点finish,就不能退回到SecendActivity了。

在这里我尝试同时设置两个SingleTask,最后结果是谁在中间谁完蛋。。。


4、SingleInstance 模式

不允许存在相同的Activity(仅针对设置的那个Activity),设置该模式的Activity不属于其他Activity所在的任务栈中,它独享一个任务栈,只要该任务栈中存在这个Activity,无论怎么启动,都只使用该Activity。

可以看到,上面三个FirstActivity都是相同的,说明都是同一个Activity

这里需要注意一点,因为使用的相同的Activity,所以每次启动的时候,都只是将该Activity调到了上层,所以不会再经过OnCreate阶段,处理Intent的方法、adapter的notify、数据更新等操作需要在OnNewIntent中进行处理。

@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent.hasExtra("list")){
            activityList = intent.getStringArrayListExtra("list");
        }
        activityList.add(this.toString().substring(this.toString().lastIndexOf("."))+"");
        adapter.notifyDataSetChanged();
    }
另外为了证明singleInstance,我们可以通过获取栈的TaskId来判断是否新开了栈。

我们可以看到,FirstActivity的栈id为1185,而SecendActvity和ThirdActivity的栈id为1184,即,他们已经不再同一个序列里面了。


上面就是关于activity启动模式我的一点看法,可能有一些理解不对,望留言指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值