Android開發知識點總結合集

初級安卓開發需要掌握的知識點主要包括安卓四大組件、Context、Intent、Handler、Fragment、HandlerThread、AsyncTask、IntentService、Binder、AIDL、SharedPreferences、Activity、Window、DecorView以及ViewRoot層級關系、觸摸事件分發機制、View繪制流程、自定義View。

1. 環境搭建

  • Java:作為Android開發的傳統語言,需要掌握面向對象編程、集合框架、異常處理、多線程和網絡編程等。
  • Kotlin:Google推薦的Android開發語言,提供了更簡潔的語法和空安全等特性,需要掌握其基本語法、協程用于異步編程等。
  • Android Studio:熟悉Android Studio的項目管理、代碼編輯、調試和性能分析工具。
  • Gradle:掌握Gradle構建工具,了解其配置和插件使用。
  • ?JDK:Android開發需要在Java環境下進行,所以需要先安裝JDK。

  • Android SDK:包含了開發Android應用所需的所有工具和庫。

  • ?IDE:Android Studio是一個被谷歌推薦的開發環境,也是最常用的一個。

2. Android SDK

  • Android四大組件:活動(Activity)、服務(Service)、廣播接收器(Broadcast Receiver)、內容提供器(Content Provider)
  • Activity:包含用戶界面的組件,用于和用戶交互。理解Activity的生命周期,掌握啟動模式和任務棧。Fragment:嵌入在活動中的UI片段,兼顧手機和平板,讓界面在平板上更好展示。
  • Service:后臺服務,不需要和用戶交互,但需要長期運行的任務。Android多線程編程 extends Thread、implements Runnable,不允許在子線程進行UI操作,異步消息處理、服務生命周期。服務最佳實踐:網絡下載。
  • BroadcastReceiver:跨進程通信,廣播接收器的使用,用于接收系統或應用發出的廣播。標準廣播(異步)、有序廣播(同步)、動態注冊(代碼)、靜態注冊(xml)、全局廣播、本地廣播(解決安全性問題)。廣播最佳實踐:QQ強制下線。
  • ContentProvider:跨程序數據共享(getContentResolver),與運行時權限有關。

? 活動Activity:Android應用程序的核心組成部分。

? 服務Service:在后臺運行的組件,不與用戶直接交互。

? 內容提供者Content Provider:提供多個應用程序之間共享的數據。

? 廣播接收者Broadcast Receiver:能夠接收指定的廣播消息。

3. UI 界面

  • 布局:熟悉各種布局方式,如LinearLayout、RelativeLayout、FrameLayout、PercentFrameLayout等。
  • 控件:掌握常見控件如Button、TextView、ImageView、ListView、RecyclerView、MediaPlayer、VideoView、WebView、ViewPager等的使用。
  • 數據綁定:使用Data Binding和View Binding簡化布局和代碼的關聯。
  • MaterialDesign/DesignSupport:ToolBar、DrawerLayout、NavigationView、FloatingActionButton、SnackBar、CoordinatorLayout、CardView、AppBarLayout、SwipeRefreshLayout、CollapsingToolbarLayout

4. IO 網絡和文件

  • HTTP請求:HttpURLConnection(官方輕量級)、OkHttp(高效)、Volley(關注圖片)、Retrofit(復雜請求)、AsyncHttpClient(復雜請求)。
  • XML解析:Pull解析、SAX解析。
  • JSON解析:JSONObject(官方、功能簡單)、GSON(谷歌、默認推薦)、FastJSON(阿里、高性能)、Jackson。
  • 持久化存儲:文件存儲(openFileOutput)、鍵值存儲(SharedPreferences)、關系存儲(SQLiteOpenHelper)、ORM框架(LitePal/Room)

5.Android系統架構

Android系統架構主要分為四部分,包括應用層、應用框架層、系統運行庫層和Linux內核層。

  • 內核層:Android系統是基于Linux內核的,這一層為Android設備的各種硬件提供了底層的驅動,如顯示驅動、音頻驅動、照相機驅動、藍牙驅動、Wi-Fi驅動、電源管理等。
  • 系統運行庫層:提供一些特性支持,如數據庫支持,OpenGL ES提供3D繪圖支持,webkit庫提供瀏覽器內核支持。在這一層還有Android運行時庫,它主要提供了一些核心庫,允許開發者使用Java語言來編寫Android應用。另外,Android運行時庫中還包含了Dalvik虛擬機(5.0系統之后改為ART運行環境),它使得每一個Android應用都能運行在獨立的進程中,并且擁有一個自己的虛擬機實例。相較于Java虛擬機,Dalvik和ART都是專門為移動設備定制的,它針對手機內存、CPU性能有限等情況做了優化處理。
  • 應用框架層這一層主要提供了構建應用程序時可能用到的各種API,Android自帶的一些核心應用就是使用這些API完成的,開發者可以使用這些API來構建自己的應用程序。
  • 應用層:用戶安裝的所有應用

