" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

android初學(xué)者必須掌握的Activity狀態(tài)的四大知識點(必讀)

 更新時間:2024年06月13日 11:20:43   作者:King骷髏  
本篇文章主要介紹了android activity的四種狀態(tài),詳細(xì)的介紹了四種狀態(tài),包括Running狀態(tài)、Paused狀態(tài)、Stopped狀態(tài)、Killed狀態(tài),有興趣的可以了解一下。

這幾天一直都在搗鼓android的知識點,興趣班的老師,講課太過深奧,天(想到什么就見什么,后后面完全不想聽),最后自己找資料總結(jié)了在Android中很重要的一個組件Activity,那就開始吧!

第一:掌握Activity的四種狀態(tài)及什么時候觸發(fā)

首先我們要知道什么是Activity,簡單來說Activity其實就是一個屏幕的顯示頁面。(簡單的闡述)

我們知道Activity是由Activity棧進管理,當(dāng)來到一個新的Activity后,此Activity將被加入到Activity棧頂,之前的Activity位于此Activity底部。

Acitivity一般意義上有四種狀態(tài):

  1、Running狀態(tài): 一個新的Activity啟動入棧后,它在屏幕的最前端,處于棧的最頂端,此時它處于可見并可和用戶交互的激活狀態(tài),Android試圖盡最大可能保持它活動狀態(tài),殺死其它Activity來確保當(dāng)前活動Activity有足夠的資源可使用。當(dāng)另外一個Activity被激活,這個將會被暫停。

  2、Paused狀態(tài):當(dāng)Activity處于此狀態(tài)時,此時它依然與窗口管理器保持連接,系統(tǒng)繼續(xù)維護其內(nèi)部狀態(tài),它仍然可見,但它已經(jīng)失去了焦點,故不可與用戶交互。

  3、Stopped狀態(tài): 當(dāng)Activity 不可見時,Activity處于Stopped狀態(tài)。當(dāng)Activity處于此狀態(tài)時,一定要保存當(dāng)前數(shù)據(jù)和當(dāng)前的UI狀態(tài),否則一旦Activity退出或關(guān)閉時,當(dāng)前的數(shù)據(jù)和UI狀態(tài)就丟失了

  4、Killed狀態(tài): Activity被殺掉以后或者被啟動以前,處于Killed狀態(tài)。這是Activity已從Activity堆棧中移除,需要重新啟動才可以顯示和使用。

對四種狀態(tài)的一個總結(jié):Running狀態(tài)和Paused狀態(tài)是可見的,Stopped狀態(tài)和Killed狀態(tài)時不可見的,當(dāng)然Starting是有系統(tǒng)自身自動創(chuàng)建,而且每一個活動( Activity )都處于某一個狀態(tài),對于開發(fā)者來說,是無法控制其應(yīng)用程序處于某一個狀態(tài)的,這些均由系統(tǒng)來完成。

但是當(dāng)一個活動的狀態(tài)發(fā)生改變的時候,開發(fā)者可以通過調(diào)用 onXX() 的方法獲取到相關(guān)的通知信息。

接下來講下各種狀態(tài)在何時觸發(fā):

1、Running狀態(tài):

期間觸發(fā)的函數(shù)及順序為: onCreate() ->on Start() -> onResume()。

注意:

1.1:onCreate()只有在該Activity是第一次被創(chuàng)建時才會被調(diào)用,主要是負(fù)責(zé)Activity的一般性的初始化設(shè)置,包括視圖的創(chuàng)建,數(shù)據(jù)的綁定等等。

 需要注意的是若之前有凍結(jié)的state(即系統(tǒng)對該Activity調(diào)用過onSaveInstanceState()函數(shù)),則可以通過其 Bundle 參數(shù)進行state恢復(fù)。

1.2:on Start()是當(dāng)Activity正在變?yōu)榭梢姞顟B(tài)時才會被調(diào)用。一般地在此期間可以注冊一個廣播等等。

1.3:onResume()是在該Activity將要和用戶進行交互時被調(diào)用,此時Activity位于的活動棧頂部。

2、Paused狀態(tài):

運行狀態(tài)到暫停狀態(tài)所觸發(fā)的函數(shù)及順序為:onResume() -> onPuased()

 暫停狀態(tài)恢復(fù)至運行狀態(tài)所觸發(fā)的函數(shù)及順序為:onPuased() -> onResume()。     

