android:Activity启动模式之singleInstance
2016-02-14 14:22
615 查看
先看一下singleInstance启动模式的说明:
只有一个实例,并且这个实例独立运行在一个activity任务栈中,这个task只有这个实例,不允许有别的Activity存在下面我们通过一个实例来了解singleInstance启动模式
在手机上的运行结果如下图
![](http://img.blog.csdn.net/20160214140733111)
layout布局文件为
分别为三个按钮添加点击事件,点击后分别打开对应的Activity.三个Acitivy大同小异。很容易区分,只不过Activity2是singleInstance启动模式 其它两个为默认的启动模式(standard)
MainActivity(Activity1).class
Activity2.class
Activity3.class
最后不要忘记在AndroidManifest.xml中配置Activity2和Activity3的信息
按照这个打开顺序。
Activity1->[b]Activity2->Activity3->Activity1->Activity2[/b]
我们看看在日志中的输出情况
![](http://img.blog.csdn.net/20160214141328237)
分析:启动Activity1,创建一个Activity栈,ID=17.然后打开Activity2,因为Activity2为SingleInstance启动模式,这个实例要独自运行在一个栈中,我们会发现Activity2又新建了一个Activity栈,ID=18.然后再打开Activity3,进入ID=17的栈中,再打开Activity1继续进入ID=17的栈中。我们再次打开Activity2发现已经栈中已经有了Activity2的实例,不会创建新的实例,但会调用其onNewIntent方法。
具体栈的情况如下图
![](http://img.blog.csdn.net/20160214142102966)
需要按几次返回能回到主界面呢?聪明的你知道了把~那你也就理解了singleInstance启动模式
·4次~
只有一个实例,并且这个实例独立运行在一个activity任务栈中,这个task只有这个实例,不允许有别的Activity存在下面我们通过一个实例来了解singleInstance启动模式
在手机上的运行结果如下图
layout布局文件为
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Activity1" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Activity2" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Activity3" /> </LinearLayout>
分别为三个按钮添加点击事件,点击后分别打开对应的Activity.三个Acitivy大同小异。很容易区分,只不过Activity2是singleInstance启动模式 其它两个为默认的启动模式(standard)
MainActivity(Activity1).class
package com.example.activitysingleinstance; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button btn_open1,btn_open2,btn_open3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle("Activity1"); //在日志中输出栈ID Log.d("SingleInstance", "Activity1的栈ID:"+getTaskId()+""); btn_open1=(Button) findViewById(R.id.button1); btn_open2=(Button) findViewById(R.id.button2); btn_open3=(Button) findViewById(R.id.button3); btn_open1.setOnClickListener(this); btn_open2.setOnClickListener(this); btn_open3.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case R.id.button1: startActivity(new Intent(this,MainActivity.class)); break; case R.id.button2: startActivity(new Intent(this,Activity2.class)); break; case R.id.button3: startActivity(new Intent(this,Activity3.class)); break; } } }
Activity2.class
package com.example.activitysingleinstance; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class Activity2 extends Activity implements OnClickListener{ private Button btn_open1,btn_open2,btn_open3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle("Activity2"); //在日志中输出栈ID Log.d("SingleInstance", "Activity2的栈ID:"+getTaskId()+""); btn_open1=(Button) findViewById(R.id.button1); btn_open2=(Button) findViewById(R.id.button2); btn_open3=(Button) findViewById(R.id.button3); btn_open1.setOnClickListener(this); btn_open2.setOnClickListener(this); btn_open3.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case R.id.button1: startActivity(new Intent(this,MainActivity.class)); break; case R.id.button2: startActivity(new Intent(this,Activity2.class)); break; case R.id.button3: startActivity(new Intent(this,Activity3.class)); break; } } //如果调用这个方法就在日志中输出信息 @Override protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub super.onNewIntent(intent); Log.d("SingleInstance", "Activity2调用onNewIntent"); } }
Activity3.class
package com.example.activitysingleinstance; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class Activity3 extends Activity implements OnClickListener{ private Button btn_open1,btn_open2,btn_open3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setTitle("Activity3"); //在日志中输出栈ID Log.d("SingleInstance", "Activity3的栈ID:"+getTaskId()+""); btn_open1=(Button) findViewById(R.id.button1); btn_open2=(Button) findViewById(R.id.button2); btn_open3=(Button) findViewById(R.id.button3); btn_open1.setOnClickListener(this); btn_open2.setOnClickListener(this); btn_open3.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case R.id.button1: startActivity(new Intent(this,MainActivity.class)); break; case R.id.button2: startActivity(new Intent(this,Activity2.class)); break; case R.id.button3: startActivity(new Intent(this,Activity3.class)); break; } } }
最后不要忘记在AndroidManifest.xml中配置Activity2和Activity3的信息
<activity android:name="com.example.activitysingleinstance.Activity2" android:launchMode="singleInstance" ></activity> <activity android:name="com.example.activitysingleinstance.Activity3" ></activity>现在我们把它部署到手机上。
按照这个打开顺序。
Activity1->[b]Activity2->Activity3->Activity1->Activity2[/b]
我们看看在日志中的输出情况
分析:启动Activity1,创建一个Activity栈,ID=17.然后打开Activity2,因为Activity2为SingleInstance启动模式,这个实例要独自运行在一个栈中,我们会发现Activity2又新建了一个Activity栈,ID=18.然后再打开Activity3,进入ID=17的栈中,再打开Activity1继续进入ID=17的栈中。我们再次打开Activity2发现已经栈中已经有了Activity2的实例,不会创建新的实例,但会调用其onNewIntent方法。
具体栈的情况如下图
需要按几次返回能回到主界面呢?聪明的你知道了把~那你也就理解了singleInstance启动模式
·4次~
相关文章推荐
- Qt For Android 引导页
- Qt For Android 设置
- android启动模式 launchMode
- Qt For Android 数据模型
- Qt For Android 数据库操作
- Qt For Android 文件存储
- Android——Animation笔记:布局动画
- Android 模仿QQ抢红包 listView实现
- Android 动画之TranslateAnimation应用详解
- Volley学习笔记
- ANDROID_MARS学习笔记_S01原始版_009_SQLite
- Android 动画之AlphaAnimation应用详解
- android studio 获取sha1和md5值
- Android 动画之ScaleAnimation应用详解
- 恭喜发财! -- 手把手教你仿造一个qq下拉抢红包 Android自定义view
- 恭喜发财! -- 手把手教你仿造一个qq下拉抢红包 Android自定义view
- Android开发涉及到的设计模式
- Android RotateAnimation详解
- Android辅助功能AccessibilityService与抢红包辅助
- Android 带有可滑动效果的用户引导页slidingtutorial-android