Activity詳細(xì)總結(jié)

一、Activity的生命周期

Activity的生命周期.png

二、Activity之間傳遞數(shù)據(jù)

1. 通過(guò)Intent傳遞數(shù)據(jù)

通過(guò)Intent.putExtra方法可以將簡(jiǎn)單數(shù)據(jù)類型或可序列化對(duì)象保存在Intent對(duì)象中蜀漆,然后在另一個(gè)Activity中使用getInt流码、getString等方法獲得這些數(shù)據(jù)。示例代碼如下:

Intent intent =new Intent(CurrentActivity.this,OtherActivity.class);
  // 創(chuàng)建一個(gè)帶“收件人地址”的 email 
 Bundle bundle =new Bundle();// 創(chuàng)建 email 內(nèi)容
 bundle.putBoolean("boolean_key", true);// 編寫(xiě)內(nèi)容
 bundle.putString("string_key", "string_value"); 
 intent.putExtra("key", bundle);// 封裝 email 
 startActivity(intent);// 啟動(dòng)新的 Activity

下面是獲取數(shù)據(jù):

 Intent intent =getIntent();// 收取 email 
 Bundle bundle =intent.getBundleExtra("key");// 打開(kāi) email 
 bundle.getBoolean("boolean_key");// 讀取內(nèi)容
 bundle.getString("string_key");

不過(guò)使用Bundle傳遞數(shù)據(jù)稍顯麻煩烫沙,如果你只需要傳遞一種類型的值可以這樣:

Intent intent =new Intent(EX06.this,OtherActivity.class); 
 intent.putExtra("boolean_key", true); 
 intent.putExtra("string_key", "string_value"); 
 startActivity(intent);

獲取數(shù)據(jù):

Intent intent=getIntent(); 
 intent.getBooleanExtra("boolean_key",false); 
 intent.getStringExtra("string_key");

2. 通過(guò)靜態(tài)變量傳遞數(shù)據(jù)

適用于不可序列化的且簡(jiǎn)單的對(duì)象,不過(guò)不推薦使用靜態(tài)代碼塊

public class MainActivity extends Activity {  
    private Button btn;  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        btn = (Button)findViewById(R.id.btOpenOtherActivity);  
        btn.setOnClickListener(new OnClickListener() {  
            @Override  
            public void onClick(View v) {  
                //定義一個(gè)意圖  
                Intent intent = new Intent(MainActivity.this,OtherActivity.class);  
                //改變OtherActivity的三個(gè)靜態(tài)變量的值  
                OtherActivity.name = "wulianghuan";  
                OtherActivity.age = "22";  
                OtherActivity.address = "上海閔行";  
                startActivity(intent);  
            }  
        });  
    }  
}  
public class OtherActivity extends Activity {  
    public static String name;  
    public static String age;  
    public static String address;  
    private TextView text_name;  
    private TextView text_age;  
    private TextView text_address;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.other);  
        text_name = (TextView) findViewById(R.id.name);  
        text_age = (TextView) findViewById(R.id.age);  
        text_address = (TextView) findViewById(R.id.address);     
        //設(shè)置文本框的數(shù)據(jù)  
        text_name.setText("姓名:"+name);  
        text_age.setText("年齡:"+age);  
        text_address.setText("地址:"+address);  
    }  
}  

3.通過(guò)全局對(duì)象傳遞數(shù)據(jù)

如果想使某些數(shù)據(jù)長(zhǎng)時(shí)間駐留內(nèi)存搁骑,以便程序隨時(shí)調(diào)用斧吐,建議采用全局對(duì)象。Application全局類不需要定義靜態(tài)變量只要定義普通成員變量即可仲器,但全局類中必須有一個(gè)無(wú)參構(gòu)造方法煤率,編寫(xiě)完Application類后,還需要在<application>標(biāo)簽中制定全局類名乏冀,否則系統(tǒng)不會(huì)自動(dòng)創(chuàng)建全局對(duì)象蝶糯。

public class MainApplication extends Application {
   private String username;

   public String getUsername() {
       return username;
   }

   public void setUsername(String username) {
       this.username = username;
   }
}
public class MainActivity extends Activity {

