使用 AlarmManager 結合廣播接收器來實現定時檢查

使用 AlarmManager 結合廣播接收器來實現定時檢查。這種方式在特定時間點觸發廣播,然后在廣播接收器中檢查時間。這樣可以避免持續的輪詢檢查減少對系統資源的消耗。

以下是一個示例代碼:

  1. 創建一個 BroadcastReceiver 用于接收 AlarmManager 的廣播。
  2. BroadcastReceiver 中檢查當前時間是否達到目標時間點。
  3. 如果達到目標時間點,則執行相應的操作,例如播放音頻。

示例代碼如下:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;public class TimeCheckReceiver extends BroadcastReceiver {private String targetTime = "12:00"; // 替換為你的目標時間點@Overridepublic void onReceive(Context context, Intent intent) {// 檢查當前時間是否等于目標時間點try {SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");String currentTime = dateFormat.format(new Date());if (currentTime.equals(targetTime)) {// 如果達到目標時間點,執行相應的操作,例如播放音頻playAudio(context);}} catch (Exception e) {e.printStackTrace();}}private void playAudio(Context context) {// 在這里實現播放音頻的邏輯Toast.makeText(context, "Reached target time, playing audio", Toast.LENGTH_SHORT).show();MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.your_audio_file); // 替換為你的音頻文件資源mediaPlayer.start();}
}

然后,在你的應用中設置 AlarmManager 來觸發廣播,示例代碼如下:

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import java.util.Calendar;public class AlarmHelper {public static void setAlarm(Context context) {AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);Intent intent = new Intent(context, TimeCheckReceiver.class);PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);// 設置每天的目標時間點,這里使用12:00作為示例Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, 12);calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);// 設置每天觸發一次alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);}
}

最后,確保在 AndroidManifest.xml 中注冊廣播接收器和權限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /><receiver android:name=".TimeCheckReceiver" ><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED" /></intent-filter>
</receiver>

相比于持續輪詢檢查當前時間的方法,使用 AlarmManager 和廣播接收器的方式消耗的資源要少一些。因為它是在特定時間點觸發廣播,而不是持續在后臺運行。

具體而言,這種方法的資源消耗主要集中在以下幾個方面:

  1. AlarmManagerAlarmManager 是 Android 系統提供的一種服務,它的資源消耗相對較低。它會在設定的時間點觸發廣播,而不會持續占用大量的系統資源。

  2. 廣播接收器:廣播接收器會在觸發廣播時被系統喚醒,并執行相應的操作。這個過程消耗的資源相對較少,因為它只在接收到廣播時才會被激活。

  3. 播放音頻:如果你在廣播接收器中播放音頻,那么播放音頻會消耗一定的系統資源,特別是在音頻文件較大或者音頻播放時長較長的情況下。但相比持續輪詢檢查當前時間,這種消耗要小得多。

綜上所述,使用 AlarmManager 和廣播接收器的方式消耗的系統資源相對較少,特別是對于周期性的任務,它是一種更加高效的方式。但是,你仍然需要注意合理使用資源,避免在廣播接收器中執行耗時操作,以免影響用戶體驗和設備性能。

TimeCheckReceiver 廣播接收器不一定需要在設備啟動時接收廣播。你可以根據你的需求來注冊廣播接收器。如果你希望在特定時間點觸發廣播,那么只需要在相應的時刻設置 AlarmManager 來觸發廣播即可,無需在設備啟動時注冊。

通常情況下,如果你的應用僅在特定時間點執行某些任務,那么在合適的時候注冊廣播接收器就可以了,而無需在設備啟動時注冊。這樣可以避免不必要的廣播接收器注冊,減少資源消耗。

如果你有多個時間點需要監測并執行相應的任務,你可以稍作修改,在 setAlarm 方法中設置多個定時任務,每個定時任務對應一個時間點。