? 應用層:用戶可視化的應用程序。

? 應用框架層:提供了許多API,為應用程序提供了訪問下層的功能。

? 系統運行庫層:為開發人員提供了C/C++庫,能夠使用眾多系統服務和庫。

? Linux內核層:包含了設備驅動程序,管理底層硬件。

6. Android的視圖

? 布局Layouts:用于定義和管理屏幕中的控件。

? 視圖View:每一個UI組件,如文本框、按鈕、列表項等。

? 文本框TextView:顯示文本。

? 按鈕Button:用于觸發某些操作。

? 列表項ListView:用于顯示大量數據,支持滾動。

? 圖片視圖ImageView:顯示位圖和其他圖像。

7. Android的事件處理

? 視圖事件:指根據用戶對視圖的一些操作所產生的事件。

? 外部事件:指與Android系統和其他應用程序交互時產生的事件。例如電話、短信、電子郵件等。

8. Android的存儲管理

  1. 使用SharedPreference存儲數據;它是Android提供的用來存儲一些簡單配置信息的一種機制,采用了XML格式將數據存儲到設備中,只能在同一個包內使用,不能在不同包之間使用。
  2. 文件存儲數據;文件存儲方式是一種叫常用的方法,在Android中讀取/寫入文件的方法,與java中實現I/O的程序是完全一樣的,提供了openFileInput()和openFileOutput()方法來讀取設備上的文件。
  3. SQlite數據庫存儲數據;SQlite是Android所帶的一個標準的數據庫,它支持SQL語句,它是一個輕量級的嵌入式數據庫。
  4. 使用ContentProvider存儲數據;主要在于應用程序之間進行數據交換,從而能夠讓其他的應用保存或讀取此ContentProvider的各種數據的類型。
  5. 網絡存儲數據;同網絡上提供給我們的存儲空間來上傳(存儲)和下載(獲取)我們存儲在網絡空間中的數據信息。

? SharedPreferences:用于簡單的鍵值存儲。

? 文件存儲:用于簡單的文本或二進制數據存儲。

? SQLite數據庫:用于豐富的結構化數據存儲。

9. Android的網絡通信

? HTTP通信:使用HttpURLConnection和Apache HttpClient等類。

? JSON數據:簡單的文本格式,用于交換數據。

? XML數據:一種可擴展的標記語言,用于交換數據。

10.項目結構

  • gradle.properties這個文件是全局的gradle配置文件,在這里配置的屬性將會影響到項目中所有的gradle編譯腳本。
  • app文件夾,項目的主要主體,也是我們主要的工作目錄
    • build:編譯自動生成的相關中間文件
    • libs:第三方jar包
    • AndroidTest,安卓測試用例
    • java:java代碼
    • res:資源目錄,圖片放在drawable目錄下,布局放在layout下,圖標文件放在mipmap文件夾下,字符串也算資源,放在value下
    • AndroidManifest.xml這是整個Android項目的配置文件,你在程序中定義的所有四大組件都需要在這個文件里注冊。
    • proguard-rules.pro這個文件用于指定項目代碼的混淆規則,當代碼開發完成后打包成安裝包文件,如果不希望代碼被別人破解,通常會將代碼進行混淆,從而讓破解者難以閱讀。

layout就是布局,安卓可以在代碼中創建視圖類,也可以使用xml定義視圖layout。

11.Context

Context是安卓應用程序的上下文,用于獲取應用程序的資源和相關信息,可以通過getApplicationContext和Activity的this獲取。Context包括應用程序的環境信息和資源信息。

12.Intent

Intent是安卓應用程序之間進行通信的載體,可以用于啟動活動、啟動服務、發送廣播等。可以通過putExtra和getExtra傳遞數據。
intent意為意圖,是程序中各組件交互的重要方法,不僅可以指定當前組件要進行的動作,還可以在組件之進行數據的傳遞。

intent有顯示意圖和隱式意圖之分
顯示意圖 可以通過名稱開啟組件
隱式意圖 沒有明確指定要開啟的組件,而是通過指定action。category等舒心信息,系統根據這些信息進行分析,然后尋找目標的Activity。

13.Handler

Handler是安卓中處理消息機制的基礎,用于在不同的線程之間傳遞消息。Handler可以通過post、sendMessage等方法發送消息,通過handleMessage方法處理消息。