注意:

2.1:onPuased()是當(dāng)一個Activity失去系統(tǒng)焦點后將會被調(diào)用,包括見面被部分遮擋,以及設(shè)備轉(zhuǎn)入休眠狀態(tài)等等。一般地在此期間對一些未保存的數(shù)據(jù)進行持久化并停 止其他需要耗費CPU的操作,同時不可進行耗時操作,否則會阻塞系統(tǒng)UI線程。

2.2:一個處于暫停狀態(tài)的Activity只有在系統(tǒng)極度缺乏內(nèi)存資源的情況下才會被系統(tǒng)強制結(jié)束。

3、stopped狀態(tài):

暫停狀態(tài)到停止?fàn)顟B(tài)所觸發(fā)的函數(shù)及順序為:onPuased() -> on Stop()。

停止?fàn)顟B(tài)恢復(fù)至運行狀態(tài)所觸發(fā)的函數(shù)及順序為:on Stop() -> onRestart() -> on Start() -> onResume()。

注意:

3.1:on Stop()是當(dāng)一個Activity變?yōu)椴豢梢姇r將會被調(diào)用,此時可能是由于該Activity要被注銷或新的Activity完全遮擋了該Activity。在此期間一般可以進行取消注冊 廣播等操作,因此用戶不可見。

3.2:onRestart()是當(dāng)一個Activity從停止?fàn)顟B(tài)恢復(fù)至運行狀態(tài)時將會被優(yōu)先調(diào)用。

4、Killed狀態(tài):

停止?fàn)顟B(tài)到死亡狀態(tài)分為兩種情況:(1)由用戶操作導(dǎo)致,則執(zhí)行:on Stop() -> onDestroy()。

                (2)由系統(tǒng)自動強制執(zhí)行,則該Activity被強行結(jié)束。

注意:

4.1:onDestroy()是當(dāng)一個Activity正在被系統(tǒng)finished期間被調(diào)用的。

 第二:掌握Activity的生命周期及各個階段觸發(fā)的事件名稱和觸發(fā)次數(shù)

Activity一共有七個生命周期函數(shù),分別為onCreate(),onRestart(),on Start(),onReusme(),onPause(),on Stop(),onDestory()。

1:onCreate()

當(dāng)Acitivity第一次被創(chuàng)建時觸發(fā),一般在這里要做的事情包括創(chuàng)建視圖(setContentView())、向視圖填充必要的數(shù)據(jù)等等。

2:onRestart()

如果Activity之前被stop過,那么下一次onStart()方法之前會先觸發(fā)這個方法,當(dāng)處于停止?fàn)顟B(tài)的活動需要再次展現(xiàn)給用戶的時候,觸發(fā)該方法。

3:onStart()

只要Activity從不可見變成可見,就會觸發(fā)到這個方法,但被AlertDialog遮擋/顯示的情況不算在內(nèi)。

 4:onResume()

當(dāng)Activity來到最上層的時候,也就是開始與用戶直接交互時,觸發(fā)這個方法。例如本來Activity被一個AlertDialog遮擋,當(dāng)這個AlertDialog消失時,onResume()方法就被觸發(fā)。

5:onPause()

同onResume()的觸發(fā)條件剛好相反,如果Activity本來在最上層,當(dāng)它要讓出最上層的位置時會觸發(fā)這個方法。

onPause()和onResume()是被觸發(fā)最頻繁的兩個方法,所以在這里不應(yīng)該執(zhí)行過于消耗資源的方法。

6: onStop ()

當(dāng)一個活動不再需要展示給用戶的時候,觸發(fā)該方法。如果內(nèi)存緊張,系統(tǒng)會直接結(jié)束這個活動,而不會觸發(fā) onStop 方法。

所以保存狀態(tài)信息是應(yīng)該在onPause時做,而不是onStop時做。活動如果沒有在前臺運行,都將被停止或者Linux管理進程為了給新的活動預(yù)留足夠的存儲空間而隨時結(jié)束這些活動。因此對于開發(fā)者來說,在設(shè)計應(yīng)用程序的時候,必須時刻牢記這一原則。在一些情況下,onPause方法或許是活動觸發(fā)的最后的方法,因此開發(fā)者需要在這個時候保存需要保存的信息。

7: onDestroy ()