以下是一個修改后的示例代碼,用于處理多個時間點:

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import java.util.Calendar;public class AlarmHelper {private static final String TIME_POINT_1 = "08:00";private static final String TIME_POINT_2 = "12:00";public static void setAlarms(Context context) {setAlarm(context, TIME_POINT_1);setAlarm(context, TIME_POINT_2);// 如果有更多的時間點,可以繼續添加 setAlarm 方法的調用}private static void setAlarm(Context context, String targetTime) {AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);Intent intent = new Intent(context, TimeCheckReceiver.class);intent.putExtra("target_time", targetTime); // 將目標時間點傳遞給廣播接收器PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);// 設置每天的目標時間點Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, getHour(targetTime));calendar.set(Calendar.MINUTE, getMinute(targetTime));calendar.set(Calendar.SECOND, 0);// 設置每天觸發一次alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);}private static int getHour(String time) {String[] parts = time.split(":");return Integer.parseInt(parts[0]);}private static int getMinute(String time) {String[] parts = time.split(":");return Integer.parseInt(parts[1]);}
}

在廣播接收者中獲取 targetTime 的數值,你可以通過 Intent 對象來獲取。在 TimeCheckReceiveronReceive 方法中,你可以調用 getIntent() 方法獲取觸發廣播的 Intent,然后從 Intent 中獲取傳遞的 target_time 參數。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;public class TimeCheckReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 從Intent中獲取傳遞的目標時間點參數String targetTime = intent.getStringExtra("target_time");// 檢查當前時間是否等于目標時間點try {SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");String currentTime = dateFormat.format(new Date());if (currentTime.equals(targetTime)) {// 如果達到目標時間點,執行相應的操作,例如播放音頻playAudio(context);}} catch (Exception e) {e.printStackTrace();}}private void playAudio(Context context) {// 在這里實現播放音頻的邏輯Toast.makeText(context, "Reached target time, playing audio", Toast.LENGTH_SHORT).show();// 如果需要,在這里可以獲取其他參數,例如音頻文件路徑,然后播放音頻}
}