14.Fragment

Fragment是安卓中用于構建靈活的UI界面的組件,可以將一個Activity分成多個Fragment,每個Fragment可以有自己的布局和行為。Fragment可以通過FragmentManager進行管理。

15.HandlerThread

HandlerThread是安卓中的一個線程類,用于創建一個帶有Looper的線程,可以用于處理消息隊列。HandlerThread可以通過start和quit方法啟動和停止線程。

16.AsyncTask

AsyncTask是安卓中的一個異步任務類,用于在后臺執行一些耗時的操作,可以在后臺線程中更新UI。AsyncTask包括onPreExecute、doInBackground、onProgressUpdate、onPostExecute等方法。

17.IntentService

IntentService是安卓中的一個服務類,用于處理一些異步任務,可以在后臺線程中執行。IntentService可以通過onHandleIntent方法處理任務。

18.Binder

Binder是安卓中的一個IPC機制,用于在不同的進程之間進行通信。Binder可以通過IBinder接口進行通信。

19.AIDL

AIDL是安卓中的一個IPC機制,用于跨進程通信。AIDL可以通過接口文件和Stub類進行實現。

20.SharedPreferences

SharedPreferences是安卓中的一個輕量級存儲類,用于存儲一些簡單的數據,如用戶名、密碼等。SharedPreferences可以通過getSharedPreferences方法獲取。

21.Window、DecorView以及ViewRoot層級關系

Window、DecorView和ViewRoot是安卓中的三個重要概念。Window是安卓應用程序界面的最頂層容器,DecorView是Window中的一個ViewGroup,包括標題欄、內容區域和狀態欄,ViewRoot是DecorView的父容器。

22.觸摸事件分發機制

觸摸事件分發機制是安卓中的一個重要機制,用于處理用戶的觸摸事件。觸摸事件分發機制包括事件分發、事件攔截和事件處理。

23.View繪制流程

View的繪制流程是安卓中的一個重要概念,用于實現自定義View。View的繪制流程包括測量、布局和繪制。

24.自定義View

自定義View是安卓中的一個重要技術,可以實現靈活的UI界面。自定義View需要了解View的測量、布局和繪制流程,以及Canvas、Paint等相關知識。

25.Android中五大布局

1.LinearLayout線性布局
線性布局在實際開發中很常用,它主要以水平和垂直的方式顯示界面中的控件。線性布局中有一個非常重要的屬性orientation用于控制控件排列的方向,vertical表示垂直顯示,horizonal表示水平顯示。

2.RelativeLayout相對布局
是通過相對定位的方式指定控件位置,在設計的時候遵循控件之間的依賴關系,后放入的控件的位置依賴于先放入的控件的位置。

3.FrameLayout幀布局
為每個加入其中的控件創建一個白區域,幀布局大小有內部最大控件決定

4.AbsoluteLayout絕對布局
通過指定X,Y坐標的控制每個控件的位置

5.TableLayout表格布局
通過行和列將界面劃分為多個單元,每個單元可以添加控件

26.Activity啟動模式

介紹Android啟動模式之前,先介紹兩個概念task和taskAffinity

  • task:翻譯過來就是“任務”,是一組相互關聯的activity集合,可以理解為Activity是在task里面活動的。task存在于一個被稱為back stack的數據結構中,也就是說,task是以棧的形式去管理activity的,所以也可以叫做“任務棧”。
  • taskAffinity:官方文檔翻譯是:“The task that the activity has a affinity for.”,可以翻譯為activity相關或者親和任務,這個參數標識了一個Activity所需要的任務棧的名字。默認情況下,所有Activity所需要的任務棧的名字為應用的包名。taskAffinity屬性主要和singleTask啟動模式或者allowTaskReparenting屬性配對使用。

