1. 程式人生 > >安卓和 java 學習筆記

安卓和 java 學習筆記

點擊 進行 sha ring text div -a 變量 tco

1、訪問權限為 private 的成員變量或方法,需要執行setAccessible() 方法,並將入口參數設置為 true; 否則不允許訪問。

2、為了保證線程的安全,可以使用同步塊 synchronized 關鍵字。還有一種是定義同步的方法,同步方法前面有 synchronized。

// 1
synchronized
(Object){ ...// } // 2 public 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:xyz
android: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 學習筆記