一塊兒學Android之Activity

概述

本文以一個簡單的小例子,簡述Android開發中Activity的相關知識,僅供學習分享使用。app

什麼是Activity?

Activity是一個應用程序組件,一般顯示爲一個頁面,用戶能夠經過Activity進行交互,Activity窗口一般是滿屏的,但有時也會比屏幕小。一個App一般有多個Activity組成,可是隻有一個Main類型的Activity,做爲程序的入口。每次有一個新的Activity啓動時,前一個Activity會中止而且被壓入堆棧中,所以當用戶按下【回退】鍵時,當前Activity就會從堆棧中彈出並銷燬,前一個Activity會恢復顯示在當前窗口中。ide

當一個Activity由於新Activity的啓動而中止時,它會經過Activity生命週期的回調函數通知狀態的變動。因爲某個Activity的狀態發生變化,可能接收到多個回調方法,您就能夠在各個不一樣的回調方法中作適合於此狀態的工做。如當Activity中止時,應當釋放一些佔用內存的資源,當活動恢復時,應該從新獲取資源,並恢復被阻止的操做。這些都是生命週期的一部分。函數

涉及知識點

  1. this.findViewById(R.id.bn_click_me) 經過此函數獲取頁面上的控件,參數爲控件ID
  2. startActivityForResult(intent,REQCODE);  啓動Activity並帶請求標識符。
  3. onActivityResult(int requestCode, int resultCode, Intent data); 經過重寫此方法處理回調程序。
  4. setResult(int resultCode, Intent data) 調用此方法設置返回信息到調用方。
  5. finish() 調用此方法關閉Activity
  6. setContentView(R.layout.activity_main2); 經過此方法加載Activity對應的資源文件。

Activity的組成

一個新的Activity包含四個組成部分:佈局

  1. 必需繼承自ActivityActivity的子類。
  2. 必需重寫onCreate(Bundle savedInstanceState) 方法。
  3. 必需有對應的資源佈局文件,並在onCreate 方法中,經過 setContentView 方法進行加載。
  4. 必需在App的資源程序清單【AndroidManifest.xml】中進行註冊。

以下圖所示:學習

Activity的生命週期

Activity的生命週期,是指一個Activity從建立到消亡的過程。以下圖所示,就像人的生命週期同樣,只有瞭解了生命週期的不一樣階段,才能在對應的時間節點,作對應的事情。this

Activity的整個生命週期,都是發生在Activity launched 和Activity shut down之間,從回調函數上看,發生在 onCreate() 和 onDestroy()之間,以下圖所示:spa

Activity的狀態轉換以下:日誌

單個Activity的運行日誌以下:code

1 05-25 23:33:18.863 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onCreate----------------
2 05-25 23:33:18.978 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onStart----------------
3 05-25 23:33:18.983 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onResume----------------
4 05-25 23:33:32.810 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onPause----------------
5 05-25 23:33:33.420 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onStop----------------
6 05-25 23:33:33.420 15877-15877/com.hex.demoactivity I/DemoActivity: -----------1-----onDestroy----------------

兩個Activity運行狀態日誌以下:xml

 1 //顯示第一個Activity
 2 05-25 23:35:59.279 16770-16770/? I/DemoActivity: -----------1-----onCreate----------------
 3 05-25 23:35:59.409 16770-16770/? I/DemoActivity: -----------1-----onStart----------------
 4 05-25 23:35:59.413 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onResume----------------
 5 05-25 23:36:04.367 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onPause----------------
 6 //進入第二個Activity
 7 05-25 23:36:04.391 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onCreate----------------
 8 05-25 23:36:04.413 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onStart----------------
 9 05-25 23:36:04.417 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onResume----------------
10 05-25 23:36:04.855 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onStop----------------
11 //點擊返回鍵,返回第一個Activity
12 05-25 23:36:06.872 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onPause----------------
13 05-25 23:36:06.889 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onRestart----------------
14 05-25 23:36:06.889 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onStart----------------
15 05-25 23:36:06.890 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onResume----------------
16 05-25 23:36:07.181 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onStop----------------
17 05-25 23:36:07.182 16770-16770/com.hex.demoactivity I/DemoActivity: -----------2-----onDestroy----------------
18 //再次點擊返回鍵,退出程序
19 05-25 23:36:08.762 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onPause----------------
20 05-25 23:36:09.296 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onStop----------------
21 05-25 23:36:09.296 16770-16770/com.hex.demoactivity I/DemoActivity: -----------1-----onDestroy----------------