4種啟動模式

  1. standard:標準模式,也是系統默認的啟動模式。假如activity A啟動了activity B,activity B則會運行在activity A所在的任務棧中。而且每次啟動一個Activity,都會重新創建新的實例,不管這個實例在任務中是否已經存在。非Activity類型的context(如ApplicationContext)啟動standard模式的Activity時會報錯。非Activity類型的context并沒有所謂的任務棧,由于上面第1點的原因所以系統會報錯。此解決辦法就是待啟動acti指定FLAG_ACTIVITY_NEW_TASK標記位,這樣啟動的時候系統就會為它創建一個新的任務棧。這個時候待啟動Activity其實是以singleTask模式啟動的。
  2. singleTop:棧頂復用模式。假如activity A啟動了activity B,就會判斷A所在的任務棧棧頂是否是B實例。如果是,則不創建新的activity B實例而是直接引用這個棧頂實例,同時onNewIntent方法會被調用,通過該方法的參數可以取得當前請求的信息;如果不是,則創建新的activity B實例。
  3. singleTask:棧內復用模式。在第一次啟動這個Activity時,系統便會創建一個新的任務,并且初始化Activity的實例,放在心任務的底部。不過需要滿足一定條件的。那就是需要設置taskAffinity屬性。前面也說過了,taskAffinity屬性是和singleTask模式搭配使用的。
    [圖片上傳失敗...(image-4509a9-1593940979666)]
  4. singleInstance:單實例模式。這個時singleTask模式的加強版,它除了具有singleTask模式的所有特性外,它還有一點獨特的特性,那就是此模式的Activity只能單獨地位于一個任務棧,不與其他Activity共存于同一個任務棧。

27.廣播注冊

首先寫一個類要繼承BroadCastReceiver
第一種:在清單文件中聲明,添加

第二種:使用代碼進行注冊如:

兩種注冊類型的區別是:

  1. 第一種是常駐型廣播,也就是說當應用程序關閉后,如果有信息廣播來,程序也會被系統調用自動運行。
  2. 第二種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。

28.Android中的ANR

ANR的全稱application not responding responding 應用程序未響應。

  • 在android中Activity的最長執行事時間為5秒。
  • broadcastreceiver的最長執行時間則是10秒。
  • Service的最長執行時間是20秒。

超過執行時間就會產生ANR。注意:ANR是系統拋出的異常,程序是捕捉不了這個異常的。
解決方法:

  1. 運行在主線程里的任何方法都盡可能少做事情。特別是,Activity應該在它的關鍵生命周期方法(如onCreate()和OnResue())里盡可能少的去做創建操作。(可以采用重新開啟子線程的方式,然后使用hander+message的方式去做一些操作,比如更新主線程中的UI等)。
  2. 應用程序應該避免在broadcastreceiver里面做耗時的操作或者計算。但不再是在子線程里做這些任務(因為broadcastreceiver的生命周期短)替代的是,如果響應intent廣播需要執行一個耗時的動作的話,應用程序應該啟動一個Service。

29.ListView優化

  1. convertView重用,利用好convertView來重用View,切勿每次getView()都新建。ListView的核心原理就是重用View,如果重用View不改變寬高,重用View就可以減少重新分配緩存造成的內存頻繁分配/回收。
  2. ViewHolder優化,使用ViewHolder的原因是findViewById方法耗時較大,如果控件個數過多,會嚴重影響性能,而使用ViewHolder主要是為了可以省去這個時間。通過setTag,getTag直接獲取View。
  3. 減少ItemView的布局層次,這是所有layout都必須遵循的,布局層級過深會直接導致View的測量和繪制浪費大量的時間。
  4. adapter中的getView方法盡量少使用邏輯。
  5. 圖片加載采用三級緩存,避免每次都要重新加載。
  6. 嘗試開啟硬件加速來使ListView的滑動更加流暢。
  7. 使用RecycleView代替。

當 convertView 為空時,用 setTag()方法為每個 View 綁定一個存放控件的 ViewHolder 對象。當convertView 不為空, 重復利用已經創建的 view 的時候, 使用 getTag()方法獲取綁定的 ViewHolder對象,這樣就避免了 findViewById 對控件的層層查詢,而是快速定位到控件。 復用 ConvertView,使用歷史的 view,提升效率 200%

自定義靜態類 ViewHolder,減少 findViewById 的次數。提升效率 50%

異步加載數據,分頁加載數據。

使用 WeakRefrence 引用 ImageView 對象

30.Thread和Runnable的區別

在程序開發中只要是多線程肯定永遠以實現Runnable接口為主,因為實現Runnable接口相比。
繼承Thread類有如下好處:

  • 避免點繼承的局限,一個類可以繼承多個接口。
  • 適合于資源的共享

在使用Runnable定義的子類中沒有start()方法,只有Thread類中才有。此時觀察Thread類,有一個構造方法:public Thread(Runnable targer)此構造方法接受Runnable的子類實例,也就是說可以通過Thread類來啟動Runnable實現的多線程。

31.Android中activity,context,application有什么不同

Content與application都繼承與contextWrapper,contextWrapper繼承于Context類。

Context:表示當前上下文對象,保存的是上下文中的參數和變量,它可以讓更加方便訪問到一些資源。

Context通常與activity的生命周期是一樣的,application表示整個應用程序的對象。

對于一些生命周期較長的,不要使用context,可以使用application。