當(dāng)活動銷毀的時候,觸發(fā)該方法。和onStop 方法一樣,如果內(nèi)存緊張,系統(tǒng)會直接結(jié)束這個活動而不會觸發(fā)該方法。

接下來我們用代碼來實現(xiàn)具體的方法觸發(fā):

創(chuàng)建一個android項目,在MainActivity中進行編輯    

public class MainActivity extends Activity {
  
  // onCreate系統(tǒng)自動初始化
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.i("--MainActivity--","--------onCreate- 系統(tǒng)自動初始化---------");
  }
  
  //從stop轉(zhuǎn)為激活狀態(tài)時執(zhí)行
  @Override
  protected void onRestart() {
    super.onRestart();
    Log.i("--MainActivity--", "------onRestart--stop轉(zhuǎn)為激活狀態(tài)時執(zhí)行----");
  }
    
  //Activity開始加載事件時執(zhí)行(新創(chuàng)建時,或者重新啟動的時候執(zhí)行!)
  @Override
  protected void onStart() {
    super.onStart();
    Log.i("--MainActivity--", "--------onStart---開始加載事件時執(zhí)行-----");
  }
  
  //Activity恢復(fù)到激活狀態(tài)時執(zhí)行(任何一次進入激活狀態(tài)都將執(zhí)行)
  @Override
  protected void onResume() {
    super.onResume();
    Log.i("--MainActivity--", "----------onResume-恢復(fù)到激活狀態(tài)時執(zhí)行-------------");
  }
  
  //Activity 被覆蓋的時候執(zhí)行
  @Override
  protected void onStop() {
    super.onStop();
    Log.i("--MainActivity--", "-------onStop ----被覆蓋的時候執(zhí)行-----------");
  }
  
  //Activity 退出或者被回收時執(zhí)行,僅執(zhí)行一次
  @Override
  protected void onDestroy() {
    super.onDestroy();
    Log.i("--MainActivity--","---------onDestroy---退出或者被回收時執(zhí)行,僅執(zhí)行一次--------------");
  }

}

當(dāng)我們啟動部署程序的時候,通過LogCat 日志來查看信息

以上就是關(guān)于掌握Activity的生命周期及各個階段觸發(fā)的事件名稱和觸發(fā)次數(shù)

 第三:掌握Activity中如何在各個窗體之間傳值

如上我們知道了Activity是一個窗體的頁面顯示,既然是頁面顯示,那么我們就需要進行顯示數(shù)據(jù)與讀取數(shù)據(jù),那么問題來了,Activity中如何在各個窗體之間進行傳值。

這里引入一個關(guān)鍵字: Intent:在Android中,Intent對象負(fù)責(zé)各個Activity窗口之間的切換,同時他更擔(dān)負(fù)起數(shù)據(jù)傳輸重任。 

接下來我們用代碼來具體實現(xiàn)分析(采用工具Eclipse):

第一:首先我們創(chuàng)建一個名為ActivityValue 的Android項目 并在src 目錄下分別創(chuàng)建名為:SecondActivity JAVA普通類 ,Second_OneActivity JAVA普通類 分別繼承Activity

在目錄layout 中創(chuàng)建分別跟SecondActivity ,Second_OneActivity  相對應(yīng)的布局xml文件

名為:activity_second_one.xml
 名為:activity_second.xml
 接下來我們在SecondActivity.java 文件中進行編輯:

 package com.example.activityvalue;

import java.util.ArrayList;

import com.example.activitylife.R;
import com.example.activityvalue.Second_OneActivity;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class SecondActivity extends Activity{

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //聲明Activity
    setContentView(R.layout.activity_second);
  }
  
  //傳遞一個普通值到一個窗體
  public void MytestOne(View view){
    System.out.println("=================傳遞一個普通值到一個窗體=====================");
    Intent intent = new Intent(this,Second_OneActivity.class);
    //窗體傳值
    intent.putExtra("stuName","ABC");
    intent.putExtra("stuage",20);
    intent.putExtra("isMerry",false);
    //設(shè)置數(shù)組
    intent.putExtra("stuHobby",new String[]{"籃球","羽毛球","足球"});
    //設(shè)置集合數(shù)值
    ArrayList<String> list = new ArrayList<String>();
    list.add("北京");
    list.add("廣東");
    list.add("美國");
    //設(shè)置數(shù)值到Intent 中
    intent.putStringArrayListExtra("stuCitys",list);
    //開啟Activity
    startActivity(intent);
  }
  
}

