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

  1. 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 一個返回值,相當於這次的異常被虛擬機拋棄,因爲函數仍然形成了閉環,導致對於上層來說,相當於函數依然正常執行.

關於十進制和十六進制的加法規則



不難看出,debug 顯示十進制數值, 會把非十進制數值轉換成十進制在進行計算

4.非靜態內部類的初始化方式

    public class A{
         class B{
        }
    }
    A a = new A();
    A.B b = a.new B();
非靜態內部類屬於對象,用過對象實例化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章