在activity中,盡量使用靜態內部類,不要使用內部類。內部里作為外部類的成員存在,不是獨立于activity,如果內存中還有內存繼續引用到context,activity如果被銷毀,context還不會結束。

Context區別

  • Activity和Service以及Application的Context是不一樣的,Activity繼承自ContextThemeWraper.其他的繼承自ContextWrapper
  • 每一個Activity和Service以及Application的Context都是一個新的ContextImpl對象
  • getApplication()用來獲取Application實例的,但是這個方法只有在Activity和Service中才能調用的到。那么也許在絕大多數情況下我們都是在Activity或者Service中使用Application的,但是如果在一些其它的場景,比如BroadcastReceiver中也想獲得Application的實例,這時就可以借助getApplicationContext()方法,getApplicationContext()比getApplication()方法的作用域會更廣一些,任何一個Context的實例,只要調用getApplicationContext()方法都可以拿到我們的Application對象。
  • Activity在創建的時候會new一個ContextImpl對象并在attach方法中關聯它,Application和Service也差不多。ContextWrapper的方法內部都是轉調ContextImpl的方法
  • 創建對話框傳入Application的Context是不可以的
  • 盡管Application、Activity、Service都有自己的ContextImpl,并且每個ContextImpl都有自己的mResources成員,但是由于它們的mResources成員都來自于唯一的ResourcesManager實例,所以它們看似不同的mResources其實都指向的是同一塊內存
  • Context的數量等于Activity的個數 + Service的個數 + 1,這個1為Application

32.Serializable 和 Parcelable 的區別?

如果存儲在內存中,推薦使用parcelable,使用serialiable在序列化的時候會產生大量的臨時變量,會引起頻繁的GC

如果存儲在硬盤上,推薦使用Serializable,雖然serializable效率較低

Serializable的實現:只需要實現Serializable接口,就會自動生成一個序列化id

Parcelable的實現:需要實現Parcelable接口,還需要Parcelable.CREATER變量

33.uses-permission和permission的區別

就是<uses-permission>是官方定義的權限,是調用別人的東西的時候自己需要聲明的權限,<permission>是自己定義的權限,就是別人調用這個程序時需要用<uses-permission>來聲明。
在一般情況下實際上不需要為自己的應用程序聲明某個權限,除非你提供了供其他應用程序調用的代碼或者數據。這個時候你才需要使用<permission>這個標簽,很顯然這個標簽可以讓我們聲明自己程序的權限。

34.Fragment 在你們項目中的使用

Fragment 是 android3.0 以后引入的的概念,做局部內容更新更方便,原來為了到達這一點要把多個布局放到一個 activity 里面,現在可以用多 Fragment 來代替,只有在需要的時候才加載Fragment,提高性能。

Fragment 的好處:

  • Fragment 可以使你能夠將 activity 分離成多個可重用的組件,每個都有它自己的生命周期和UI。
  • Fragment 可以輕松得創建動態靈活的 UI 設計,可以適應于不同的屏幕尺寸。從手機到平板電腦。
  • Fragment 是一個獨立的模塊,緊緊地與 activity 綁定在一起。可以運行中動態地移除、加入、交換等。
  • Fragment 提供一個新的方式讓你在不同的安卓設備上統一你的 UI。
  • Fragment 解決 Activity 間的切換不流暢,輕量切換。
  • Fragment 替代 TabActivity 做導航,性能更好。
  • Fragment 在 4.2.版本中新增嵌套 fragment 使用方法,能夠生成更好的界面效果。

35.Android 線程間通信有哪幾種方式

  • 共享內存(變量);
  • 文件,數據庫;
  • Handler;
  • Java 里的 wait(),notify(),notifyAll();

36.Framework 工作方式及原理,Activity 是如何生成一個 view 的,機制是什么?

所有的框架都是基于反射 和 配置文件(manifest)的。

普通的情況:

Activity 創建一個 view 是通過 ondraw 畫出來的, 畫這個 view 之前呢,還會調用 onmeasure方法來計算顯示的大小.

特殊情況:

Surfaceview 是直接操作硬件的,因為 或者視頻播放對幀數有要求,onDraw 效率太低,不夠使,Surfaceview 直接把數據寫到顯存。

37.Android中touch事件的傳遞機制是怎樣的?

  1. Touch事件傳遞的相關API有dispatchTouchEvent、onTouchEvent、onInterceptTouchEvent
  2. Touch事件相關的類有View、ViewGroup、Activity
  3. Touch事件會被封裝成MotionEvent對象,該對象封裝了手勢按下、移動、松開等動作
  4. Touch事件通常從Activity#dispatchTouchEvent發出,只要沒有被消費,會一直往下傳遞,到最底層的View。
  5. 如果Touch事件傳遞到的每個View都不消費事件,那么Touch事件會反向向上傳遞,最終交由Activity#onTouchEvent處理.
  6. onInterceptTouchEvent為ViewGroup特有,可以攔截事件.
  7. Down事件到來時,如果一個View沒有消費該事件,那么后續的MOVE/UP事件都不會再給它

