Android的四大组件之-Activity的启动模式
来源:互联网 发布:如何测试网络 编辑:程序博客网 时间:2024/06/05 07:55
1.活动的启动模式:
活动的启动模式可以在:AndroidManifest.xml中通过给<activity>标签指定android:launchMode属性来指定如下4中模式。
[1] standard
是活动默认的启动模式,我们可以通过一个例子来辅助理解:
<span style="font-size:14px;"></span>
public class FirstActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); Log.d("FirstActivity",this.toString()); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this,FirstActivity.class); startActivity(intent); }}
在MainActivity中我们点击按钮会执行这句:
Intent intent = new Intent(FirstActivity.this,FirstActivity.class);
代码没有写错,只是自己调用自己而已,当我连续点击3次,此时会创建3个MainActivity实例,这样我们按Back键三次才会退出应用程序。
如下图所示:
[2] singleTop
这个模式是对第一个模式的不足进行改进,如果返回栈顶的活动是该活动,则直接使用不会再创建新活动。
我们对第一个例子修改AndroidManifest.xml 中的<activity> 的启动模式为:android:launchMode="singleTop"
则不管点击多少次,只会创建一个活动,按Back键直接退出程序。
如果我们这样来操作:FirstActivity点击按钮调用SecondActivity,SecondActivity点击按钮调用FirstActivity。
代码如下:
public class FirstActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_first); Log.d("FirstActivity",this.toString()); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); }}
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_second); Log.d("SecondActivity",this.toString()); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(SecondActivity.this,FirstActivity.class); startActivity(intent); }}
经过测试可以知道程序会创建两个不同的FirstActivity实例,因为SecondActivity中启用FirstActivity时,此时栈顶活动是SecondActivity,因此会创建一个新的FirstActivity实例,按下Back键先返回到SecondActivity,再按Back键返回到FirstActivity,再按Back才会退出。如图所示:
[3] singleTask
使用singleTask模式是解决了创建栈顶活动时重复问题,但是该活动不是处于栈顶位置时,还是会创建多个实例,那么是否有办法整个应用程序只有一个实例呢?
第三种模式就能解决这个问题。
第二个例子修改AndroidManifest.xml 中的<activity> 的启动模式为:android:launchMode="singleTask"
在FirstActivity中实现onRestart方法:
@Overrideprotected void onRestart() { super.onRestart(); Log.d("Fristctivity","onRestart");}在SecondActivity中实现onDestory方法:
@Overrideprotected void onDestroy() { super.onDestroy(); Log.d("SecondActivity","onDestory");}按照第二中模式进行点击,然后按Back键,你会发现没有重新创建FirstActivity。
如图所示:
这个模式就解决了非栈顶的活动不会被重复创建。
[4] singleInstance
这个模式比较复杂,假设我们的程序中有一个活动是允许被其他程序调用的,如果我们想实现一个其他程序和我们的程序共享这个活动的实例,singleInstance模式可以解决这个问题。
将SecondActivity修改AndroidManifest.xml 中的<activity> 的启动模式为:android:launchMode="singleInstance"
public class FirstActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_first); Log.d("FirstActivity","Task Id is :"+getTaskId()); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); }}
public class SecondActivity extends AppCompatActivity implements View.OnClickListener{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_second); Log.d("SecondActivity","Task Id is:"+getTaskId()); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(this); } @Override public void onClick(View v) { Intent intent = new Intent(SecondActivity.this,ThirdActivity.class); startActivity(intent); }}
public class ThirdActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_third); Log.d("ThirdActivity","Task Id is:"+getTaskId()); }
我们发现Task Id SecondActivity·确实不同于FirstActivity和ThirdActivity- Android的四大组件之-Activity的启动模式
- Android四大组件之Activity的四种启动模式
- Android四大组件之Activity--启动模式
- Android四大组件之Activity (启动模式)
- Android四大组件---Activity之启动模式及启动模式的应用场景
- Android四大组件(1.2)--Activity的启动模式
- Android四大组件之一:Activity的启动模式
- 四大组件---Activity的启动模式
- Andriod 之 Activity的四大启动模式。
- Android Activity的四大启动模式
- Android Activity的四大启动模式
- android的四大组件之--Activity
- Android四大组件之Activity的介绍
- Android四大组件之Activity的生命周期
- android的四大组件之Activity
- Android的四大组件之Activity
- Android四大组件之--Activity的深入浅出
- Android常用的四大组件之Activity
- 动态规划的基础模板
- hibernate关于ORM映射文件配置(包括单文件、一对一、一对多、多对多等)
- iOS开发必备插件
- Java Number
- MongoDB常用操作命令大全
- Android的四大组件之-Activity的启动模式
- linux文件管理 练习
- Leetcode 216. Combination Sum III (Medium) (cpp)
- JAVA之JDBC的相关问题(无法与SQLServer连接的解决)
- CFS完全公平调度类
- 背景色及色彩搭配方案推荐
- Hbase原理详解
- android ExpandableTextView-自定义可以动态展开/收缩显示长文本的TextView
- 从0开始学习 GitHub 系列之「08.如何发现优秀的开源项目」