標籤:接受 多個 應用 技術 github restart 可靠性 變數 單例模式
1、存取權限為 private 的成員變數或方法,需要執行setAccessible() 方法,並將入口參數設定為 true; 否則不允許訪問。
2、為了保證線程的安全,可以使用同步塊 synchronized 關鍵字。還有一種是定義同步的方法,同步方法前面有 synchronized。
// 1
synchronized(Object){ ...//}// 2public synchronized void doit(){ // 將共用資源操作放置在這裡}
3、關於 try catch finaly 的
先看下面這個程式:
protected boolean fina11(){ try{ Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show(); return true; }catch (Exception e){ }finally { Toast.makeText(this, "finally", Toast.LENGTH_SHORT).show(); } return false; }
運行後執行的結果為 "You clicked Add", "finally" ,傳回值 是true;不是false; 如果把 return true 給注釋掉;那麼就會返回 false;
4、可在 widegt 中發送 intent 給服務端,服務端註冊接受即可,但是發送給activity 的話有點困難。
5、正常情況下requestWindowFeature(Window.FEATURE_NO_TITLE)是可以生效的,但是當Activity繼承子AppCompatActivity的時候,這個就失效了
第一種解決辦法,添加紅色代碼,注意要放在最後:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); if (getSupportActionBar() != null){ getSupportActionBar().hide(); } }
第二種解決辦法,添加紅色代碼,注意代碼順序,放中間,其他位置都不可以:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); }
6、關於給 recycleView 添加 點擊事件的實現:
首先我們給其實現了 implements View.OnClickListener ;然後重寫了 onClick 事件。 在 onclick中我們把 對 介面 OnItemClickListener 中的方法 onItemClick 進行了調用。從而實現了點擊 item 事件。具體代碼參見 https://github.com/huanshen/Learn-Android/tree/master/recycleTest。下載編譯運行即可。
其實簡單來說 只要實現 implements View.OnClickListener ,點擊之後就會調用 onClick 方法,但是因為是全域相應的,而不是 一個 item, 所以我們就重新寫了一個介面,並定義了一個 onItemClick 方法。
7、String.valueOf 和 .toString 方法
首先我們看 String.valueOf 的源碼:
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString();}
可以發現, String.valueOf 的實現其實也是調用了 .toString 的方法,只不過,它還對資料為空白的情況進行了處理。返回 “null”。
8、在實際應用情境中,假設A Activity位於棧頂,此時使用者操作,從A Activity跳轉到B Activity。那麼對AB來說,具體會回調哪些生命週期中的方法呢?回調方法的具體回調順序又是怎麼樣的呢?
開始時,A被執行個體化,執行的回調有A:onCreate -> A:onStart -> A:onResume。
當使用者點擊A中按鈕來到B時,假設B全部遮擋住了A,將依次執行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。
此時如果點擊Back鍵,將依次執行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。
至此,Activity棧中只有A。在Android中,有兩個按鍵在影響Activity生命週期這塊需要格外區分下,即Back鍵和Home鍵。我們先直接看下實驗結果:
此時如果按下Back鍵,系統返回到案頭,並依次執行A:onPause -> A:onStop -> A:onDestroy。
此時如果按下Home鍵(非長按),系統返回到案頭,並依次執行A:onPause -> A:onStop。由此可見,Back鍵和Home鍵主要區別在於是否會執行onDestroy。
此時如果長按Home鍵,不同手機可能彈出不同內容,Activity生命週期未發生變化(由小米2s測的,不知道其他手機是否會對Activity生命週期有影響)。
9、IPC 通訊方式的優缺點和適用情境
10、Android中的多進程模式
(1) 通過給四大組件指定 android:process
屬性就可以開啟多進程模式,預設進程的進程名是包名 packageName,進程名以 : 開頭的進程屬於當前應用的私人進程,其他應用的組件不可以和它跑在同一個進程中,而進程名不以:
開頭的進程屬於全域進程,其他應用通過 ShareUID
方法可以和它跑在同一個進程中。
android:process=":xyz" //進程名是 packageName:xyzandroid:process="aaa.bbb.ccc" //進程名是 aaa.bbb.ccc
(2) Android系統會為每個應用程式指派一個唯一的 UID,具有相同 UID 的應用才能共用資料。兩個應用通過ShareUID跑在同一個進程中是有要求的,需要這兩個應用有相同的 ShareUID並且簽名相同才可以。 在這種情況下,它們可以相互訪問對方的私人資料,比如 data 目錄、組件資訊等,不管它們是否跑在同一個進程中。如果它們跑在同一個進程中,還可以共用記憶體資料,它們看起來就像是一個應用的兩個部分。
(3) android 系統會為每個進程分配一個獨立的虛擬機器,不同的虛擬機器在記憶體配置上有不同的地址空間,所以不同的虛擬機器中訪問同一個類的對象會產生多個副本。
(4) 使用多線程容易造成以下幾個問題:
1. 靜態成員和單例模式完全失效;
2. 線程同步機制完全失效:無論鎖對象還是鎖全域對象都無法保證線程同步;
3. SharedPreferences
的可靠性下降:SharedPreferences 不支援並發讀寫;
4. Application 會多次建立:當一個組件跑在一個新的進程的時候,系統要在建立新的進程的同時分配獨立的虛擬機器,應用會重新啟動一次,也就會建立新的 Application。運行在同一個進程中的組件是屬於同一個虛擬機器和同一個 Application。
同一個應用的不同組件,如果它們運行在不同進程中,那麼和它們分別屬於兩個應用沒有本質區別。
安卓和 java 學習筆記