38.描述下Handler 機制

  1. Looper: 一個線程可以產生一個Looper對象,由它來管理此線程里的MessageQueue(消息隊列)。
  2. Handler: 你可以構造Handler對象來與Looper溝通,以便push新消息到MessageQueue里;或者接收Looper從Message Queue取出)所送來的消息。
  3. Message Queue(消息隊列):用來存放線程放入的消息。
  4. 線程:UIthread 通常就是main thread,而Android啟動程序時會替它建立一個MessageQueue。

Hander持有對UI主線程消息隊列MessageQueue和消息循環Looper的引用,子線程可以通過Handler將消息發送到UI線程的消息隊列MessageQueue中。

39.自定義view的基本流程

  • 自定義View的屬性 編寫attr.xml文件
  • 在layout布局文件中引用,同時引用命名空間
  • 在View的構造方法中獲得我們自定義的屬性 ,在自定義控件中進行讀取(構造方法拿到attr.xml文件值)
  • 重寫onMesure
  • 重寫onDraw
  • onMeasure()

  • onLayout()

  • onDraw()。

40.事件分發中的 onTouch 和 onTouchEvent 有什么區別,又該如何使用?

這兩個方法都是在 View 的 dispatchTouchEvent 中調用的,onTouch 優先于 onTouchEvent執行。如果在 onTouch 方法中通過返回 true 將事件消費掉,onTouchEvent 將不會再執行。

另外需要注意的是,onTouch 能夠得到執行需要兩個前提條件,第一 OnTouchListener 的值不能為空,第二當前點擊的控件必須是 enable 的。因此如果你有一個控件是非 enable 的,那么給它注冊 onTouch 事件將永遠得不到執行。對于這一類控件,如果我們想要監聽它的 touch 事件,就必須通過在該控件中重寫 onTouchEvent 方法來實現。

41.一般在開發項目中都使用什么設計模式?如何來重構,優化代碼?

較為常用的就是單例設計模式,工廠設計模式以及觀察者設計模式,

一般需要保證對象在內存中的唯一性時就是用單例模式,例如對數據庫操作的 SqliteOpenHelper 的對象。

工廠模式主要是為創建對象提供過渡接口,以便將創建對象的具體過程屏蔽隔離起來,達到提高靈活性的目的。

觀察者模式定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。

42.andorid 應用第二次登錄實現自動登錄

前置條件是所有用戶相關接口都走 https,非用戶相關列表類數據走 http。

  • 第一次登陸 getUserInfo 里帶有一個長效 token,該長效 token 用來判斷用戶是否登陸和換取短 token
  • 把長效 token 保存到 SharedPreferences
  • 接口請求用長效 token 換取短token,短 token 服務端可以根據你的接口最后一次請求作為標示,超時時間為一天。
  • 所有接口都用短效 token
  • 如果返回短效 token 失效,執行第3步,再直接當前接口
  • 如果長效 token 失效(用戶換設備或超過一月),提示用戶登錄。

43.怎樣對 android 進行優化?

  • 對 listview 的優化。
  • 對圖片的優化。
  • 對內存的優化。
  • 具體一些措施
  • 盡量不要使用過多的靜態類 static
  • 數據庫使用完成后要記得關閉 cursor
  • 廣播使用完之后要注銷

44.wait()和sleep()的區別

sleep()方法是線程類(Thread)的靜態方法,導致此線程暫停執行指定時間,將執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復(線程回到就緒(ready)狀態),因為調用sleep 不會釋放對象鎖。wait()是Object 類的方法,對此對象調用wait()方法導致本線程放棄對象鎖(線程暫停執行),進入等待此對象的等待鎖定池,只有針對此對象發出notify 方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入就緒狀態。

45.logcat的使用

Android使用Android.util.Log類的靜態方法實現輸出程序信息。Logcat輸出日志內容分為6個級別,分別是Verbose(V)顯示全部信息、debug(D)顯示調試信息、info(I)顯示一般信息、warning(W)顯示警告信息、error(E)顯示錯誤信息、Assert(A)沒有對應的方法。

46.清單文件

清單文件AndroidMainifest.xml是整個項目配置文件,程序中定義的四大組件(Acticity、brindcastRecever、Service、contentProvider)都要在這個文件中配置,同時在這個文件中注冊APP的各項權限。

