Android 四大组件
文章目錄
- 一、Activity 活動
- 1. Activity的創建
- (1). Android studio創建Activity
- (2). Activity使用流程
- 2. Activity的生命周期
- (1). 生命周期的狀態
- 1. 啟動狀態
- 2. 運行狀態
- 3. 暫停狀態
- 4. 停止狀態
- 5. 銷毀狀態
- (2). 生命周期的方法
- 1. onCreate()方法
- 2. onStart()方法
- 3. onResume()方法
- 4. onPause()方法
- 5. onStop()方法
- 6. onDestroy()方法
- 7.onRestart()方法
- 3. Activity的啟動模式
- (1). Android任務棧
- (2). Activity的四種啟動模式
- 1. standard 模式
- 2. singleTop 模式
- 3. singleTask 模式
- 4. singleInstance 模式
- 4. Activity之間的跳轉
- 1. 顯示意圖
- 2. 隱式意圖(隱式啟動:通過Intent-filter的Action,Category或data來實現)
- 5. Activity之間的數據傳遞
- (1). 數據傳遞
- 1. 商家配送
- 2. 中間小哥配送
- (2). 數據回傳(后一個傳回給前一個)
- 6. 系統給我們提供的常見的Activity
- 7. Fragment(碎片)
- (1). Fragment的生命周期
- (2). 創建Fragment
- (3). 在Activtiy中添加Fragment
- 1. 直接在布局文件中添加Fragment
- 2. 當Activity運行時添加Fragment
- 二、BroadcastReceiver 提供廣播接收器
- 1. 廣播接受者簡介
- 2. 廣播接受者入門
- 3. 自定義廣播
- 4. 廣播的類型
- 三、Service 服務
- 1. 服務的創建
- 2. 服務的生命周期
- 3. 服務的啟動方式
- 4. 服務的通信
- 四、ContentProvider 內容提供者
- 1. 內容提供者簡介
- 2. 內容提供者的創建
- 3. 內容提供者的使用
- 4. 內容觀察者的使用
- 五. Intent(意圖)
- 1. Intent簡介
- 2. Intent對象的屬性
- (1). Component Name屬性
- (2). Action和Data屬性
- (3). Action和Category
- (4). Extras屬性
- (5). Flags屬性
- 3. Intent的種類
- (1). 顯式Intent
- (2). 隱式Intent
- 4. Intent過濾器
一、Activity 活動
在Android中,用戶與程序的交互是通過Activity完成的,activity負責管理應用程序的用戶界面。
Activity是Android程序中的四大組件之一,為用戶提供可視化界面及操作。一個應用程序通常包含多個Activity,每個Activity負責管理一個用戶界面。這些界面可以添加多個控件,每個控件負責實現不同功能。
Activity是一個應用程序的組件,他在屏幕上提供了一個區域,允許用戶在上面做一些交互性的操作, 比如打電話,照相,發送郵件,或者顯示一個地圖!Activity可以理解成一個繪制用戶界面的窗口, 而這個窗口可以填滿整個屏幕,也可能比屏幕小或者浮動在其他窗口的上方!
1. Activity的創建
(1). Android studio創建Activity
創建Activity之后,重寫oncreat()方法
注意:
-
在Android中創建四大組件都需要在AndroidManifest.xml文件中注冊
-
創建完之后,Android studio會自動在AndroidManifest.xml文件中注冊
會自動添加一行 <activity android:name=".MainActivity">
(2). Activity使用流程
- 注:可以繼承Activity和AppCompatActivity,只不過后者提供了一些新的東西而已! 另外,切記,Android中的四大組件,只要你定義了,無論你用沒用,都要在AndroidManifest.xml對 這個組件進行聲明,不然運行時程序會直接退出,報ClassNotFindException…
2. Activity的生命周期
Activity的生命周期包含5種狀態,涉及7中方法。
(1). 生命周期的狀態
是一個Activity從創建到銷毀的全過程,分為以下5個狀態
1. 啟動狀態
2. 運行狀態
3. 暫停狀態
4. 停止狀態
5. 銷毀狀態
(2). 生命周期的方法
1. onCreate()方法
2. onStart()方法
3. onResume()方法
運行(過渡)
4. onPause()方法
暫停
5. onStop()方法
6. onDestroy()方法
7.onRestart()方法
從停止狀態到再次啟動狀態
3. Activity的啟動模式
Activity是可以層疊擺放的,每啟動一個新的Activity就會覆蓋在原Activity上,如果單擊返回按鈕,最上面的Activity被銷毀,下面的Activity重新顯示。
原因是:Android系統同任務棧來管理Activity實例。
(1). Android任務棧
棧數據結構:先進先出
在Android中采用任務棧形式管理Activity。
通常一個應用程序對應一個任務棧,默認情況下每啟動一個Activity都會入棧,并處于棧頂位置,用戶操作的永遠是棧頂的Activity。
- Activity啟動時壓入棧
- 用戶單擊返回彈出棧
(2). Activity的四種啟動模式
1. standard 模式
是Activity的默認啟動模式,這模式的特點:
- 每啟動一個Activity就會在棧頂創建一個新的實例
2. singleTop 模式
判斷要啟動的Activity實例是否位于棧頂,如果位于棧頂則直接復用,否則創建新的實例。
3. singleTask 模式
每次啟動該Activity時,系統首先會檢查棧中是否存在當前Activity實例,如果存在則直接使用,并把當前Activity之上的所有實例全部出棧,否則會重新創建一個實例
4. singleInstance 模式
指定為singleInstance 模式的Activity會啟動一個新的任務棧來管理Activity實例,無論從哪個任務棧中啟動該Activity,該實例在整個系統中只有一個。
- 意義:為了在不同程序中共享同一個Activity實例
4. Activity之間的跳轉
在Android系統中,每個應用通常都由多個界面組成,每個界面就是一個Activity,在這些界面進行跳轉時,實際上也就是Activity之間的跳轉,Activity之間挑戰需要用到Intent組件,通過Intent可以開啟新的Activity實現頁面的跳轉功能。
根據開啟目標組件的方式不同,Intent分類為:
1. 顯示意圖
- 明確找的對象
- 通過組件名指定啟動的目標組件,比如startActivity(new Intent(A.this,B.class)); 每次啟動的組件只有一個
2. 隱式意圖(隱式啟動:通過Intent-filter的Action,Category或data來實現)
- 模糊不明確對象
- 不指定組件名,而指定Intent的Action,Data,或Category,當我們啟動組件時, 會去匹配AndroidManifest.xml相關組件的Intent-filter,逐一匹配出滿足屬性的組件,當不止一個滿足時, 會彈出一個讓我們選擇啟動哪個的對話框
5. Activity之間的數據傳遞
Android進行消息傳遞或數據傳遞,使用的也是Intent。
- Intent不僅可以開啟Activity、Service、BroadcastReceiver組件,還能在這些組件之間傳遞數據
數據傳遞也有兩種方式:
(1). 數據傳遞
使用Bundle在Activity之間交換數據
Bundle是鍵值對的組合
1. 商家配送
放數據
接受數據,并放到文本框
2. 中間小哥配送
(2). 數據回傳(后一個傳回給前一個)
在Activity中,使用Intent既可以將數據傳給下一個Activity、還可以將數據回傳給上一個Activity
Activity中提供了一個startActivityForResult(Intent intent,int requestCode)方法,該方法也用于啟動Activity,并且這個方法可以在當前Activity銷毀時返回一個結果給上一個Activity
MainActivity
DetailActivity
6. 系統給我們提供的常見的Activity
//1.撥打電話 // 給移動客服10086撥打電話 Uri uri = Uri.parse("tel:10086"); Intent intent = new Intent(Intent.ACTION_DIAL, uri); startActivity(intent);//2.發送短信 // 給10086發送內容為“Hello”的短信 Uri uri = Uri.parse("smsto:10086"); Intent intent = new Intent(Intent.ACTION_SENDTO, uri); intent.putExtra("sms_body", "Hello"); startActivity(intent);//3.發送彩信(相當于發送帶附件的短信) Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra("sms_body", "Hello"); Uri uri = Uri.parse("content://media/external/images/media/23"); intent.putExtra(Intent.EXTRA_STREAM, uri); intent.setType("image/png"); startActivity(intent);//4.打開瀏覽器: // 打開Google主頁 Uri uri = Uri.parse("http://www.baidu.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);//5.發送電子郵件:(閹割了Google服務的沒戲!!!!) // 給someone@domain.com發郵件 Uri uri = Uri.parse("mailto:someone@domain.com"); Intent intent = new Intent(Intent.ACTION_SENDTO, uri); startActivity(intent); // 給someone@domain.com發郵件發送內容為“Hello”的郵件 Intent intent = new Intent(Intent.ACTION_SEND); intent.putExtra(Intent.EXTRA_EMAIL, "someone@domain.com"); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_TEXT, "Hello"); intent.setType("text/plain"); startActivity(intent); // 給多人發郵件 Intent intent=new Intent(Intent.ACTION_SEND); String[] tos = {"1@abc.com", "2@abc.com"}; // 收件人 String[] ccs = {"3@abc.com", "4@abc.com"}; // 抄送 String[] bccs = {"5@abc.com", "6@abc.com"}; // 密送 intent.putExtra(Intent.EXTRA_EMAIL, tos); intent.putExtra(Intent.EXTRA_CC, ccs); intent.putExtra(Intent.EXTRA_BCC, bccs); intent.putExtra(Intent.EXTRA_SUBJECT, "Subject"); intent.putExtra(Intent.EXTRA_TEXT, "Hello"); intent.setType("message/rfc822"); startActivity(intent);//6.顯示地圖: // 打開Google地圖中國北京位置(北緯39.9,東經116.3) Uri uri = Uri.parse("geo:39.9,116.3"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);//7.路徑規劃 // 路徑規劃:從北京某地(北緯39.9,東經116.3)到上海某地(北緯31.2,東經121.4) Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=39.9 116.3&daddr=31.2 121.4"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);//8.多媒體播放: Intent intent = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("file:///sdcard/foo.mp3"); intent.setDataAndType(uri, "audio/mp3"); startActivity(intent);//獲取SD卡下所有音頻文件,然后播放第一首=-= Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);//9.打開攝像頭拍照: // 打開拍照程序 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 0); // 取出照片數據 Bundle extras = intent.getExtras(); Bitmap bitmap = (Bitmap) extras.get("data");//另一種: //調用系統相機應用程序,并存儲拍下來的照片 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); time = Calendar.getInstance().getTimeInMillis(); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment .getExternalStorageDirectory().getAbsolutePath()+"/tucue", time + ".jpg"))); startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE);//10.獲取并剪切圖片 // 獲取并剪切圖片 Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra("crop", "true"); // 開啟剪切 intent.putExtra("aspectX", 1); // 剪切的寬高比為1:2 intent.putExtra("aspectY", 2); intent.putExtra("outputX", 20); // 保存圖片的寬和高 intent.putExtra("outputY", 40); intent.putExtra("output", Uri.fromFile(new File("/mnt/sdcard/temp"))); // 保存路徑 intent.putExtra("outputFormat", "JPEG");// 返回格式 startActivityForResult(intent, 0); // 剪切特定圖片 Intent intent = new Intent("com.android.camera.action.CROP"); intent.setClassName("com.android.camera", "com.android.camera.CropImage"); intent.setData(Uri.fromFile(new File("/mnt/sdcard/temp"))); intent.putExtra("outputX", 1); // 剪切的寬高比為1:2 intent.putExtra("outputY", 2); intent.putExtra("aspectX", 20); // 保存圖片的寬和高 intent.putExtra("aspectY", 40); intent.putExtra("scale", true); intent.putExtra("noFaceDetection", true); intent.putExtra("output", Uri.parse("file:///mnt/sdcard/temp")); startActivityForResult(intent, 0);//11.打開Google Market // 打開Google Market直接進入該程序的詳細頁面 Uri uri = Uri.parse("market://details?id=" + "com.demo.app"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);//12.進入手機設置界面: // 進入無線網絡設置界面(其它可以舉一反三) Intent intent = new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS); startActivityForResult(intent, 0);//13.安裝apk: Uri installUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);//14.卸載apk: Uri uri = Uri.fromParts("package", strPackageName, null); Intent it = new Intent(Intent.ACTION_DELETE, uri); startActivity(it); //15.發送附件: Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3"); sendIntent.setType("audio/mp3"); startActivity(Intent.createChooser(it, "Choose Email Client"));//16.進入聯系人頁面: Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(People.CONTENT_URI); startActivity(intent);//17.查看指定聯系人: Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id);//info.id聯系人ID Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(personUri); startActivity(intent);7. Fragment(碎片)
讓程序更加合理的利用屏幕空間
(1). Fragment的生命周期
(2). 創建Fragment
(3). 在Activtiy中添加Fragment
1. 直接在布局文件中添加Fragment
2. 當Activity運行時添加Fragment
二、BroadcastReceiver 提供廣播接收器
1. 廣播接受者簡介
2. 廣播接受者入門
3. 自定義廣播
4. 廣播的類型
三、Service 服務
1. 服務的創建
2. 服務的生命周期
3. 服務的啟動方式
4. 服務的通信
四、ContentProvider 內容提供者
- Android四大組件之一,主要用于應用程序之間的數據交換,它可以將自己的數據共享給其他應用程序使用
1. 內容提供者簡介
2. 內容提供者的創建
3. 內容提供者的使用
4. 內容觀察者的使用
五. Intent(意圖)
1. Intent簡介
四大組件間的 樞紐——Intent(意圖),Android通信的橋梁
Intent叫意圖,是程序中各組件之間的交互方式,可以指定當前組件要執行的動作,還可以在不同組件之間進行數據傳遞。
一般用于啟動Activity、Service、發送廣播
2. Intent對象的屬性
(1). Component Name屬性
從MainActivity跳轉到DetailActivity
(2). Action和Data屬性
之后還有在AndroidManifest設置Android權限
(3). Action和Category
(4). Extras屬性
多個Activity之間進行交換數據
(5). Flags屬性
3. Intent的種類
(1). 顯式Intent
- 直接指定目標組件的名稱
- 多用于在應用程序內部傳遞信息
(2). 隱式Intent
- 不會用組件名稱定義要激活的目標組件
- 多用于在不同應用程序之間傳遞消息
4. Intent過濾器
通過<intent-filter>標記在AndroidManifest.xml文件中配置總結
以上是生活随笔為你收集整理的Android 四大组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之路,week03 - Py
- 下一篇: 【GIT 基础篇六】分支管理(创建与合并