編輯:關於android開發
先看一下singleInstance啟動模式的說明:
只有一個實例,並且這個實例獨立運行在一個activity任務棧中,這個task只有這個實例,不允許有別的Activity存在下面我們通過一個實例來了解singleInstance啟動模式
在手機上的運行結果如下圖

layout布局文件為
<linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"><button android:id="@+id/button1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Activity1"></button><button android:id="@+id/button2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Activity2"></button><button android:id="@+id/button3" android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Activity3"></button></linearlayout>
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;
}
}
}
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:launchmode="singleInstance" android:name="com.example.activitysingleinstance.Activity2"></activity>
<activity android:name="com.example.activitysingleinstance.Activity3"></activity>
現在我們把它部署到手機上。
按照這個打開順序。
Activity1->Activity2->Activity3->Activity1->Activity2
我們看看在日志中的輸出情況

分析:啟動Activity1,創建一個Activity棧,ID=17.然後打開Activity2,因為Activity2為SingleInstance啟動模式,這個實例要獨自運行在一個棧中,我們會發現Activity2又新建了一個Activity棧,ID=18.然後再打開Activity3,進入ID=17的棧中,再打開Activity1繼續進入ID=17的棧中。我們再次打開Activity2發現已經棧中已經有了Activity2的實例,不會創建新的實例,但會調用其onNewIntent方法。
具體棧的情況如下圖

需要按幾次返回能回到主界面呢?聰明的你知道了把~那你也就理解了singleInstance啟動模式
·4次~
安卓高手之路之java層Binder,安卓binder
安卓高手之路之java層Binder,安卓binder很多人一提到Binder就說代理模式,人雲亦雲的多,能理解精髓的少。 本篇文章就從設計角度分析一下java
詳解Android Fragment之一:Fragment概述及用法
Fragment一般是宿主Activity UI的一部分或一種行為,作為Act
自用工程教程(一)建立開發環境與HelloWorld,自用helloworld
自用工程教程(一)建立開發環境與HelloWorld,自用helloworld從今天開始,我們將在老師的帶領下嘗試做一個Android平台移動端實現捕獲網絡數據包功能的A
Android提高21篇之十七:多級樹形菜單的實現
在Android裡要實現樹形菜單,都是用ExpandableList(也有高手自己繼承ListVi