   private MainApplication application;

   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       application = (MainApplication) getApplication();
       application.setUsername("sunzn");
   }

   public void open(View view) {
       Intent intent = new Intent(this, OtherActivity.class);
       startActivity(intent);
   }
}
public class OtherActivity extends Activity {
   private TextView tv_data;
   private MainApplication application;
   private String username;

   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_other);
       application = (MainApplication) getApplication();
       username = application.getUsername();
       tv_data = (TextView) findViewById(R.id.tv_data);
       tv_data.setText("從上一個(gè) Activity 中獲取到的數(shù)據(jù)為:" + username);
   }
}

三、從Activity返回?cái)?shù)據(jù)

要從Activity返回?cái)?shù)據(jù)辆沦,需要使用startActivityForResult方法來(lái)顯示Activity昼捍。
從Activity1跳轉(zhuǎn)到Activity2:

Intent intent = new Intent();
 intent = intent.setClass(ActivityIntent.this, AnotherActivity.class);
 Bundle bundle = new Bundle();
 bundle.putString("string", et_string.getText().toString());
 intent.putExtras(bundle);
 startActivityForResult(intent,0); //只有這里不同

從Activity2返回?cái)?shù)據(jù)到Aactivity1:

Intent intent = new Intent();
intent = intent.setClass(AnotherActivity.this, ActivityIntent.class);
Bundle bundle = new Bundle();
bundle.putInt("result", "Activity2的處理結(jié)果");
intent.putExtras(bundle); 
AnotherActivity.this.setResult(RESULT_OK, intent); //RESULT_OK是返回狀態(tài)碼
AnotherActivity.this.finish();

在Activity1中重寫(xiě)onActivityResault方法,接受數(shù)據(jù):

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
                   super.onActivityResult(requestCode, resultCode, data);
                    switch(resultCode) { //根據(jù)狀態(tài)碼肢扯,處理返回結(jié)果
                    case RESULT_OK: 
                          Bundle bundle =data.getExtras(); //獲取intent里面的bundle對(duì)象
                              String result = bundle.getInt("result"); 
                    break; 
                    default:
                    break;
                    } 

             }

四妒茬、Activity的四種創(chuàng)建模式

我們?cè)陂_(kāi)發(fā)項(xiàng)目的過(guò)程中,會(huì)涉及到該應(yīng)用中多個(gè)Activity組件之間的跳轉(zhuǎn)蔚晨,或者夾帶其它應(yīng)用的可復(fù)用的Activity乍钻。例如我們可能希望跳轉(zhuǎn)到原來(lái)某個(gè)Activity實(shí)例,而不是產(chǎn)生大量重復(fù)的 Activity铭腕。這樣就需要我們?yōu)?Activity 配置特定的加載模式银择,而不是使用默認(rèn)的加載模式。設(shè)置啟動(dòng)模式的位置在 Manifest.xml 文件中 Activity的android:launchMode 屬性

  1. standard 模式
    這是默認(rèn)模式累舷,無(wú)需設(shè)置浩考,每次激活A(yù)ctivity時(shí)都會(huì)創(chuàng)建Activity實(shí)例,并放入任務(wù)棧中被盈。相當(dāng)于入棧析孽,按back鍵返回到前一個(gè)Activity相當(dāng)于退棧。

  2. singleTop 模式
    如果在任務(wù)的棧頂正好存在該Activity的實(shí)例只怎,就重用該實(shí)例( 會(huì)調(diào)用實(shí)例的 onNewIntent())袜瞬,否則就會(huì)創(chuàng)建新的實(shí)例并放入棧頂,即使棧中已經(jīng)存在該Activity的實(shí)例尝盼,只要不在棧頂,都會(huì)創(chuàng)建新的實(shí)例佑菩《苣可用來(lái)解決棧頂多個(gè)重復(fù)相同的Activity的問(wèn)題

  3. singleTask 模式
    如果在棧中已經(jīng)有該Activity的實(shí)例裁赠,就重用該實(shí)例(會(huì)調(diào)用實(shí)例的 onNewIntent() )。重用時(shí)赴精,會(huì)讓該實(shí)例回到棧頂佩捞,因此在它上面的實(shí)例將會(huì)被移出棧。如果棧中不存在該實(shí)例蕾哟,將會(huì)創(chuàng)建新的實(shí)例放入棧中一忱。singleTask 模式可以用來(lái)退出整個(gè)應(yīng)用。將主Activity設(shè)為SingTask模式谭确,然后在要退出的Activity中轉(zhuǎn)到主Activity帘营,然后重寫(xiě)主Activity的onNewIntent函數(shù),并在函數(shù)中加上一句finish逐哈。

  4. singleInstance 模式
    在一個(gè)新棧中創(chuàng)建該Activity的實(shí)例芬迄,并讓多個(gè)應(yīng)用共享該棧中的該Activity實(shí)例。一旦該模式的Activity實(shí)例已經(jīng)存在于某個(gè)棧中昂秃,任何應(yīng)用再激活該Activity時(shí)都會(huì)重用該棧中的實(shí)例( 會(huì)調(diào)用實(shí)例的 onNewIntent() )禀梳。其效果相當(dāng)于多個(gè)應(yīng)用共享一個(gè)應(yīng)用,不管誰(shuí)激活該 Activity 都會(huì)進(jìn)入同一個(gè)應(yīng)用中肠骆。

