編輯:關於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很多人一提到Binder就說代理模式,人雲亦雲的多,能理解精髓的少。 本篇文章就從設計角度分析一下java
Fragment一般是宿主Activity UI的一部分或一種行為,作為Act
自用工程教程(一)建立開發環境與HelloWorld,自用helloworld從今天開始,我們將在老師的帶領下嘗試做一個Android平台移動端實現捕獲網絡數據包功能的A
在Android裡要實現樹形菜單,都是用ExpandableList(也有高手自己繼承ListVi