我們先在SecondActivity 文件中部署好我們需要取出的數(shù)據(jù) 不同的類型數(shù)據(jù)m,由上文可知我們是通過intent 來進行傳值

在Second_OneActivity 進行編輯:

package com.example.activiyvalue;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class Second_OneActivity extends Activity{
  
  private TextView showText;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    //聲明一個布局文件
    setContentView(R.layout.activity_second_one);
    
    //從Intent 中取出傳遞過來的數(shù)據(jù)
    Intent intent = getIntent();
    
    //取出普通數(shù)據(jù)
    String name = intent.getStringExtra("stuName");
    int age = intent.getIntExtra("stuAge", 0);
    boolean isMerry = intent.getBooleanExtra("isMerry",false);
    
    //取出數(shù)組數(shù)據(jù)
    String[] hobbys = intent.getStringArrayExtra("stuHobby");
    String hobby = Arrays.toString(hobbys);
    
    //取出ArrayList 集合數(shù)據(jù)
    ArrayList<String> citys =intent.getStringArrayListExtra("stuCitys");
    String city = Arrays.toString(citys.toArray());
    
    //聲明Activity
    showText = (TextView) findViewById(R.id.showText);
    
    //在Activity 中動態(tài)添加文本內(nèi)容
    String str = "姓名:"+name+",年齡:"+age+"\n"+
           "婚否:"+isMerry+"\n"+
           "愛好:"+hobby+"\n"+
           "城市:"+city;
    showText.setText(str);  
 
}

如果在第21 行 聲明一個布局文件 報錯時,則說明R 文件中 沒有自動生成句柄  我們可以這樣做

在項目右擊重新加載項目便可:

接下來我們要在項目目錄下的AndroidMainifest.xml 中進行聲明Activity 類文件

在聲明的前提我們先進行設(shè)置好string參數(shù)

接下來在AndroidMainifest.xml 開始聲明
接下來要回到MainActivity.java 定義一個方法 用來轉(zhuǎn)跳Activity

 //============================打開一個窗體傳值的案例==============================
   public void setValuesMyDemo(View view){
     Intent intent = new Intent(this,SecondActivityclass); //創(chuàng)建一個Activity對象
     //開始激活A(yù)ctivity狀態(tài)為start
     startActivity(intent);
   }

在activity_mainxml 布局文件中定義一個Button 按鈕

 <Button
 android:id="@+id/button"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="Activity窗體傳值案例"
 android:onClick="setValuesMyDemo" />

按鈕綁定一個方法對應(yīng)的是MainActivity.java 中的 setValuesMyDemo 方法

setValuesMyDemo 方法中調(diào)用 下一個Activity  也就是SecondActivity.java 對應(yīng)的布局文件

那么我們就要在SecondActivity.java 對應(yīng)的布局文件activity_second.xml 中添加一個button

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="通過Intent傳遞普通數(shù)據(jù)" 
    android:onClick="MytestOne"/>

activity_second.xml 中點擊事件綁定的方法是SecondActivity.java 文件中對應(yīng)的MytestOne方法:
在MytestOne方法中 調(diào)用了下一個Activity 也就是Second_OneActivity.java   我們在這個文件中進行讀取數(shù)據(jù) 在SecondActivity.java文件中進行設(shè)置數(shù)值

接下來見證奇跡的時刻:我們運行我們的程序,打開我們的模擬器或者真機部署文件
點擊窗體中的button 進入SecondActivity的布局文件了  (此時就進行了頁面的跳轉(zhuǎn))
在SecondActivity頁面我們是進行了設(shè)置數(shù)值 因此 當(dāng)再次點擊的時候我們在Second_OneActivity 的布局文件就要進行讀取數(shù)據(jù)
點擊 顯示跳轉(zhuǎn)如下:

總結(jié): 由上圖案例可知,Activity與Activity 之間的跳轉(zhuǎn) 跟 Activity與Activity 之間的傳值  是通過上一個Activity對下一個Activity的調(diào)用,其中intent 對象 起到的方法很重要,起著跳轉(zhuǎn)跟傳值的任務(wù)!

 第三: 掌握Activity窗體狀態(tài)保存問題

