<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 93,  comments - 2,  trackbacks - 0

    在Android的聯機文檔中,有對Activity的簡單介紹,現在通過編寫代碼對Activity的啟動模式做一個深入的理解。 
    在配置文件AndroidManifest.xml中,activity元素的android:launchMode屬性用來配置對應Activity的啟動模式,目前有以下四種啟動模式: 
    1.standard 
    2.singleTop 
    3.singleTask 
    4.singleInstance 
    如果不對Activity設置啟動模式,默認就是standard模式

    一、standard

    請看以下代碼,實現了一個Activity :


    public class A_Activity extends Activity { 
        /** Called when the activity is first created. */ 
        @Override 
        public void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            TextView textView=new TextView(this); 
            textView.setText(this+"");//這里用于打印當前Activity的hashcode,可以此判斷Activity實例是不是同一個對象 
            Button button=new Button(this); 
            button.setText("Go next activity"); 
            button.setOnClickListener(new OnClickListener(){

                public void onClick(View v) { 
                    // TODO Auto-generated method stub 
                    Intent intent=new Intent(); 
                    intent.setClass(A_Activity.this, A_Activity.class);//說明發出Intent與啟動的Activity都是A_Activity的實例 
                    startActivity(intent); 
                } 
            }); 
            LinearLayout layout=new LinearLayout(this); 
            layout.setOrientation(LinearLayout.VERTICAL); 
            layout.addView(textView); 
            layout.addView(button); 
            setContentView(layout); 
        } 
    } 
    運行之,請看下圖: 
     
    點擊button后,注意看第一行的textView 
     
    由此可知,生成了新的A_Activity對象,這時我們按回退鍵,就會依次回到之前的Activity。點擊button的過程就是壓棧的過程,在standard模式下,就會不斷生成新的Activity對象


    二、singleTop

    singleTop和standard模式都會將intent發送給新的Activity實例,不同的是,如果創建Intent的時候棧頂有要創建的singleTop模式下的Activity實例,則將Intent發送給該實例,不會再創建Activity的新實例。 
    還是使用之前的代碼,只是設置A_Activity的啟動模式為singleTop:android:launchMode="singleTop",運行之,請看下圖: 
     
    這個時候我們無論點擊多少次button,textView都顯示同一個Activity實例,按回退鍵時會直接退出程序,表明在singleTop模式下,如果在棧頂存在Intent中那個目標Activity的實例,就不會創建新的實例,而直接使用棧頂的對象,對于資源有限的移動設備來說,也是有實際意義的。 
    如果是在不同Activity之間跳轉,就會跟standard模式的情形一樣,請看下面代碼:
    public class A_Activity extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            TextView textView=new TextView(this);
            textView.setText(this+"");
            Button button=new Button(this);
            button.setText("Go B_Activity");
            button.setOnClickListener(new OnClickListener(){

                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Intent intent=new Intent();
                    intent.setClass(A_Activity.this, B_Activity.class);//從A跳轉到B 
                    startActivity(intent);
                }
            });
            LinearLayout layout=new LinearLayout(this);
            layout.setOrientation(LinearLayout.VERTICAL);
            layout.addView(textView);
            layout.addView(button);
            setContentView(layout);
        }
    }
    public class B_Activity extends Activity { 
        /**<li>Description: </li>
         *
         * @param savedInstanceState
         * @see android.app.Activity#onCreate(android.os.Bundle)
         */
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            TextView textView=new TextView(this);
            textView.setText(this+"");
            Button button=new Button(this);
            button.setText("Go A_Activity");
            button.setOnClickListener(new OnClickListener(){ 
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    Intent intent=new Intent();
                    intent.setClass(B_Activity.this, A_Activity.class);//從B跳轉到A
                    startActivity(intent);
                }
            });
            LinearLayout layout=new LinearLayout(this);
            layout.setOrientation(LinearLayout.VERTICAL);
            layout.addView(textView);
            layout.addView(button);
            setContentView(layout);
        }
    }
    運行后,如下圖:
     
    點擊button后:
     
    再點擊button后:
     
    這樣每次都會創建目標Activity的新實例,因為在跳轉時,處于棧頂的對象不是目標Activity的實例

    三、singleTask

    singleTask模式只能創建一個實例,當發送一個Intent,目標Activity為singleTask模式時,系統會檢查棧里面是否已經有該Activity的實例,如果有就直接將Intent發送給它,還是使用(二)中的代碼,將A_Activity啟動模式設置為singleTask,B_Activity啟動模式設置為standard,啟動后如下圖:
     
    點擊button后:
     
    繼續點擊button:
     
    由此可知,singleTask模式的A_Activity在棧中只有一個實例,可以被重復使用
    并且,如果收到Intent生成一個新實例,那么用戶可以通過回退鍵回到上一個狀態,如果是已經存在的一個activity來處理這個Intent的話,就無法通過回退鍵回到上一個狀態(對singleInstance同樣適用) ,比如剛才最后一步如果再按回退鍵,就會直接退出程序,而不會回到上一步的狀態。

    四、singleInstance

    這個模式下的Activity在一個單獨的task棧中,這個棧也只能包含一個Activity的實例,將上面代碼稍微改動一下,顯示taskId:
    A_Activity 中:textView.setText(this.getTaskId()+"");
    B_Activity 中:textView.setText(this.getTaskId()+"");
    另外將B_Activity 設置為singleInstance模式,A_Activity 設置為standard模式,啟動后:
     
    點擊button后:
     
    表明啟動了新的task

    總結四個模式的不同:
    1、Intent的目標Activity由哪個task持有
    standard與singleTop的Activity所在task,與收到的Intent的發送者所在task相同,除非Intent包括參數FLAG_ACTIVITY_NEW_TASK,該參數會啟動Activity到新的task中;singleTask和singleInstance總是把Activity作為一個task的根元素,它們不會被啟動到其他task里
    2、是否允許Activity的多個實例
    standard與singleTop可以被實例化多次,可以存在不同task中,并且一個task可以包括同一activity的多個實例
    singleTask與singleInstance則在同一個task中只能允許Activity的一個實例,并且是task的根元素
    3、在同一個task棧中,是否允許其他Activity的實例存在
    singleInstance單獨在一個task中,其他啟動模式允許不同Activity的實例存在
    4、是否每次生成新實例接收Intent
    standard每次啟動都會生成新實例
    singleTop的activity如果在task的棧頂的話,則不生成新的activity實例,直接使用該實例,否則,就要生成新的實例
    singleInstance在所在棧中是唯一的activity,它每次都會被重用
    singleTask如果task棧中有該模式的Activity,就不生成新的activity實例,直接使用該實例,否則,就要生成新的實例
    轉載:http://blog.csdn.net/leiswpu/article/details/6248528

    posted on 2015-04-13 17:56 Terry Zou 閱讀(317) 評論(0)  編輯  收藏 所屬分類: Android
    <2015年4月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    收藏夾

    Java

    搜索

    •  

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲高清中文字幕综合网| 四虎国产成人永久精品免费| 亚洲福利一区二区| 亚洲国产精品无码久久青草 | 老司机永久免费网站在线观看| 久久精品乱子伦免费| 一个人免费观看视频在线中文| 国产成人精品日本亚洲专区6| 亚洲一区二区三区高清| 亚洲中文字幕无码一久久区| 国产91在线免费| 曰皮全部过程视频免费国产30分钟| 国产成人精品久久免费动漫| 成全动漫视频在线观看免费高清版下载| 黄页网站在线免费观看| 亚洲AV无码国产精品永久一区| 99久久国产亚洲综合精品| 亚洲综合校园春色| 亚洲国产成人精品无码一区二区| 亚洲五月六月丁香激情| 亚洲AV无码久久| 久久青青草原亚洲AV无码麻豆| 亚洲色精品88色婷婷七月丁香| 亚洲色偷偷偷鲁综合| 亚洲欧洲自拍拍偷午夜色无码| 亚洲深深色噜噜狠狠爱网站| 在线观看亚洲精品国产| 中文字幕精品亚洲无线码二区| 国产亚洲成人在线播放va| 久久久久亚洲AV成人网人人网站| 亚洲天堂免费在线视频| 337p日本欧洲亚洲大胆裸体艺术| 国产成人亚洲精品影院| 欧洲亚洲国产清在高| 亚洲va国产va天堂va久久| 亚洲国产香蕉碰碰人人| 亚洲精品亚洲人成在线观看麻豆 | 久久久久久久99精品免费| 免费无码中文字幕A级毛片| 9277手机在线视频观看免费| 最近的中文字幕大全免费8|