Activity之間的傳值

Activity之間的傳值方式:

  1. Activity之間經過Intent傳值。
  2. Activity之間經過Bundle傳值。
  3. Activity之間使用Application全局對象傳值。
  4. 啓動Activity回傳對象傳值。

 

Activity之間經過Intent傳值,主要用於傳遞簡單類型的數據。

發送方以下:

1 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
2 intent.putExtra("Name","張三");
3 intent.putExtra("Age",30);
4 startActivity(intent);

接收方以下:

1 Intent intent=getIntent();//獲取當前Activity對應的Intent
2 String name=  intent.getStringExtra("Name");//獲取Intent中存儲的值
3 int age =intent.getIntExtra("Age",0);
4 tvValue.setText("Name="+name+",Age="+age);//將獲取的值顯示在TextView中

Activity之間經過Bundle傳值

主要用於傳遞稍微複雜類型的值,具體以下:

發送方:

1 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
2 Bundle bundle=new Bundle();
3 bundle.putString("Name","張三");
4 bundle.putInt("Age",30);
5 intent.putExtras(bundle);
6 startActivity(intent);

接收方:

1 Intent intent=getIntent();//獲取當前Activity對應的Intent
2 Bundle bundle=intent.getExtras();
3 String name=bundle.getString("Name","");
4 int age=bundle.getInt("Age",0);
5 tvValue.setText("Name="+name+",Age="+age);//將獲取的值顯示在TextView中

Activity之間經過Application全局變量進行傳值。

步驟以下:

自定義MyApp類,繼承自Application類,自定義兩個變量並進行封裝成屬性。以下所示:

 1 /**
 2  * Created by Administrator on 2019/5/26.
 3  * 右鍵Refactor(重構)-->encapsulate Fields (封裝屬性)
 4  */
 5 public class MyApp extends Application {
 6 
 7     private String name;
 8 
 9     private int age;
10 
11     public String getName() {
12         return name;
13     }
14 
15     public void setName(String name) {
16         this.name = name;
17     }
18 
19     public int getAge() {
20         return age;
21     }
22 
23     public void setAge(int age) {
24         this.age = age;
25     }
26 }

發送方:

1 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
2 myapp= (MyApp) getApplication();
3 myapp.setName("張三");
4 myapp.setAge(30);
5 startActivity(intent);

接收方:

1 //經過Application進行傳值
2 MyApp myapp= (MyApp) getApplication();
3 String name=myapp.getName();
4 int age=myapp.getAge();
5 tvValue.setText("Name="+name+",Age="+age);//將獲取的值顯示在TextView中

經過Application的方式進行傳值,須要在AndroidManifest.xml中進行註冊,以下圖所示:

經過回調函數傳值

發送方:

 1 //定義一個靜態變量REQCODE做爲標識符,經過startActivityForResult進行調用。
 2 Intent intent =new Intent(MainActivity.this,Main2Activity.class);
 3 startActivityForResult(intent,REQCODE);
 4 
 5 /**
 6 *經過重寫父類的onActivityResult方法接收並處理回傳信息
 7 */
 8 @Override
 9 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
10     //super.onActivityResult(requestCode, resultCode, data);
11     if(resultCode==RESULT_OK){
12         if(requestCode==REQCODE){
13             String Res=data.getStringExtra("Res");
14             Toast.makeText(MainActivity.this,"Res="+Res,Toast.LENGTH_SHORT).show();
15         }
16     }
17 }

接收方:經過調用setResult方法,回傳信息

 

1 tvInfo.setOnClickListener(new View.OnClickListener() {
2     @Override
3     public void onClick(View v) {
4         Intent intent1=new Intent();
5         intent1.putExtra("Res","我是第二個傳過來的");
6         Main2Activity.this.setResult(RESULT_OK ,intent1);
7         Main2Activity.this.finish();
8     }
9 });

 

備註

紙上得來終覺淺,絕知此事要躬行。

相關文章
相關標籤/搜索