五算途、Activity現(xiàn)場(chǎng)保存狀態(tài)

一般來(lái)說(shuō),調(diào)用onPause()和onStop()方法后的activity實(shí)例仍然存在于內(nèi)存中,activity的所有信息和狀態(tài)數(shù)據(jù)不會(huì)消失, 當(dāng)activity重新回到前臺(tái)之后, 所有的改變都會(huì)得到保留。但是當(dāng)系統(tǒng)內(nèi)存不足時(shí), 調(diào)用onPause()和onStop()方法后的activity可能會(huì)被系統(tǒng)摧毀, 此時(shí)內(nèi)存中就不會(huì)存有該activity的實(shí)例對(duì)象了. 如果之后這個(gè)activity重新回到前臺(tái), 之前所作的改變就會(huì)消失.可以在activity被殺掉之前調(diào)用保存每個(gè)實(shí)例的狀態(tài),開(kāi)發(fā)者可以覆寫(xiě)onSaveInstanceState()方法. onSaveInstanceState()方法接受一個(gè)Bundle類型的參數(shù), 開(kāi)發(fā)者可以將狀態(tài)數(shù)據(jù)存儲(chǔ)到這個(gè)Bundle對(duì)象中,以保證該狀態(tài)在onCreate(Bundle)或者onRestoreInstanceState(Bundle)(傳入的Bundle參數(shù)是由onSaveInstanceState封裝好的)中恢復(fù)蚀腿。這個(gè)方法在一個(gè)activity被殺死前調(diào)用嘴瓤,當(dāng)該activity在將來(lái)某個(gè)時(shí)刻回來(lái)時(shí)可以恢復(fù)其先前狀態(tài)。如果調(diào)用onSaveInstanceState()方法,調(diào)用將發(fā)生在onPause()或onStop()方法之前唯咬,而且它也不是生命周期的方法纱注。
若向數(shù)據(jù)庫(kù)中插入記錄等,保存持久化數(shù)據(jù)的操作應(yīng)該放在onPause()中. onSaveInstanceState()方法只適合保存瞬態(tài)數(shù)據(jù), 比如UI控件的狀態(tài), 成員變量的值等.

public class MainActivity extends Activity {  
    private String temp;    
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        // 從savedInstanceState中恢復(fù)數(shù)據(jù), 如果沒(méi)有數(shù)據(jù)需要恢復(fù)savedInstanceState為null  
        if (savedInstanceState != null) {  
            temp = savedInstanceState.getString("temp");  
            System.out.println("onCreate: temp = " + temp);  
        }  
    }  
  
    public void onRestoreInstanceState(Bundle saveInstanceState) {  
        super.onRestoreInstanceState( saveInstanceState);  
        String temp  = saveInstanceState.getString("temp");  
        System.out.println("onResume: temp = " + temp);  
       
    }  
      
    // 將數(shù)據(jù)保存到outState對(duì)象中, 該對(duì)象會(huì)在重建activity時(shí)傳遞給onCreate方法和onRestoreInstanceState方法
    @Override  
    protected void onSaveInstanceState(Bundle outState) {  
        super.onSaveInstanceState(outState);  
        outState.putString("temp", temp);  
    }  

六胆胰、一些關(guān)于Activity的技巧

  1. 設(shè)置Activity的方向
 android:screenOrientation="portrait">// 豎屏 , 值為 landscape 時(shí)為橫屏
  1. 設(shè)置Activity全屏
    在onCreate方法中添加如下代碼:
 // 設(shè)置全屏模式
 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
    WindowManager.LayoutParams.FLAG_FULLSCREEN); 
 // 去除標(biāo)題欄
 requestWindowFeature(Window.FEATURE_NO_TITLE);
  1. 改變窗口大小狞贱、位置、透明度
    在onCreate方法中添加如下代碼:
 Window w=getWindow();
 w.setBackgroundDrawableResource(resourceID);//設(shè)置窗口背景