47.Activity的四種啟動模式

1.standard模式
每啟動一個Activity就在棧頂創建一個新的實例

2.singleTop模式
判斷要啟動的Activity實例是否存在于棧頂,如果位于棧頂就直接復用,否則創建新的實例

3.singleTask模式
每次啟動Activity時,系統首先檢查棧中是否存在當前的Activity實例,如果存在就直接使用,并且把當前的Activity之上的所有Activity出棧,否則重新創建一個新的實例。

4.singleInstance模式
回啟動一個新的Activity來管理Activity實例

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

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

相關文章

如何通過域名白名單?OVP防盜鏈加密視頻?

文章目錄前言一、什么是域名白名單?OVP防盜鏈二、域名白名單?OVP防盜鏈的實現原理三、如何實現域名白名單?OVP防盜鏈加密視頻總結前言 用戶原創視頻資源面臨被非法盜鏈、惡意嵌入的嚴峻挑戰&#xff0c;盜用行為不僅侵蝕創作者收益&#xff0c;更擾亂平臺生態秩序。域名白名…

密碼學系列文(2)--流密碼

一、流密碼的基本概念RC4&#xff08;Rivest Cipher 4&#xff09;是由密碼學家 Ron Rivest&#xff08;RSA 算法發明者之一&#xff09;于 1987 年設計的對稱流加密算法。它以簡單、高效著稱&#xff0c;曾廣泛應用于網絡安全協議&#xff08;如 SSL/TLS、WEP/WPA&#xff09;…

Drools?業務引擎

drools引擎使用 官網介紹 一、底層原理 ReteOO 網絡 ? 本質是一張“有向無環圖”&#xff0c;節點類型&#xff1a; – Root / ObjectTypeNode&#xff1a;按 Java 類型分發事實 – AlphaNode&#xff1a;單對象約束&#xff08;age > 18&#xff09; – BetaNode&#xf…

linux的磁盤滿了清理辦法

今天測試系統的某個磁盤滿了&#xff0c;需要看一下&#xff0c;可以看到的是&#xff0c;已經被占用百分之百了&#xff0c;某些服務運行不了了&#xff0c;需要清一下&#xff0c;這個我熟看哪個目錄占用空間大cd / du -sh * ##找到占用最大&#xff0c;比如cd /home cd /hom…

阿里開源項目 XRender:全面解析與核心工具分類介紹

阿里開源項目 XRender&#xff1a;全面解析與核心工具分類介紹 在開源技術飛速發展的浪潮中&#xff0c;阿里巴巴推出的 XRender 作為專注于表單與數據可視化的開源框架&#xff0c;憑借獨特的設計理念和強大功能&#xff0c;已在開發者群體中嶄露頭角。XRender 以 “協議驅動…

網絡安全初級--搭建

一、Docker搭建apt-get install docker.io docker-compose 下載docker 配置docker代理 a.創建對應的以及對應的文件mkdir /etc/systemd/system/docker.service.dvim /etc/systemd/system/docker.service.d/http-proxy.confb.寫入以下內容[Service]Environment"HTTP_PROXYh…

文心一言4.5深度評測:國產大模型的崛起之路

在?語?模型競爭?益激烈的今天&#xff0c;百度推出的文???4.5憑借其在中文處理上的獨特優勢&#xff0c;正在成為越來越 多開發者的選擇。經過為期?周的深度測試和數據分析&#xff0c;我將從技術參數、性能表現、成本效益等多個維度&#xff0c; 為?家呈現這款國產?模…

科技的成就(六十九)

631、攝影術的先驅 1801年&#xff0c;德國物理學家約翰威廉里特&#xff08;Johann Wilhelm Ritter&#xff09;發現了紫外線。他注意到&#xff0c;太陽光譜中紫色一側光譜之外的位置的不可見射線比紫光更快地使氯化銀試劑變暗&#xff0c;他將其稱為“化學射線”。后來這種射…

用Golang gRPC異步處理:釋放并發性能的秘密武器

目錄 章節一:為什么gRPC異步處理是并發性能的“加速器” 異步的本質:解放Goroutine的潛能 異步gRPC的適用場景 章節二:從零開始:搭建一個異步gRPC服務 準備工作:定義Protobuf 實現同步gRPC服務 邁向異步:初步改造 章節三:用Worker Pool模式榨干并發性能 Worker …

MCP終極篇!MCP Web Chat項目實戰分享

