編輯:關於Android編程
先看一下standard啟動模式的說明:
只有一個實例,在同一個應用程序中啟動他的時候,若不存在此Activity實例,則會在當前棧頂創建一個新的實例,若存在,則會把棧中在其上的其它Activity實例銷毀掉,並調用此實例的OnNewIntent方法,如果實在別的應用實例中啟動它,則會新建一個棧,並在該棧中啟動這個Activity,然後我在這個Activity實例中再打開新的Activity這個新的實例會在一個棧中
我們首先通過一個實例理解這句:只有一個實例,在同一個應用程序中啟動他的時候,若不存在此Activity實例,則會在當前棧頂創建一個新的實例,若存在,則會把棧中在其上的其它Activity實例銷毀掉,並調用此實例的OnNewIntent方法
首先在手機上的效果
xml布局文件 兩個按鈕 一個用於打開MainActivity(Activity1),一個用於打開OtherActivity(Activity2)
MainActivity和OtherActivity同時使用這個布局文件,並為其按鈕添加點擊事件
MainActivity
package com.example.singletop; import android.os.Bundle; import android.app.Activity; import android.content.Intent; 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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //設置標題為Activity1 setTitle("我是Activity1"); btn_open1=(Button) findViewById(R.id.button1); btn_open2=(Button) findViewById(R.id.button2); btn_open1.setOnClickListener(this); btn_open2.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case R.id.button1: startActivity(new Intent(MainActivity.this,MainActivity.class)); break; case R.id.button2: startActivity(new Intent(MainActivity.this,OtherActivity.class)); break; } } }
package com.example.singletop; 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 OtherActivity extends Activity implements OnClickListener{ private Button btn_open1,btn_open2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //設置標題為Activity2 setTitle("我是Activity2"); btn_open1=(Button) findViewById(R.id.button1); btn_open2=(Button) findViewById(R.id.button2); btn_open1.setOnClickListener(this); btn_open2.setOnClickListener(this); } @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ case R.id.button1: startActivity(new Intent(OtherActivity.this,MainActivity.class)); break; case R.id.button2: startActivity(new Intent(OtherActivity.this,OtherActivity.class)); break; } } //在此方法中打印是否調用這個方法的日志 @Override protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub super.onNewIntent(intent); Log.d("OtherActivity", "OnNewIntent"); } }至於MainActivity和OtherActivity的區別:
MainActivity是standard啟動模式
OtherActivity是singleTask啟動模式
在AndroidManifest.xml中MainActivity默認就是standard啟動模式
配置一下OtherActivity就好
<activity android:launchmode="singleTask" android:name="com.example.singletop.OtherActivity"></activity>我們舉個例子。
Activity1->Activity2->Activity1->Activity1->Activity2
在Activity棧中是什麼樣子呢?
為什麼是這樣呢?聰明的你肯定理解了吧?哈哈~
我們仔細分析一下,當我們打開Activity1,棧中只有(Activity1),當再打開Activity2棧裡面為(Activity2,Activity1),再打開Activity1棧裡面為(Activity1,Activity2,Activity1),再打開Activity1棧裡面仍然是正常的(Activity1,Activity1,Activity2,Activity1),下面是重點了。當我們再打開Activity2時發現棧裡面已經有了Activity2了,根據singleTask模式的說明(只有一個實例,在同一個應用程序中啟動他的時候,若不存在此Activity實例,則會在當前棧頂創建一個新的實例,若存在,則會把棧中在其上的其它Activity實例銷毀掉)
此時會刪除棧裡面的(Activity1,Activity1)並且調用onNewIntent方法。我們查看一下日志文件
的確調用了一次OnNewIntent方法。只需要按兩次返回鍵就能返回到主界面了。
聰明的你理解了吧?至於下半句的分析請看下篇文章
前言我們已經介紹了SimpleNet網絡框架的基本結構,今天我們就開始從代碼的角度來開始切入該網絡框架的實現,在剖析的同時我們會分析設計思路,以及為什麼要這樣做,這樣做的
在項目中,我們常常需要實現界面滑動切換的效果。例如,微信界面的左右滑動切換效果。那這種效果是怎麼實現的?今天我就帶大家簡單了解ViewPager,並通過實例來實現該效果。
在上一篇的文章中介紹了自定義控件的屬性,詳情見《詳解Android自定義控件屬性TypedArray以及attrs》。那麼在這基礎上實現隨機驗證碼生成,裡面的代碼是自定義
先看看效果圖:這裡介紹的是PullToRefreshGridView的使用方法,和之前的PullToRefreshListView方法如出一轍,因為這個開源項目模塊化很棒