Android學習筆記——四大組件

来源:https://www.cnblogs.com/xiaobaiLX/archive/2022/07/27/16514601.html
-Advertisement-
Play Games

四大組件 Activity 實現步驟 繼承 Activity 或其子類,實現以下方法: //第一次創建時回調 protected void onCreate(Bundle savedInstanceState); //啟動時回調 protected void onStart(); //再次啟動時回調 ...


四大組件

Activity

實現步驟

  1. 繼承 Activity 或其子類,實現以下方法:

    //第一次創建時回調
    protected void onCreate(Bundle savedInstanceState);
    //啟動時回調
    protected void onStart();
    //再次啟動時回調
    protected void onRestart() ;
    //回到前臺時回調
    protected void onResume();
    //轉入後臺但依然可見時回調
    protected void onPause() ;
    //轉入後臺完全不可見時回調
    protected void onStop();
    //被系統銷毀時回調
    protected void onDestroy();
    
  2. 在 AndroidMainfest.xml 文件中配置

  3. 啟動,有以下兩種方式:

    //啟動其他Activity
    startActivity(Intent intent);
    //啟動其讓Activity並返回請求碼
    startActivityForResult(Intent intent,int requestCode);
    
  4. 停止,有以下兩種方式:

    //結束當前Activity
    finish();
    //結束當前Activity並返回狀態碼
    finish(Intent intent,int requestCode);
    

IBindle與Activity之間的通信

IBindle 是一個簡單的數據攜帶包,用於實現 Activity 之間的數據交換。Intent 提供了 putExtras() 和 getExtras() 方法,這些方法實質是存取 Intent 所攜帶的 IBindle 中的數據。

Intent 提供的多個重載方法攜帶額外數據:

//向Intent中存放數據包
putExtras(Bundle data);
//取出Intent中存放的數據包
getExtras(Bundle data);
//向Intent中以k-v形式存放數據包
putExtra(String name,String value);
//根據k取出指定類型的值
getXxxExtra(String name);

Bundle包含的多個方法來存入數據:

//向Bundle中存放數據
putXxx(String key,Xxx data);
//向Bundle中存放一個可序列化對象
putSerialzable(String key,Serialzable data);

生命周期

運行狀態:當前 Activity 位於前臺,用戶可見,可以獲得焦點;

暫停狀態:其他 Activity 位於前臺,該 Activity 依然可見,但無法獲得焦點;

停止狀態:該 Activity 不可見,無法獲得焦點;

銷毀狀態:該 Activity 結束或 Activity 所在進程被結束。

四種載入模式

standard:每次啟動目標 Activity 時,總會為目標 Activity 創建一個新實例,並添加到原有的 Task 中。

singleTop:當將要啟動的目標 Activity 位於 Task 棧頂中,系統直接服用已有的 Activity 實例。

singleTask:包括以下三種情況

  1. 啟動目標 Activity 不存在,創建新實例並加入到 Task 棧頂中;
  2. 啟動目標 Activity 存在且位於 Task 棧頂,直接復用已有 Activity 實例;
  3. 啟動目標 Activity 存在但不在 Task 棧頂,將位於目標 Activity 之上的實例移除 Task。

singleInstance:包括以下兩種情況:

  1. 啟動目標 Activity 不存在,先創建一個 Task,然後創建目標 Activity 實例並添加到 Task 中;
  2. 啟動目標 Activity 存在,將該 Activity 所在 Task 轉到前臺,使該 Activity 顯示出來。

ContentProvide

ContentProvide 是不同應用程式之間進行交換的標準 API,以某種 Uri 的形式對外提供數據,允許其他應用訪問或修改數據。

實現步驟

  1. 繼承 ContentProvider,實現以下方法:

    //當其他程式第一次訪問該ContentProvider時,該ContentProvider被創建出來並立即回調onCreate()
    public boolean onCreate();
    //根據Uri查詢selection條件所匹配的全部記錄,projection指的是列名列表,表明只選擇出指定的數據列
    public Cursor query(Uri uri, String[] projection,String selection,String[] selectionArgs,String sortOrder);
    //用於返回當前Uri所代表的MIME類型
    //若Uri對應數據包含多條記錄,該MIME類型字元串應以vnd.android.cursor.dir/開頭
    //若Uri對應數據包含一條記錄,該MIME類型字元串應以vnd.android.cursor.item/開頭
    public String getType(Uri uri);
    //根據Uri插入values對應的數據
    public Uri insert(Uri uri, ContentValues values);
    //根據Uri刪除selection所匹配的全部記錄
    public int delete(Uri uri, String selection,String[] selectionArgs);
    //根據Uri修改selection條件所匹配的全部記錄
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs);
    
  2. 向 AndroidMainfest.xml 文件中註冊該 ContentProvider,併為它綁定一個 Uri

