本文以一個簡單的小例子,簡述Android開發中Activity的相關知識,僅供學習分享使用。app
Activity是一個應用程序組件,一般顯示爲一個頁面,用戶能夠經過Activity進行交互,Activity窗口一般是滿屏的,但有時也會比屏幕小。一個App一般有多個Activity組成,可是隻有一個Main類型的Activity,做爲程序的入口。每次有一個新的Activity啓動時,前一個Activity會中止而且被壓入堆棧中,所以當用戶按下【回退】鍵時,當前Activity就會從堆棧中彈出並銷燬,前一個Activity會恢復顯示在當前窗口中。ide
當一個Activity由於新Activity的啓動而中止時,它會經過Activity生命週期的回調函數通知狀態的變動。因爲某個Activity的狀態發生變化,可能接收到多個回調方法,您就能夠在各個不一樣的回調方法中作適合於此狀態的工做。如當Activity中止時,應當釋放一些佔用內存的資源,當活動恢復時,應該從新獲取資源,並恢復被阻止的操做。這些都是生命週期的一部分。函數
一個新的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之間經過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 });
紙上得來終覺淺,絕知此事要躬行。