在這里如何保存當(dāng)前的窗體狀態(tài)我們通過代碼來實現(xiàn): 

在我們上面的案例基礎(chǔ)上,到MainActivity.java 文件中 重寫Activity 的兩個方法:

onRestoreInstanceState(Bundle savedInstanceState)

//========================窗體狀態(tài)保存與恢復(fù)====================================
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
      super.onRestoreInstanceState(savedInstanceState);
      //恢復(fù)狀態(tài)
      if(savedInstanceState!=null){
        String msg = savedInstanceState.getString("message");
        //設(shè)置這個數(shù)據(jù)到需要的地方
        Toast.makeText(this, "以前的消息:"+msg, 50000).show();
      }
    }

onSaveInstanceState(Bundle outState)

//========================保存的狀態(tài)====================================
    @Override
    protected void onSaveInstanceState(Bundle outState) {
      // TODO Auto-generated method stub
      super.onSaveInstanceState(outState);
      //保存數(shù)據(jù)
      outState.putString("message", "Hello!");
      Toast.makeText(this, "狀態(tài)已經(jīng)保存!", 3000).show();
    }

完畢之后,我們開始運行程序最終結(jié)果如下:

到此這篇關(guān)于android初學(xué)者必須掌握的Activity狀態(tài)的四大知識點的文章就介紹到這了,更多相關(guān)activity的四種狀態(tài)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android RecyclerView 數(shù)據(jù)綁定實例代碼

    Android RecyclerView 數(shù)據(jù)綁定實例代碼

    本文主要介紹Android RecyclerView 數(shù)據(jù)綁定的資料,這里詳細(xì)說明如何實現(xiàn) Android RecyclerView的數(shù)據(jù)綁定,并附示例代碼,有需要的小伙伴可以參考下
    2016-09-09
  • loadavg數(shù)據(jù)異常引發(fā)問題起源分析

    loadavg數(shù)據(jù)異常引發(fā)問題起源分析

    這篇文章主要為大家介紹了loadavg數(shù)據(jù)異常引發(fā)問題起源分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • android暫?;蛲V蛊渌魳凡シ牌鞯牟シ艑崿F(xiàn)代碼

    android暫?;蛲V蛊渌魳凡シ牌鞯牟シ艑崿F(xiàn)代碼

    來自android自帶的music源碼,下面是廣播接收的代碼,通過發(fā)送廣播來控制音樂的播放,停止等
    2013-11-11
  • Android列表點擊事件定義的一些思考

    Android列表點擊事件定義的一些思考

    大家好,本篇文章主要講的是Android列表點擊事件定義的一些思考,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Android 無預(yù)覽拍照功能

    Android 無預(yù)覽拍照功能

    最近小編接到一個項目,遇到這樣的需求,要求在后臺拍照并保存功能,也就是無預(yù)覽拍照功能,下面小編給大家?guī)砹藢嵗a,需要的朋友參考下
    2018-02-02
  • android gradle如何修改生成的apk名字

    android gradle如何修改生成的apk名字

    Gradle是當(dāng)前非常“勁爆”得構(gòu)建工具,而這篇文章主要給大家介紹了關(guān)于android gradle如何修改生成的apk名字的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Android實現(xiàn)仿淘寶購物車增加和減少商品數(shù)量功能demo示例

    Android實現(xiàn)仿淘寶購物車增加和減少商品數(shù)量功能demo示例

    這篇文章主要介紹了Android實現(xiàn)仿淘寶購物車增加和減少商品數(shù)量功能,結(jié)合實例形式分析了Android實現(xiàn)的淘寶購物車商品數(shù)量變換與計算相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • Android將String保存為SD卡中TXT文件的方法

    Android將String保存為SD卡中TXT文件的方法

    今天小編就為大家分享一篇Android將String保存為SD卡中TXT文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • android監(jiān)聽軟鍵盤的彈出與隱藏的示例代碼

    android監(jiān)聽軟鍵盤的彈出與隱藏的示例代碼

    本篇文章主要介紹了android監(jiān)聽軟鍵盤的彈出與隱藏的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • activitygroup 切換動畫效果如何實現(xiàn)

    activitygroup 切換動畫效果如何實現(xiàn)

    本文將詳細(xì)介紹activitygroup 切換動畫效果實現(xiàn)過程,需要聊解的朋友可以參考下
    2012-12-12

最新評論