Uri類似於互聯網中的URL,URL由協議、功能變數名稱、網站資源三個部分組成,Uri可以分為以下三部分

  1. Content://:暴露和訪問ContentProvider的協議預設為content://
  2. org.crazyit.providers.dictprovider:這部分是ContentProvider的authorities,用於指定要訪問的ContentProvider
  3. words:資源部分

Uri基本遵循了RESTful風格

ContentResolver

ContentProvider 相當於一個網站,它的作用是暴露可供操作的數據,其他程式則通過 ContentResolve r來操作 ContentProvider 所暴露的數據。ContentResolver 相當於 HttpClient.

Context 提供了以下方法來獲取 ContentResolver 對象:

//獲取應用的預設ContentResolver
getContentResolver();
//向Uri對應的ContentProvider
insert(Uri url,ContentValues values);
//刪除Uri對應的ContentProvider中where條件匹配數據
delete(Uri url,String where,String[] selectionArgs);
//更新Uri對應的ContentProvider中where條件匹配數據
update(Uri url,String where,String[] selectionArgs);
//查詢Uri對應的ContentProvider中where條件匹配數據
query(Uri url,String[] projection,String selection,String[] selectionArgs,String sortOrder)

ContentProvider 一般為單實例模式,多個程式通過 ContentResolver 操作 ContentProvider 提供數據時,會委托給同一個 ContentProvider

Uri 參數判斷

為了確定 ContentProvider 能夠處理 Uri,以及確定每個方法中 Uri 參數所操作的數據, Android 提供了 UriMatch、ContentUris 工具類。

UriMatcher 工具類

//向UriMatcher對象註冊Uri
void addURL(String authority,String path,int code);
//根據前面註冊的Uri來判斷Uri對應的標識,若無法匹配則返回-1
int match(Uri uri);

ContentUris 工具類

//用於為路徑添加ID部分
withAppendId(Uri contentUri, long id)
//用於指定Uri中解析出包含ID值
parseId(Uri contentUri);

系統的ContentProvider

Uri 說明
ContactsContract.Contacts.CONTENT_URL 管理聯繫人的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URL 管理聯繫人電話的Uri
ContactsContract.CommonDataKinds.Email.CONTENT_URL 管理聯繫人E-mail的Uri
MediaStore.Audio.Media.EXTERNAL_CONTENT_URL 存儲在手機外部存儲器上的音頻文件內容的Uri
MediaStore.Audio.Media.INTERNAL_CONTENT_URL 存儲在手機內部存儲器上的音頻文件內容的Uri
MediaStore.Images.Media.EXTERNAL_CONTENT_URL 存儲在手機外部存儲器上的圖片文件內容的Uri
MediaStore.Video.Media.INTERNAL_CONTENT_URL 存儲在手機內部存儲器上的視頻文件內容的Uri
MediaStore.Video.Media.EXTERNAL_CONTENT_URL 存儲在手機外部存儲器上的視頻文件內容的Uri

Service

實現步驟

  1. 繼承 Service 重寫回調方法

  2. 在 Androidmainfest.xml 文件中配置該 Service

  3. 運行 Service,包括以下兩種方法:

    • Context 的 startService() 方法,該方法啟動 Service 與啟動者不建立連接關係,啟動者退出 Service 保持運行。
    • Centext 的 bindService() 方法,該方法啟動 Service 與啟動者綁定在一起,啟動者退出 Service 也退出。
    //創建啟動Service的Intent
    Intent intent = new Intent(this, MusicService.class);
    //啟動後臺
    startService(intent);
    //關閉後臺
    stopService(intent);
    

創建顯式 Intents :

  1. 通過 Context、目標 Service 類創建顯式 Intent
  2. 通過package、action 屬性創建顯式 Intent

綁定本地 Service 並與之通信

當 Service 與訪問者 需要進行方法調用或交換數據時,應使用 bindService() 和 unbindService() 啟動和關閉 Service。

/**
* Service: 通過Intent指定需要啟動的Service
* Conn: 用於監聽訪問者與Service之間的連接情況. 
*      訪問者與Service連接成功時將回調該ServiceConnection的onServiceConnected(ComponentName name,IBinder service)方法
*      訪問者與Service連接異常時將回調該ServiceConnection的onServiceDisconnected(ComponentName name,IBinder service)方法
* flags: 綁定時是否自動創建Service,參數可為0(不自動創建)或BIND_AUTO_CREATE(自動創建)
* */
public boolean bindService(Intent service, ServiceConnection conn,int flags);

ServiceConnection 對象的 onServiceConnected(ComponentName name,IBinder service) 有一個 IBind(Intent intent) 對象,該對象可實現與綁定 Service 之間的通信。

開發 Service 類時,該 Service 類必須提供一個 IBinder onBind(Intent intent) 方法。實際開發時通常會採用繼承 Binder 的方式實現 IBinder 對象。

生命周期

public class MusicService extends Service {
     //被創建時回調
    @Override
    public void onCreate() {
        super.onCreate();
    }
    //被綁定時回調
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    //被啟動時回調
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }
	//被取消綁定時回調
    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }
	//被停止時回調
    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

