Android 四大组件
文章目錄
- 一、Activity 活動(dòng)
- 1. Activity的創(chuàng)建
- (1). Android studio創(chuàng)建Activity
- (2). Activity使用流程
- 2. Activity的生命周期
- (1). 生命周期的狀態(tài)
- 1. 啟動(dòng)狀態(tài)
- 2. 運(yùn)行狀態(tài)
- 3. 暫停狀態(tài)
- 4. 停止?fàn)顟B(tài)
- 5. 銷毀狀態(tài)
- (2). 生命周期的方法
- 1. onCreate()方法
- 2. onStart()方法
- 3. onResume()方法
- 4. onPause()方法
- 5. onStop()方法
- 6. onDestroy()方法
- 7.onRestart()方法
- 3. Activity的啟動(dòng)模式
- (1). Android任務(wù)棧
- (2). Activity的四種啟動(dòng)模式
- 1. standard 模式
- 2. singleTop 模式
- 3. singleTask 模式
- 4. singleInstance 模式
- 4. Activity之間的跳轉(zhuǎn)
- 1. 顯示意圖
- 2. 隱式意圖(隱式啟動(dòng):通過Intent-filter的Action,Category或data來實(shí)現(xiàn))
- 5. Activity之間的數(shù)據(jù)傳遞
- (1). 數(shù)據(jù)傳遞
- 1. 商家配送
- 2. 中間小哥配送
- (2). 數(shù)據(jù)回傳(后一個(gè)傳回給前一個(gè))
- 6. 系統(tǒng)給我們提供的常見的Activity
- 7. Fragment(碎片)
- (1). Fragment的生命周期
- (2). 創(chuàng)建Fragment
- (3). 在Activtiy中添加Fragment
- 1. 直接在布局文件中添加Fragment
- 2. 當(dāng)Activity運(yùn)行時(shí)添加Fragment
- 二、BroadcastReceiver 提供廣播接收器
- 1. 廣播接受者簡(jiǎn)介
- 2. 廣播接受者入門
- 3. 自定義廣播
- 4. 廣播的類型
- 三、Service 服務(wù)
- 1. 服務(wù)的創(chuàng)建
- 2. 服務(wù)的生命周期
- 3. 服務(wù)的啟動(dòng)方式
- 4. 服務(wù)的通信
- 四、ContentProvider 內(nèi)容提供者
- 1. 內(nèi)容提供者簡(jiǎn)介
- 2. 內(nèi)容提供者的創(chuàng)建
- 3. 內(nèi)容提供者的使用
- 4. 內(nèi)容觀察者的使用
- 五. Intent(意圖)
- 1. Intent簡(jiǎn)介
- 2. Intent對(duì)象的屬性
- (1). Component Name屬性
- (2). Action和Data屬性
- (3). Action和Category
- (4). Extras屬性
- (5). Flags屬性
- 3. Intent的種類
- (1). 顯式Intent
- (2). 隱式Intent
- 4. Intent過濾器
一、Activity 活動(dòng)
在Android中,用戶與程序的交互是通過Activity完成的,activity負(fù)責(zé)管理應(yīng)用程序的用戶界面。
Activity是Android程序中的四大組件之一,為用戶提供可視化界面及操作。一個(gè)應(yīng)用程序通常包含多個(gè)Activity,每個(gè)Activity負(fù)責(zé)管理一個(gè)用戶界面。這些界面可以添加多個(gè)控件,每個(gè)控件負(fù)責(zé)實(shí)現(xiàn)不同功能。
Activity是一個(gè)應(yīng)用程序的組件,他在屏幕上提供了一個(gè)區(qū)域,允許用戶在上面做一些交互性的操作, 比如打電話,照相,發(fā)送郵件,或者顯示一個(gè)地圖!Activity可以理解成一個(gè)繪制用戶界面的窗口, 而這個(gè)窗口可以填滿整個(gè)屏幕,也可能比屏幕小或者浮動(dòng)在其他窗口的上方!
1. Activity的創(chuàng)建
(1). Android studio創(chuàng)建Activity
創(chuàng)建Activity之后,重寫oncreat()方法
注意:
-
在Android中創(chuàng)建四大組件都需要在AndroidManifest.xml文件中注冊(cè)
-
創(chuàng)建完之后,Android studio會(huì)自動(dòng)在AndroidManifest.xml文件中注冊(cè)
會(huì)自動(dòng)添加一行 <activity android:name=".MainActivity">
(2). Activity使用流程
- 注:可以繼承Activity和AppCompatActivity,只不過后者提供了一些新的東西而已! 另外,切記,Android中的四大組件,只要你定義了,無論你用沒用,都要在AndroidManifest.xml對(duì) 這個(gè)組件進(jìn)行聲明,不然運(yùn)行時(shí)程序會(huì)直接退出,報(bào)ClassNotFindException…
2. Activity的生命周期
Activity的生命周期包含5種狀態(tài),涉及7中方法。
(1). 生命周期的狀態(tài)
是一個(gè)Activity從創(chuàng)建到銷毀的全過程,分為以下5個(gè)狀態(tài)
1. 啟動(dòng)狀態(tài)
2. 運(yùn)行狀態(tài)
3. 暫停狀態(tài)
4. 停止?fàn)顟B(tài)
5. 銷毀狀態(tài)
(2). 生命周期的方法
1. onCreate()方法
2. onStart()方法
3. onResume()方法
運(yùn)行(過渡)
4. onPause()方法
暫停
5. onStop()方法
6. onDestroy()方法
7.onRestart()方法
從停止?fàn)顟B(tài)到再次啟動(dòng)狀態(tài)
3. Activity的啟動(dòng)模式
Activity是可以層疊擺放的,每啟動(dòng)一個(gè)新的Activity就會(huì)覆蓋在原Activity上,如果單擊返回按鈕,最上面的Activity被銷毀,下面的Activity重新顯示。
原因是:Android系統(tǒng)同任務(wù)棧來管理Activity實(shí)例。
(1). Android任務(wù)棧
棧數(shù)據(jù)結(jié)構(gòu):先進(jìn)先出
在Android中采用任務(wù)棧形式管理Activity。
通常一個(gè)應(yīng)用程序?qū)?yīng)一個(gè)任務(wù)棧,默認(rèn)情況下每啟動(dòng)一個(gè)Activity都會(huì)入棧,并處于棧頂位置,用戶操作的永遠(yuǎn)是棧頂?shù)腁ctivity。
- Activity啟動(dòng)時(shí)壓入棧
- 用戶單擊返回彈出棧
(2). Activity的四種啟動(dòng)模式
1. standard 模式
是Activity的默認(rèn)啟動(dòng)模式,這模式的特點(diǎn):
- 每啟動(dòng)一個(gè)Activity就會(huì)在棧頂創(chuàng)建一個(gè)新的實(shí)例
2. singleTop 模式
判斷要啟動(dòng)的Activity實(shí)例是否位于棧頂,如果位于棧頂則直接復(fù)用,否則創(chuàng)建新的實(shí)例。
3. singleTask 模式
每次啟動(dòng)該Activity時(shí),系統(tǒng)首先會(huì)檢查棧中是否存在當(dāng)前Activity實(shí)例,如果存在則直接使用,并把當(dāng)前Activity之上的所有實(shí)例全部出棧,否則會(huì)重新創(chuàng)建一個(gè)實(shí)例
4. singleInstance 模式
指定為singleInstance 模式的Activity會(huì)啟動(dòng)一個(gè)新的任務(wù)棧來管理Activity實(shí)例,無論從哪個(gè)任務(wù)棧中啟動(dòng)該Activity,該實(shí)例在整個(gè)系統(tǒng)中只有一個(gè)。
- 意義:為了在不同程序中共享同一個(gè)Activity實(shí)例
4. Activity之間的跳轉(zhuǎn)
在Android系統(tǒng)中,每個(gè)應(yīng)用通常都由多個(gè)界面組成,每個(gè)界面就是一個(gè)Activity,在這些界面進(jìn)行跳轉(zhuǎn)時(shí),實(shí)際上也就是Activity之間的跳轉(zhuǎn),Activity之間挑戰(zhàn)需要用到Intent組件,通過Intent可以開啟新的Activity實(shí)現(xiàn)頁面的跳轉(zhuǎn)功能。
根據(jù)開啟目標(biāo)組件的方式不同,Intent分類為:
1. 顯示意圖
- 明確找的對(duì)象
- 通過組件名指定啟動(dòng)的目標(biāo)組件,比如startActivity(new Intent(A.this,B.class)); 每次啟動(dòng)的組件只有一個(gè)
2. 隱式意圖(隱式啟動(dòng):通過Intent-filter的Action,Category或data來實(shí)現(xiàn))
- 模糊不明確對(duì)象
- 不指定組件名,而指定Intent的Action,Data,或Category,當(dāng)我們啟動(dòng)組件時(shí), 會(huì)去匹配AndroidManifest.xml相關(guān)組件的Intent-filter,逐一匹配出滿足屬性的組件,當(dāng)不止一個(gè)滿足時(shí), 會(huì)彈出一個(gè)讓我們選擇啟動(dòng)哪個(gè)的對(duì)話框
5. Activity之間的數(shù)據(jù)傳遞
Android進(jìn)行消息傳遞或數(shù)據(jù)傳遞,使用的也是Intent。
- Intent不僅可以開啟Activity、Service、BroadcastReceiver組件,還能在這些組件之間傳遞數(shù)據(jù)
數(shù)據(jù)傳遞也有兩種方式:
(1). 數(shù)據(jù)傳遞
使用Bundle在Activity之間交換數(shù)據(jù)
Bundle是鍵值對(duì)的組合
1. 商家配送
放數(shù)據(jù)
接受數(shù)據(jù),并放到文本框
2. 中間小哥配送
(2). 數(shù)據(jù)回傳(后一個(gè)傳回給前一個(gè))
在Activity中,使用Intent既可以將數(shù)據(jù)傳給下一個(gè)Activity、還可以將數(shù)據(jù)回傳給上一個(gè)Activity
Activity中提供了一個(gè)startActivityForResult(Intent intent,int requestCode)方法,該方法也用于啟動(dòng)Activity,并且這個(gè)方法可以在當(dāng)前Activity銷毀時(shí)返回一個(gè)結(jié)果給上一個(gè)Activity
MainActivity
DetailActivity
6. 系統(tǒng)給我們提供的常見的Activity
//1.撥打電話 // 給移動(dòng)客服10086撥打電話 Uri uri = Uri.parse("tel:10086"); Intent intent = new Intent(Intent.ACTION_DIAL, uri); startActivity(intent);//2.發(fā)送短信 // 給10086發(fā)送內(nèi)容為“Hello”的短信 Uri uri = Uri.parse("smsto:10086"); Intent intent = new Intent(Intent.ACTION_SENDTO, uri); intent.putExtra("sms_body", "Hello"); startActivity(intent);//3.發(fā)送彩信(相當(dāng)于發(fā)送帶附件的短信) 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.發(fā)送電子郵件:(閹割了Google服務(wù)的沒戲!!!!) // 給someone@domain.com發(fā)郵件 Uri uri = Uri.parse("mailto:someone@domain.com"); Intent intent = new Intent(Intent.ACTION_SENDTO, uri); startActivity(intent); // 給someone@domain.com發(fā)郵件發(fā)送內(nèi)容為“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); // 給多人發(fā)郵件 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,東經(jīng)116.3) Uri uri = Uri.parse("geo:39.9,116.3"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);//7.路徑規(guī)劃 // 路徑規(guī)劃:從北京某地(北緯39.9,東經(jīng)116.3)到上海某地(北緯31.2,東經(jīng)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); // 取出照片數(shù)據(jù) Bundle extras = intent.getExtras(); Bitmap bitmap = (Bitmap) extras.get("data");//另一種: //調(diào)用系統(tǒng)相機(jī)應(yīng)用程序,并存儲(chǔ)拍下來的照片 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直接進(jìn)入該程序的詳細(xì)頁面 Uri uri = Uri.parse("market://details?id=" + "com.demo.app"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent);//12.進(jìn)入手機(jī)設(shè)置界面: // 進(jìn)入無線網(wǎng)絡(luò)設(shè)置界面(其它可以舉一反三) 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.發(fā)送附件: 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.進(jìn)入聯(lián)系人頁面: Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(People.CONTENT_URI); startActivity(intent);//17.查看指定聯(lián)系人: Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id);//info.id聯(lián)系人ID Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(personUri); startActivity(intent);7. Fragment(碎片)
讓程序更加合理的利用屏幕空間
(1). Fragment的生命周期
(2). 創(chuàng)建Fragment
(3). 在Activtiy中添加Fragment
1. 直接在布局文件中添加Fragment
2. 當(dāng)Activity運(yùn)行時(shí)添加Fragment
二、BroadcastReceiver 提供廣播接收器
1. 廣播接受者簡(jiǎn)介
2. 廣播接受者入門
3. 自定義廣播
4. 廣播的類型
三、Service 服務(wù)
1. 服務(wù)的創(chuàng)建
2. 服務(wù)的生命周期
3. 服務(wù)的啟動(dòng)方式
4. 服務(wù)的通信
四、ContentProvider 內(nèi)容提供者
- Android四大組件之一,主要用于應(yīng)用程序之間的數(shù)據(jù)交換,它可以將自己的數(shù)據(jù)共享給其他應(yīng)用程序使用
1. 內(nèi)容提供者簡(jiǎn)介
2. 內(nèi)容提供者的創(chuàng)建
3. 內(nèi)容提供者的使用
4. 內(nèi)容觀察者的使用
五. Intent(意圖)
1. Intent簡(jiǎn)介
四大組件間的 樞紐——Intent(意圖),Android通信的橋梁
Intent叫意圖,是程序中各組件之間的交互方式,可以指定當(dāng)前組件要執(zhí)行的動(dòng)作,還可以在不同組件之間進(jìn)行數(shù)據(jù)傳遞。
一般用于啟動(dòng)Activity、Service、發(fā)送廣播
2. Intent對(duì)象的屬性
(1). Component Name屬性
從MainActivity跳轉(zhuǎn)到DetailActivity
(2). Action和Data屬性
之后還有在AndroidManifest設(shè)置Android權(quán)限
(3). Action和Category
(4). Extras屬性
多個(gè)Activity之間進(jìn)行交換數(shù)據(jù)
(5). Flags屬性
3. Intent的種類
(1). 顯式Intent
- 直接指定目標(biāo)組件的名稱
- 多用于在應(yīng)用程序內(nèi)部傳遞信息
(2). 隱式Intent
- 不會(huì)用組件名稱定義要激活的目標(biāo)組件
- 多用于在不同應(yīng)用程序之間傳遞消息
4. Intent過濾器
通過<intent-filter>標(biāo)記在AndroidManifest.xml文件中配置總結(jié)
以上是生活随笔為你收集整理的Android 四大组件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之路,week03 - Py
- 下一篇: 蓝牙Android_Lightblue调