网上分析设计模式的很多很多,都很详细,写这个只是为了自己能深刻认识一遍。
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启动模式我的一点看法,可能有一些理解不对,望留言指出。