目錄 前言 MCP Web Chat 功能概要說明 MCP Web Chat代碼調用結構說明 api動態生成MCP Server 方法一&#xff08;之前的方法&#xff09; 方法二&#xff08;現在的方法&#xff09; 做個比較 相關代碼 相關問題解決說明 穩定性 由此引申而來的異步任務問題 MCP周…

破解VMware遷移難題

理解VMware遷移的常見挑戰 VMware遷移過程中可能遇到的難題包括兼容性問題、性能瓶頸、數據完整性風險以及網絡配置復雜性。識別這些問題是制定有效遷移策略的基礎。 評估當前環境與目標環境 詳細分析源VMware環境的配置、虛擬機數量、存儲類型和網絡拓撲。對比目標環境的硬件和…

15-STM32F103RCT6的FLASH寫入

STM32F103RCT6的FLASH寫入 1.//*******************************固件升級地址信息******************************// #define STM32_FLASH_BASE 0x08000000 //固件起始地址 #define FLASH_APP_ADDR 0x08005000 //APP開始地址 #define FLASH_PARA_ADDR 0x0803C000 //固件關…

PPO:近端策略優化算法

溫馨提示&#xff1a; 本篇文章已同步至"AI專題精講" PPO&#xff1a;近端策略優化算法 摘要 我們提出了一類新的用于強化學習的 policy gradient 方法&#xff0c;該方法在與環境交互以采樣數據和使用隨機梯度上升優化一個“代理”目標函數之間交替進行。與標準的…

數據結構的算法分析與線性表<1>

一、算法分析&#xff1a; 由于語句執行一次的實際所需時間與機器的軟硬件有關&#xff0c;則算法分析是針對語句執行次數&#xff0c;而非執行時間。 時間復雜度 計算時間復雜度&#xff1a; 常量階 如果算法中的n是固定的&#xff0c;或者說n是常數&#xff0c;或者時間復雜…

esp32使用ESP-IDF在Linux下的升級步驟,和遇到的坑Traceback (most recent call last):,及解決

因為之前使用的是ESP-IDF5.3版本。而5.3版本又不支持ESP32P4。而V5.4版本開始正式對P4的支持。所以我把ESP-IDF 升級到V5.4.2的release版本。 一、升級版本&#xff1a;【根據樂鑫官方的方式升級】ESP-IDF 版本簡介 - ESP32-P4 - — ESP-IDF 編程指南 v5.4.2 文檔 更新至一個穩…

【算法】貪心算法:最大數C++

文章目錄前言題目解析算法原理字典序代碼示例策略證明前言 題目的鏈接&#xff0c;大家可以先試著去做一下再來看一下思路。179. 最大數 - 力扣&#xff08;LeetCode&#xff09; 題目解析 還是老樣子&#xff0c;把題目讀懂&#xff0c;畫出有用信息。 認真看示例&#xff0…

網絡安全職業指南:探索網絡安全領域的各種角色

本文旨在為對網絡安全領域感興趣的粉絲讀者提供一份全面的職業指南。我們將探討網絡安全領域中各種不同的職業角色&#xff0c;包括其職責、所需技能以及職業發展路徑&#xff0c;幫助你了解網絡安全領域的職業選擇&#xff0c;并為你的職業規劃提供參考。網絡安全職業概覽 身處…

Design Vision:顯示扇入/扇出邏輯

相關閱讀 Design Visionhttps://blog.csdn.net/weixin_45791458/category_13006970.html?spm1001.2014.3001.5482 在使用Design Vision中查看示意圖時&#xff0c;可以在示意圖中查看所選單元(Cell)、引腳(Pin)、端口(Port)或線網(Net)的扇入/扇出邏輯。用戶可以在當前激活的…

13.7 Meta LLaMA2-Chat核心技術突破:三重強化學習實現91.4%安全評分,超越ChatGPT的對話模型架構全解析

Meta LLaMA2-Chat核心技術突破:三重強化學習實現91.4%安全評分,超越ChatGPT的對話模型架構全解析 指令微調模型:LLaMA2-Chat 技術深度解析 LLaMA2-Chat 作為 Meta 推出的對話優化大模型,其技術實現展現了大模型對齊(Alignment)領域的前沿突破。與基礎版 LLaMA2 相比,該…

二維仿射變換筆記

二維仿射變換筆記 1. 數學基礎 1.1 變換矩陣 二維仿射變換使用3x3的齊次坐標矩陣表示: [a b tx] [c d ty] [0 0 1 ]其中: [a b; c d] 是線性變換部分,表示旋轉、縮放和錯切[tx; ty] 是平移部分最后一行 [0 0 1] 是齊次坐標的固定形式1.2 基本變換 1.2.1 平移變換 將點…