Android 第三課 Activity的生命周期

?新建項目ActivityLifeCycleTest,創建主活動后,再新建兩個子活動--NormalActivity和DialogActivity。

現在活動及其對應布局文件創建完畢。

編輯normal_layout.xml文件,代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"> <TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content" android:text="This is a normal activity"/>
</LinearLayout>

只是簡單是使用了一個TextView,用來顯示一行文字。

然后編輯dialog_layout.xml,代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content" android:text="This is a dialog activity"/>
</LinearLayout>

從名字上可以看出來這兩個子活動一個是普通的活動,一個是對話框式的活動。現在我們來修改這個對話框式的活動,打開AndroidManifest.xml文件的<activity>標簽,并修改。代碼如下:

<activity android:name=".DialogActivity"android:theme="@style/Theme.AppCompat.Dialog">
</activity>

這里是活動的注冊碼,并且只給DialogActivity的代碼進行了修改,給它使用了android:theme屬性,這是用來給當前活動指定主題的,Android系統內置了很多主題可以選擇,這里是讓DialogActivity使用對話框式的主題。

接下來,重新定制主活動的布局,將里面的代碼替換成如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/start_normal_activity"android:layout_width="match_parent"android:layout_height="wrap_content" android:text = "Start NormalActivity"/><Buttonandroid:id="@+id/start_dialog_activity"android:layout_width="match_parent"android:layout_height="wrap_content" android:text= "Start DialogActivity"/>
</LinearLayout>

只是添加了兩個按鈕,分別對應兩個子活動。

最后修改MainActivity中的代碼,如下所示:

package com.example.activitylifecycletest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity { public  static final  String TAG = "MainActivity";?//定義當前類名為常量@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button StartNormalActivity = (Button) findViewById(R.id.start_normal_activity);Button StartDialogActivity = (Button) findViewById(R.id.start_dialog_activity);StartNormalActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,NormalActivity.class);startActivity(intent);}});StartDialogActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,DialogActivity.class);startActivity(intent);    }})} @Overrideprotected void onStart() {super.onStart();Log.d(TAG,"onStart");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG,"onResume");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG,"onPause");}@Overrideprotected void onStop() {super.onStop();Log.d(TAG,"onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG,"onDestroy");}
}

在onCreate()方法中,我們分別為兩個按鈕定義了點擊事件,點擊按鈕會啟動相應的Activity,然后會在Activity的7個回調方法中分別打印了一句話,這樣更好的觀察理解活動的生命周期。

  • 倘若活動被回收了怎么辦?

假設有一個活動A,在活動A的基礎上啟動了活動B,那么活動A進入了Stop狀態,這時突然由于系統內存不存,將活動A回收了,然后用戶按下Back鍵返回活動A,會出現什么情況呢?還是會正常啟動A的,只不過并不是執行onReStart()方法,而是會執行活動A的onCreate()方法,因為活動A在這種情況會被重新創建一次。那么加入活動A本來是存在臨時數據和狀態的,那么重新創建一次,什么都不沒有顯示了,這不是令人很難過嗎?

經查閱文檔。Activity中還提供了一個onSaveInstanceState()回調方法,這個方法可以保證活動在回收之前一定被調用,因此這個方法來解決活動被回收時,臨時數據得不到保存的問題。

onSaveInstanceState()方法會攜帶一個Bundle類型的參數,Bundle提供了一系列的方法用于保存數據,例如可以使用putString()來保存字符串,使用putInt()保存整型,每個保存方法有兩個參數,一個是鍵,用于后面從Bundle中取值,第二個參數是真正要保存的內容。這么看來,鍵和保存的內容是一一對應的吧。

在MainActivity中添加如下代碼:

