Android 小知識點記錄 (一)
Android 8.0 適配
1.通知需要有Channel 很多本來對Notification 的設定,都轉換到了對Channel 設定,8.0之後對通知有所簡化,副文字標題取消顯示,顯示通知時間需要單獨設定 否則預設不顯示時間
2.對於電量消耗的優化,安卓採用對後臺Service進行限制,進入後臺60s 之後,service 會呼叫自身onDestory ,呼叫之後,內部沒有完成的執行緒還會繼續執行(可能產生記憶體洩漏,儘量在onDestory中stopSelf) 但是不能再在Service中startService ,防止服務互相喚醒或者啟動更多的服務消耗電量.
對於之前Service方案,可採用一下兩種替代方案
(1) 採用 startForegroundService(new Intent(getBaseContext(),ServiceTest.class)); 方法,開啟一個前臺Service, 在開啟後的5s後,必須呼叫 startForeground(1, notification); 但目前8.0版本 沒有設定channel 的通知不會被顯示,所以只是對於系統來說,屬於前臺Service,對於使用者來說,不會有其他的表現,估計以後版本,會修復吧.儘量還是按照會在介面展示考慮
(2)採用JobService 代替Service ,JobService Add in Api 21. 用於在一些特定時刻觸發操作,類似於定時任務.內部封裝了方便的監聽網路變化,開機 (之前用廣播監聽在高版本也會失效,也需要用JobService 替代) . 通過setOverrideDeadline 或者setMinimumLatency 設定一個很短的時間,來讓他立即執行,可以起到同普通Service 一樣的效果.
(3) 對於廣播: 隱式廣播(通過Action 啟動的) ,在未指定包名的情況下.無法全域性廣播.
Question
-
OOM 可以被try catch 麼?
OOM 屬於Error 即使發生在try catch 中也會導致程式崩潰
Error(錯誤)是系統中的錯誤,程式設計師是不能改變的和處理的,是在程式編譯時出現的錯誤,只能通過修改程式才能修正。一般是指與虛擬機器相關的問題,如系統崩潰,虛擬機器錯誤,記憶體空間不足,方法呼叫棧溢等。對於這類錯誤的導致的應用程式中斷,僅靠程式本身無法恢復和和預防,遇到這樣的錯誤,建議讓程式終止。 常見 OutofMemoryError StackOverflowError
Exception(異常)表示程式可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該儘可能處理異常,使程式恢復執行,而不應該隨意終止異常。常見 NullPointerException IllegalArgumentException
2.關於try catch final 執行順序問題:
* java面試題20--如果catch裡面有return語句,finally裡面的程式碼還會執行嗎? */ public class FinallyDemo2 { public static void main(String[] args) { System.out.println(getInt()); } public static int getInt() { int a = 10; try { System.out.println(a / 0); a = 20; } catch (ArithmeticException e) { a = 30; return a; /* * return a 在程式執行到這一步的時候,這裡不是return a 而是 return 30;這個返回路徑就形成了 * 但是呢,它發現後面還有finally,所以繼續執行finally的內容,a=40 * 再次回到以前的路徑,繼續走return 30,形成返回路徑之後,這裡的a就不是a變量了,而是常量30 */ } finally { a = 40; } //return a; }
package com.java_02; /* * java面試題20--如果catch裡面有return語句,finally裡面的程式碼還會執行嗎? */ public class FinallyDemo2 { public static void main(String[] args) { System.out.println(getInt()); } public static int getInt() { int a = 10; try { System.out.println(a / 0); a = 20; } catch (ArithmeticException e) { a = 30; return a; /* * return a 在程式執行到這一步的時候,這裡不是return a 而是 return 30;這個返回路徑就形成了 * 但是呢,它發現後面還有finally,所以繼續執行finally的內容,a=40 * 再次回到以前的路徑,繼續走return 30,形成返回路徑之後,這裡的a就不是a變量了,而是常量30 */ } finally { a = 40; return a; //如果這樣,就又重新形成了一條返回路徑,由於只能通過1個return返回,所以這裡直接返回40 } //return a; }
結論
1.try 中如果發生異常,catch 會捕獲,如果在如果在catch中return 一個值,虛擬機器會記錄這個值或者這個值的引用,如果在finally 中對這個值修改,引用會影響到返回值,但是int 這種的就不會了.因為會把return 放到最後執行,並且返回的是之前記錄的值,而不是程式碼中看到的值
2.另外,如果在try 中發生異常,沒有catch 語句,只有finally 語句,並且在finally 中return 一個返回值,相當於這次的異常被虛擬機器拋棄,因為函式仍然形成了閉環,導致對於上層來說,相當於函式依然正常執行.
關於十進位制和十六進位制的加法規則

image.png
不難看出,debug 顯示十進位制數值, 會把非十進位制數值轉換成十進位制在進行計算
4.非靜態內部類的初始化方式
public class A{ class B{ } } A a = new A(); A.B b = a.new B(); 非靜態內部類屬於物件,用過物件例項化