如果你有多個時間點,你可以在 Intent 中傳遞一個標識來指示是哪個時間點觸發了廣播。然后在 TimeCheckReceiver 中根據這個標識來判斷是哪個時間點觸發了廣播,并執行相應的操作。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
import java.text.SimpleDateFormat;
import java.util.Date;public class TimeCheckReceiver extends BroadcastReceiver {private static final String EXTRA_TIME_POINT = "time_point";@Overridepublic void onReceive(Context context, Intent intent) {// 從Intent中獲取傳遞的時間點標識參數int timePoint = intent.getIntExtra(EXTRA_TIME_POINT, -1);// 獲取對應的目標時間點String targetTime = "";switch (timePoint) {case 1:targetTime = "08:00";break;case 2:targetTime = "12:00";break;// 如果有更多的時間點,繼續添加 case}// 檢查當前時間是否等于目標時間點try {SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");String currentTime = dateFormat.format(new Date());if (currentTime.equals(targetTime)) {// 如果達到目標時間點,執行相應的操作,例如播放音頻playAudio(context);}} catch (Exception e) {e.printStackTrace();}}private void playAudio(Context context) {// 在這里實現播放音頻的邏輯Toast.makeText(context, "Reached target time, playing audio", Toast.LENGTH_SHORT).show();// 如果需要,在這里可以獲取其他參數,例如音頻文件路徑,然后播放音頻}
}

在這個示例中,我們定義了一個名為 EXTRA_TIME_POINT 的常量來作為傳遞時間點標識的鍵。然后在 TimeCheckReceiveronReceive 方法中通過 intent.getIntExtra(EXTRA_TIME_POINT, -1) 來獲取傳遞的時間點標識參數。根據不同的時間點標識,我們就可以判斷是哪個時間點觸發了廣播,并執行相應的操作了。

在設置定時任務時,你需要在 AlarmHelper 類中的 setAlarm 方法中傳遞時間點標識參數,以區分不同的時間點。

代碼補充(其實)以及一些說明:

為了使用 AlarmManager 設置定時任務并接收廣播,通常需要在 AndroidManifest.xml 中聲明相應的權限和廣播接收器。以下是需要添加的權限和廣播接收器的聲明:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.yourapp"><!-- 權限聲明 --><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.SET_ALARM" /><!-- 應用組件聲明 --><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><!-- 廣播接收器聲明 --><receiver android:name=".TimeCheckReceiver" /><!-- 其他應用組件 --></application>
</manifest>

權限說明

  • android.permission.WAKE_LOCK:允許應用程序使用 WakeLock 以確保在執行任務時設備不會進入休眠狀態。這在某些情況下(例如長時間任務)可能需要。
  • android.permission.SET_ALARM:允許應用程序設置鬧鐘。這在某些舊版本的 Android 中是必要的,但在較新的版本中已經不再需要顯式聲明。

鬧鐘觸發事件:

可以將 AlarmManager.setRepeating 改為 AlarmManager.setExactAlarmManager.setExactAndAllowWhileIdle 來確保鬧鐘只在特定時間點觸發一次。這種方法可以減少系統資源消耗,并確保在特定時間點準確觸發。

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import java.util.Calendar;public class AlarmHelper {public static void setAlarms(Context context, String openTime, String closeTime) {setAlarm(context, openTime, 1);setAlarm(context, closeTime, 2);}private static void setAlarm(Context context, String targetTime, int style) {AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);Intent intent = new Intent(context, TimeCheckReceiver.class);intent.putExtra("target_time", targetTime);intent.putExtra("time_style", style);// 使用不同的請求碼來創建不同的 PendingIntentPendingIntent pendingIntent = PendingIntent.getBroadcast(context, style, intent, PendingIntent.FLAG_UPDATE_CURRENT);// 設置每天的目標時間點Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, getHour(targetTime));calendar.set(Calendar.MINUTE, getMinute(targetTime));calendar.set(Calendar.SECOND, 0);// 檢查設置的時間是否已過,如果已過則增加一天if (calendar.getTimeInMillis() < System.currentTimeMillis()) {calendar.add(Calendar.DAY_OF_YEAR, 1);}// 設置每天觸發一次alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);}private static int getHour(String time) {String[] parts = time.split(":");return Integer.parseInt(parts[0]);}private static int getMinute(String time) {String[] parts = time.split(":");return Integer.parseInt(parts[1]);}
}

說明

  1. AlarmManager.setExactAndAllowWhileIdle:這種方法確保鬧鐘在設定時間準確觸發,即使設備處于低電量模式。
  2. 每天重新設置鬧鐘:在 TimeCheckReceiver 中,每次鬧鐘觸發時都會重新設置下一天的鬧鐘,確保每天都會觸發。
  3. 檢查和調整時間:確保 targetTime 是有效的時間字符串格式("HH")。

通過這種方式,每天只會觸發一次鬧鐘,減少系統資源消耗。確保在實際測試時設備的時間和時區設置正確,以避免由于時間差異導致的觸發問題。

時間偏差問題:

這樣已經基本上解決了,但是還會遇到這樣一個問題,時間不對,相差1的問題,

獲取時間時少一秒的問題通常不是由于 SimpleDateFormat 格式化的問題,而是由于時間獲取和格式化的過程中的微小延遲。在運行時,創建 Date 對象和格式化這個對象之間可能有一個非常短的時間間隔,可能導致當前時間在實際時間上有幾毫秒的偏差,從而在格式化輸出時顯示少了一秒。

要解決這個問題,可以嘗試以下幾種方法:

  1. 檢查代碼執行時間:確保從獲取 Date 對象到格式化這個對象之間沒有不必要的延遲。
  2. 使用系統時鐘:直接獲取系統時鐘時間。

以下是一些代碼示例,演示如何減少這種時間差異:

示例1:檢查執行時間

確保代碼執行中沒有不必要的延遲:

import java.text.SimpleDateFormat;
import java.util.Date;public class TimeUtils {public static final SimpleDateFormat sdf3 = new SimpleDateFormat("HH:mm:ss");public static String getCurrentTime() {return sdf3.format(new Date());}
}public class Main {public static void main(String[] args) {long start = System.currentTimeMillis();String currentTime = TimeUtils.getCurrentTime();long end = System.currentTimeMillis();System.out.println("Current time: " + currentTime);System.out.println("Time taken: " + (end - start) + " ms");}
}

示例2:使用 DateTimeFormatterLocalTime

Java 8 及以上版本推薦使用 DateTimeFormatterLocalTime,它們是線程安全且更高效:

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;public class TimeUtils {private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");public static String getCurrentTime() {return LocalTime.now().format(timeFormatter);}
}public class Main {public static void main(String[] args) {String currentTime = TimeUtils.getCurrentTime();System.out.println("Current time: " + currentTime);}
}

示例3:減少格式化延遲

通過直接使用系統時鐘減少時間偏差:

import java.text.SimpleDateFormat;
import java.util.Date;public class TimeUtils {public static final SimpleDateFormat sdf3 = new SimpleDateFormat("HH:mm:ss");public static String getCurrentTime() {long currentTimeMillis = System.currentTimeMillis();Date date = new Date(currentTimeMillis - (currentTimeMillis % 1000)); // 去掉毫秒部分return sdf3.format(date);}
}public class Main {public static void main(String[] args) {String currentTime = TimeUtils.getCurrentTime();System.out.println("Current time: " + currentTime);}
}

結論

  • 時間偏差:從獲取 Date 對象到格式化過程中可能存在的時間延遲會導致時間偏差。
  • 優化時間獲取和格式化過程:使用系統時鐘或現代的時間 API (LocalTimeDateTimeFormatter) 可以減少這種偏差。
  • 去掉毫秒部分:在計算當前時間時去掉毫秒部分,確保獲取的時間是精確的秒。

這些方法可以有效減少獲取時間時的微小延遲問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19220.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法的時間復雜度(詳解)

前言&#xff1a; 算法(Algorithm):就是定義良好的計算過程&#xff0c;他取一個或一組的值為輸入&#xff0c;并產生出一個或一組值作為 輸出。簡單來說算法就是一系列的計算步驟&#xff0c;用來將輸入數據轉化成輸出結果 一、算法效率 1.1 如何衡量一個算法的好壞 如何衡…

3.Linux系統環境搭建

一、虛擬化機&#xff1a;指的是通過虛擬化技術將一臺計算機分為多臺邏輯計算機。注&#xff1a;虛擬機共用CPU和內存資源。 二、虛擬機用途&#xff1a; 1.搭建學習環境&#xff1a;例如在同一間實驗室里&#xff0c;物理機Windows系統&#xff0c;虛擬機可以用Linux系統。 …

匯舟問卷:國外問卷調一天900

大家好&#xff0c;我是匯舟問卷&#xff0c;專注于國外問卷調查互聯網項目。夏天已經來臨&#xff0c;您是否在三伏天頂著大太陽上班&#xff0c;汗水浸濕了衣襟&#xff0c;卻依然要面對繁瑣的工作和無盡的壓力&#xff1f; 在這個炎熱的季節里&#xff0c;我們都渴望找到一…

什么是React?

01 Why React? What is React? I think the one-line description of React on its home page (https://react.dev/) is concise and accurate: “A JavaScript library for building user interfaces.” 我認為React主頁(https://react.dev/)上的一行描述既簡潔又準確: …

ch3運輸層--計算機網絡期末復習(持續更新中)

運輸層位于網絡層之上 運輸層協議提供的某些服務受到網絡層協議的限制。比如,時限和帶寬保證。 運輸層也提供自己的特殊服務。比如,可靠數據傳輸服務,安全性服務。 網絡層:兩個主機之間的邏輯通信 運輸層:兩個進程之間的邏輯通信 網絡地址:主機的標識(IP地址) 傳輸地址: …

vmware中Ubuntu虛擬機和本地電腦Win10互相ping通

初始狀態 使用vmware17版本安裝的Ubuntu的20版本&#xff0c;安裝之后什么配置都要不懂&#xff0c;然后進行下述配置。 初始的時候是NAT&#xff0c;沒動的. 設置 點擊右鍵編輯“屬性” 常規選擇“啟用”&#xff1a; 高級選擇全部&#xff1a; 打開網絡配置&#xff0c;右鍵屬…

玄機平臺應急響應—Linux入侵排查

1、前言 這篇文章主要說一下linux的入侵排查&#xff0c;也就是說當你的服務器已經被入侵的時候&#xff0c;該如何去排查使其恢復正常。下面是排查的步驟&#xff0c;但是實際情況往往更為復雜&#xff0c;需要進一步來分析&#xff0c;而不是無腦的按照步驟來敲就完事了。 …

HAL庫使用FreeRTOS實時操作系統時配置時基源(TimeBase Source)

需要另外的定時器&#xff0c;用systic的時候生成項目會有警告 https://blog.51cto.com/u_16213579/10967728

同比和環比

1、概述 同比和環比是兩種常見的數據分析方法&#xff0c;用于衡量數據在不同時間段的變化情況。通過同比和環比的計算&#xff0c;可以更清晰地了解數據在不同時間段的增長或下降情況&#xff0c;從而為決策提供依據。 2、同比 同比&#xff08;Year-on-Year, YoY&#xff09…

05-28 周二 TTFT, ITL, TGS 計算過程以及LLama2推理代碼調試過程

05-28 周二 LLama2推理代碼調試過程 時間版本修改人描述2024年5月28日15:03:49V0.1宋全恒新建文檔 簡介 本文主要用于求解大模型推理過程中的幾個指標&#xff1a; 主要是TTFT&#xff0c;ITL&#xff0c; TGS 代碼片段 import osdata_dir "/workspace/models/" m…

獲取 Excel 單元格的條件格式是否成立及其改變后的屬性(如背景顏色)

獲取 Excel 單元格的條件格式是否成立及其改變后的屬性&#xff08;如背景顏色&#xff09;&#xff0c;直接通過 VSTO API 是有挑戰的&#xff0c;因為條件格式的實際應用效果在 Excel 的內部邏輯中&#xff0c;并不直接暴露給外部 API。盡管如此&#xff0c;可以通過一些工作…

unity中的常用屬性修飾符

unity中的常用屬性修飾符 一、前言二、常用修飾符三、結語 一、前言 在做unity開發編輯腳本的時候經常會用到屬性修飾符&#xff0c;使開發調試更加便捷。初學者見過最多的莫過于[Header("標題文本")]了吧&#xff0c;除此之外其實還有很多&#xff0c;這篇文章列舉說…

MFC工控項目實例一主菜單制作

1、本項目用在WIN10下安裝的vc6.0兼容版實現。創建項目名為SEAL_PRESSURE的MFC對話框。在項目res文件下添加相關256色ico格式圖片。 2、項目名稱&#xff1a;密封壓力試驗機 主菜單名稱&#xff1a; 系統參數 SYS_DATA 系統測試 SYS_TEST 選擇型號 TYP_CHOICE 開始試驗 TES_STA…

sdbusplus:通過文件描述符傳遞數據

有的時候需要傳遞大量的數據,如果將數據通過dbus傳遞,會消耗大量的帶寬。可以通過傳遞一個文件描述符替代傳遞數據: 以下的service通過文件描述符接收數據: //fd_service.cpp #include <sdbusplus/asio/connection.hpp> #include <sdbusplus/asio/object_server…

U盤無法打開?數據恢復與預防措施全解析

在日常生活和工作中&#xff0c;U盤已成為我們存儲和傳輸數據的重要工具。然而&#xff0c;有時我們會遇到U盤無法打開的情況&#xff0c;這無疑給我們帶來了諸多不便。本文將深入探討U盤打不開的現象、原因及解決方案&#xff0c;并分享如何預防此類問題的發生。 一、U盤無法訪…

Java實現對象存儲的4種方式(本地對象存儲、MINIO、阿里云OSS、FastDFS)

文章目錄 Java實現對象存儲的3中方式1、概述2、本地對象存儲2.1 配置本地文件相關信息2.2 通用映射配置 ResourcesConfig2.3 文件上傳業務 LocalSysFileServiceImpl2.4 上傳接口2.5 演示 3、MINIO3.1 依賴3.2 配置3.3 配置連接信息3.4. MINIO文件上傳業務3.5 文件上傳下載接口3…

學生管理系統 面向對象

創建一個實例對象后 把實例對象添加到列表后 每次遍歷列表 都能獲得一個實例對象 然后就可以使用實例對象的屬性和方法了 學生管理系統 面向對象 兩個類 學生管理類 學生類 # 學生類 # 屬性 姓名 電話 class Student:def __init__(self, name, phone):self.name nameself.phon…

各大翻譯軟件代碼——潯川AI翻譯研發社團

一、前言 有道翻譯API&#xff08;主要推薦&#xff09; 百度翻譯API&#xff08;需要申請key與密鑰&#xff0c;每月100萬免費字符&#xff09; 谷歌翻譯API&#xff08;需要梯子&#xff0c;而且不穩定&#xff0c;不推薦&#xff09; 二、代碼 1、有道翻譯 def is_Chi…

高性價比、超強功能的開源工單解決方案

在企業日常運營中&#xff0c;工單管理系統是不可或缺的工具。高效的工單管理不僅能提升工作效率&#xff0c;還能顯著提高客戶滿意度。今天&#xff0c;我們為您推薦搭貝工單派單系統——一款超高性價比、功能齊全的開源工單管理系統。 &#x1f50d; 為什么選擇搭貝工單派單…

LangChain入門開發教程(一):Model I/O

官方文檔&#xff1a;https://python.langchain.com/docs/get_started/introduction/ LangChain是一個能夠利用大語言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能力進行快速應用開發的框架&#xff1a; 高度抽象的組件&#xff0c;可以像搭積木一樣&a…