IntentService

Service 與它所在的應用位於同一進程中,因此不應該在 Service 中直接處理耗時操作。

IntentService 具有如下特征:

  1. IntentService 會創建獨立線程處理 onHandleIntent() 方法實現的代碼,開發者無需處理多線程問題。
  2. 當所有請求處理完成後,IntentService 會自動停止,因此無需調用 stopSelf() 方法來停止 Service。
  3. 為 Service 的 onBind() 方法提供了預設實現,預設返回為null.
  4. 為 Service 的 onStartCommand() 方法提供了預設實現,該實現會自動將請求 Intent 加入隊列中。

在使用擴展 IntentService 實現 Service 無須重寫 onBind()、onStartCommand() 方法,只要重寫 onHandleIntent() 方法即可。

BroadcastReceiver

broadcastReceiver 本質上是一個全局監聽器,用於監聽系統全局的廣播消息。

啟動步驟

  1. 創建需啟動的 BroadcastReceiver 的 Intent

  2. 調用 Context 的 sendBroadcast() 或 sendOrderBroadcast() 方法啟動指定的 BroadcastReceiver

    //創建Intent
    Intent intent = new Intent();
    //設置action屬性
    intent.setAction("org.crazyit.action.CRAZY_BROADCAST");
    intent.setPackage("org.crazyit.broadcast");
    intent.putExtra("msg","簡單的消息");
    //發送廣播
    sendBroadcast(intent);
    

實現方式

  1. 繼承 BroadcastReceiver 重寫 onReceive(Context context, Intent inten) 方法

  2. 指定該 BroadcastReceiver 能匹配的 Intent,有以下兩種方式:

    • 代碼中使用 BroadcastReceiver 的 Context 的 registerReceiver(BroadcastReceiver receiver,IntentFilter filter)
    IntentFilter filter = new IntentFilter("android.provider.Telephoy.SMS_RECEIVED");
    IncomingSMSReceiver receiver = new IncomingSMSReceiver();
    registerReceiver(receiver ,filter);
    
    • 在 AndroidMainfest.xml 文件中配置
    <receiver android:name=".IncomingSMSReceiver">
    	<intent-filter>
    		<action android:name = "android.provider.Telephony.SMS_RECEIVERD"/>
    	</intent-filter>
    </receiver>
    

    在實踐過程中,發現 Receiver 只有放在項目主目錄下才能被讀取註冊


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 電腦的演進就是一部在挖坑和填坑之間反覆橫跳的發展史。對這一點的理解會隨著本文的後續講述逐漸加深。比如高速緩存Cache很好地解決了CPU與記憶體的速度矛盾,但是也為電腦系統帶來了更高的複雜度 ...
  • 1. Redis 底層數據結構 Redis資料庫就像是一個哈希表,首先對key進行哈希運算得到哈希值再取模得到一個下標,每個元素是一個節點,節點之間形成鏈表。這感覺有點像Java中的HashMap。 不同的數據類型的實現方式是不一樣的,可以通過object encoding命令查看底層真正的數據存儲 ...
  • 註:文中有個易混淆的地方"事務" sql事務,即每次資料庫操作生成的事務,這個事務trx_id只在undolog里存儲,同時undolog維護了此事務是否完成的狀態。 日誌持久化事務,為了保證redolog和binlog的一致性而用的Mysql內部獨立維護的2PC提交事務。這個xid只有在redol ...
  • 1. 獲取指定首碼的key 需求描述: Redis中有大量以xxx開頭的key,在不使用keys命令的情況下,如何快速獲取這些首碼的key 解決方案: redis自帶的scan命令可以解決這個問題 2. SCAN命令 SCAN是一個基於游標的迭代器。這意味著在每次調用該命令時,伺服器都會返回一個更新 ...
  • 1、行轉列 源數據: 目標數據: 數據準備 -- 建表插入數據 drop table if exists time_temp; create table if not exists time_temp( `year_col` int not null comment '年份', `month_col ...
  • 2022年7月26日,Taier1.2版本正式發佈! 本次版本發佈更新功能: 新增工作流 新增OceanBase SQL 新增Flink jar任務 數據同步、實時採集支持臟數據管理 Hive UDF 控制台UI升級 租戶綁定簡化 新版本的使用文檔已在社區中推送,大家可以隨時下載查閱,歡迎大家體驗新 ...
  • 現如今 Redis 變得越來越流行,幾乎在很多項目中都要被用到,不知道你在使用 Redis 時,有沒有思考過,Redis 到底是如何穩定、高性能地提供服務的? 我使用 Redis 的場景很簡單,只使用單機版 Redis 會有什麼問題嗎? 我的 Redis 故障宕機了,數據丟失了怎麼辦?如何能保證我的... ...
  • 實戰案例 1.搭建mysql服務 下載mysql [root@localhost ~]# wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm [root@localhost ~]# rpm -Uvh my ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...