@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);String tempData = "Something you just typed";outState.putString("data_key",tempData);}
我們是在MainActivity文件中重寫了這個方法。那么數據是保存好了,但是我們應該在哪里恢復呢?我們之前一直使用的onCreate()方法其實也有一個Bundle類型的參數。這個參數一般情況是null,但是如果在活動被回收之前有通過onSaveInstanceState()方法來保存數據的話,這個參數就會帶有之前所保存的全部數據,我們只需要修改MainActivity的onCreate()方法,代碼如下:
 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG,"onCreate");setContentView(R.layout.activity_main);if(savedInstanceState !=null){String tempData = savedInstanceState.getString("data_key");Log.d(TAG,tempData);}Button StartNormalActivity = (Button) findViewById(R.id.start_normal_activity);Button StartDialogActivity = (Button) findViewById(R.id.start_dialog_activity);StartNormalActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,NormalActivity.class);startActivity(intent);}});StartDialogActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,DialogActivity.class);startActivity(intent);}});}
Intent還可以結合Bundle一起用于傳輸數據,首先可以把需要傳遞的數據都保存在Bundle對象中,然后再將Buddle對象存放在Intent里。到了目標活動之后先從Intent中取出Bundle,在從Bundle中一一取出數據。




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274134.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274134.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274134.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

轉載:Apache commons開源工具簡介

Apache Commons是一個非常有用的工具包&#xff0c;解決各種實際的通用問題&#xff0c;下面是一個簡述表&#xff0c;詳細信息訪問http://jakarta.apache.org/commons/index.html BeanUtilsCommons-BeanUtils 提供對 Java 反射和自省API的包裝 BetwixtBetwixt提供將 JavaBean …

pb 插入報列在此處不_獲取有關[在此處插入問題]的事實

pb 插入報列在此處不Twitter’s recent move to put notices on tweets themselves is one of the most controversial social media features during our times. As a design technologist, I can’t help but wonder the decision-making process behind it. It’s a perfect…

設計模式_單實體模式

Singleton 三要素&#xff1a;private 構造函數、 public 靜態方法、 public 靜態變量 單實例模式的三種線程安全實現方式&#xff08;&#xff23;&#xff0b;&#xff0b;&#xff09; &#xff11; 懶漢模式&#xff1a;即第一次調用該類實例的時候才產生一個新的該類實例…

Android 第四課 活動的啟動模式

啟動模式分為4種&#xff0c;分別為standard&#xff0c;singleTop&#xff0c;singleTask&#xff0c;和singleInstance我們可以在AndroidManifest.xml中通過給<activity>標簽指定android:launchMode屬性來選擇啟動模式。standard standard是活動默認的啟動模式。在stan…

c++編寫托管dll_教程:如何編寫簡單的網站并免費托管

c編寫托管dll本教程適用于誰&#xff1f; (Who is this tutorial for?) This tutorial assumes no prior knowledge and is suitable for complete beginners as a first project 本教程假定您沒有先驗知識&#xff0c;并且適合初學者作為第一個項目 您將需要什么 (What you w…

淺述WinForm多線程編程與Control.Invoke的應用

在WinForm開發中&#xff0c;我們通常不希望當窗體上點了某個按鈕執行某個業務的時候&#xff0c;窗體就被卡死了&#xff0c;直到該業務執行完畢后才緩過來。一個最直接的方法便是使用多線程。多線程編程的方式在WinForm開發中必不可少。本文介紹在WinForm開發中如何使用多線程…

Android 第五課 常用控件的使用方法(TextView、Button、EditView、 ImageView、 ProgressBar、 ProgressDialog等)

總結&#xff1a;見名知意 TextView&#xff1a; Button: EditView: ImageView: ProgressBar: ProgressDialog和AlertDialog有些類似&#xff0c;都可以再界面彈出對話框&#xff0c;都能夠屏蔽其他控件的交互能力&#xff0c;用法也類似。 我們還發現ProgressDialog和AlertDia…

設計 色彩 構圖 創意_我們可以從時尚的創意方向中學到色彩

設計 色彩 構圖 創意The application of fashion as a form of aesthetic expression is a notion familiar to many. Every day, we curate ourselves with inspiration from rising trends, a perception of our personal preferences, and regards to practicality in the c…

Android 第六課 4種基本布局之LinearLayout和Relativelayout

看完控件&#xff0c;緊接著看布局&#xff0c;布局是可以來放置控件&#xff0c;管理控件的。布局里也可以嵌套布局。我們新建項目UILayoutTest項目&#xff0c;活動名和布局名選擇默認。加入活動及其對應的布局已經創建完成。線性布局(LinearLayout)android:layout_gravity屬…

