編輯:關於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次~
小米2S技巧-小米2S兩種快捷截屏方法
小米手機如何快速截屏:在這裡總結了兩種小米手機快速截屏的方法,不知道或者要用的童鞋還不快點收藏起來試試看!1、下拉通知欄,點擊截屏,2秒後直接進入截屏截取當
Android - ScrollView添加提示Arrow(箭頭)
ScrollView添加提示Arrow(箭頭) 在ScrollView的滑動功能中,需要給用戶提示,可以滑動,可以添加兩個箭頭。
Android版手機“QQ桌面”實用的小技巧
騰訊已將手機QQ桌面帶到了安卓手機平台。該版本不僅能關注城市天氣和資訊熱點,還能在桌面就收發QQ消息、定制動態的待機桌面。本期就來看看新版手機QQ桌面是如何
Android-ListView兩種適配器以及事件監聽
Android-ListView兩種適配器ListView在安卓App中非常常見,幾乎每一個App都會有涉及,比如QQ消息列表,或者是通訊錄還有就是酷我音樂的歌曲列表都是