WindowManager.LayoutParams layoutParams  = w.getAttributes();
layoutParams.height = 200; 
layoutParams.width= 200;
layoutParams.gravity = Gravity.TOP;
layoutParams.x=50;//距離Gravity屬性的距離
layoutParams.y=50;
layoutParams.alpha = 0.5;//0:完全透明蜀涨,1:不透明
w.setAttributes(layoutParams);
  1. 關(guān)閉所有窗口
Intent intent = new Intent(); 
intent.setClass(Android123.this, CWJ.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG設(shè)置 
startActivity(intent) 

另一種方法:在調(diào)用退出方法中寫(xiě)上MyApplication.getInstance().exit();

public class MyApplication extends Application {

        private List<Activity> activityList = new LinkedList<Activity>();
        private static MyApplication instance;

        private MyApplication() {
        }

        // 單例模式中獲取唯一的MyApplication實(shí)例
        public static MyApplication getInstance() {
                if (null == instance) {
                        instance = new MyApplication();
                }
                return instance;

        }

        // 添加Activity到容器中
        public void addActivity(Activity activity) {
                activityList.add(activity);
        }

        // 遍歷所有Activity并finish
        /*
         * 在每一個(gè)Activity中的onCreate方法里添加該Activity到MyApplication對(duì)象實(shí)例容器中
         * 
         * MyApplication.getInstance().addActivity(this);
         * 
         * 在需要結(jié)束所有Activity的時(shí)候調(diào)用exit方法
         * 
         * MyApplication.getInstance().exit();
         */
        public void exit() {

                for (Activity activity : activityList) {
                        activity.finish();
                }

                System.exit(0);

        }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瞎嬉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子厚柳,更是在濱河造成了極大的恐慌氧枣,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件别垮,死亡現(xiàn)場(chǎng)離奇詭異便监,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)烧董,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)毁靶,“玉大人,你說(shuō)我怎么就攤上這事逊移≡み海” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵胳泉,是天一觀的道長(zhǎng)拐叉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)扇商,這世上最難降的妖魔是什么凤瘦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮钳吟,結(jié)果婚禮上廷粒,老公的妹妹穿的比我還像新娘。我一直安慰自己红且,他們只是感情好坝茎,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著暇番,像睡著了一般嗤放。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壁酬,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天次酌,我揣著相機(jī)與錄音,去河邊找鬼舆乔。 笑死岳服,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的希俩。 我是一名探鬼主播吊宋,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颜武!你這毒婦竟也來(lái)了璃搜?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鳞上,失蹤者是張志新(化名)和其女友劉穎这吻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體篙议,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡唾糯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片移怯。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拒名,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芋酌,到底是詐尸還是另有隱情,我是刑警寧澤雁佳,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布脐帝,位于F島的核電站,受9級(jí)特大地震影響糖权,放射性物質(zhì)發(fā)生泄漏堵腹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一星澳、第九天 我趴在偏房一處隱蔽的房頂上張望疚顷。 院中可真熱鬧,春花似錦禁偎、人聲如沸腿堤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)笆檀。三九已至,卻和暖如春盒至,著一層夾襖步出監(jiān)牢的瞬間酗洒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工枷遂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留樱衷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓酒唉,卻偏偏與公主長(zhǎng)得像矩桂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黔州,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Activity 一耍鬓、四種形態(tài) 運(yùn)行狀態(tài): 當(dāng) Activity 處于棧的頂層,可見(jiàn)流妻,并可與用戶進(jìn)行交互 onRe...
    任教主來(lái)也閱讀 1,626評(píng)論 1 10
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程牲蜀,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評(píng)論 25 707
  • 需求:QQ紅包測(cè)試 1、查看原型圖绅这,設(shè)計(jì)稿 2涣达、了解開(kāi)發(fā)實(shí)現(xiàn),參與CodeView和前后端交互(走哪些接口數(shù)據(jù)) ...
    星_修閱讀 888評(píng)論 0 0
  • 今天上班是有關(guān)于突破的,我不排除自己是一個(gè)很認(rèn)真的人度苔,尤其是當(dāng)我很想記住某個(gè)點(diǎn)的時(shí)候匆篓,我特別認(rèn)真去記,可效果很不好...
    Hi_張閱讀 167評(píng)論 0 0