如何在UI設計中制作完美陰影

重點 (Top highlight)Shadows are everywhere in modern UI Designs. They are one of the most essential part of the UI elements right behind the fill, stroke, and cornder radius. &#x1f609;現代UI設計中到處都有陰影。 它們是UI元素中最重要的部分之一&#xff0c…

微軟2013年校園實習生招聘筆試題及答案

原文&#xff1a; http://www.wangkaimin.com/2013/04/07/%e5%be%ae%e8%bd%af2013%e5%b9%b4%e6%a0%a1%e5%9b%ad%e5%ae%9e%e4%b9%a0%e7%94%9f%e6%8b%9b%e8%81%98%e7%ac%94%e8%af%95%e9%a2%98%e5%8f%8a%e7%ad%94%e6%a1%88/#more-195 1. Which of following calling convension(s)…

Android 第七課 4種基本布局之FrameLayout和百分比布局

FrameLayout&#xff08;幀布局&#xff09;&#xff0c;她沒有方便的定位方式&#xff0c;所有的控件都會默認擺放在布局的左上角。 修改activity_main.xml中的代碼&#xff0c;如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <Frame…

mongodb 群集圖_群集和重疊條形圖

mongodb 群集圖為什么和如何 (Why & How) 1.- Clustered Bar Charts1.- 集群條形圖 AKA: grouped, side-by-side, multiset [bar charts, bar graphs, column charts]AKA &#xff1a;分組&#xff0c;并排&#xff0c;多組[條形圖&#xff0c;條形圖&#xff0c;柱形圖] …

第一次寫python

這是一個在BJDP上學習Coding Kata的時候用到的一個練習&#xff0c;原來打算用Java寫的&#xff0c;但是一想正好是學習的好機會。 就用Python了。第一次&#xff0c;寫的有些復雜。 這個題目是關于購買圖書的打折信息的。 題目來源&#xff1a; http://codingdojo.org/cgi-bin…

Android 第八課 創建自定義控件

常用控件和布局的繼承結構&#xff0c;如下圖&#xff1a; &#xff08;待續。。。。&#xff09; 所有的控件都是直接或間接繼承自View的&#xff0c;所用的所有布局都是直接或間接繼承自ViewGroup的&#xff0c;View是Android中最基本的一種UI組件&#xff0c;它可以在屏幕上…

figma下載_搬到Figma對我意味著什么

figma下載A couple of years ago, amidst the boom of new design and prototyping software, I was pretty reluctant to fight on the Figma/Sketch cold war. I was working on a relatively small design team and, after years helping to design products, well sold on …

解決IE中img.onload失效的方法

解決IE中img.onload失效的方法 - CoffeeCats IT Blog - IT博客http://www.cnitblog.com/CoffeeCat/archive/2008/02/01/39533.htmlFirefox、Google Chrome不存在問題&#xff01;為什么onload沒有被IE調用呢&#xff1f;因為IE會緩存圖片&#xff0c;第2次加載的圖片&#xff0…

Android 第九課 常用控件-------ListView

ListView允許用戶通過手指上下滑動的方式將屏幕外的數據滾動到屏幕內&#xff0c;同時屏幕上原有數據將會滾動出屏幕。 1、ListView簡單用法 如何將ListView將你要顯示的大量內容關聯起來呢&#xff1f;這是個很重要的問題。 1、首先我們必須先將數據提供好&#xff0c;因為你的…

Singleton patterns 單件(創建型模式)

1、模式分類 1.1 從目的來看&#xff1a; ? – 創建型&#xff08;Creational&#xff09;模式&#xff1a;負責對象創建。 ? – 結構型&#xff08;Structural&#xff09;模式&#xff1a;處理類與對象間的組合。 ? – 行為型&#xff08;Behavioral&…

Android 第十一課 SQlite 數據庫存儲

Android 為了讓我們能夠更加方便的管理數據庫&#xff0c;特意提供了一個SQLiteOpenHelper幫助類&#xff0c;通過借助這個類就可以非常簡單的對數據庫進行創建和升級。 SQLiteOpenHelper是一個抽象類&#xff0c;我們要創建一個自己的幫助類去繼承它。SQLiteOpenHelper有兩個抽…