Java 8+Android M新特性總結(簡略版)

f627 9年前發布 | 79K 次閱讀 Java 8 Java開發

這次把這兩個主題放在一起寫下。雖然 Java 8出來已經有很長一段時間了,而 Android M還只有幾周時間,但是前者的很多特性也許很多 Android 程序員都不了解或是沒有使用過,所以姑且都算新東西了。

再插一句:作為程序員去了解自己所專研平臺或語言的最新趨勢是很重要的,所以也為我這么晚才去關注 Java 8的新特性而感到一點慚愧(囧)。

</blockquote>

Java 8新特性

一、接口的默認方法

J8允許為接口提供一個默認的實現方法,只用在方法前加上default關鍵字即可將其作為完整的方法實現:

interface Formula {
    double calculate(int a);

default double sqrt(int a) {
    return Math.sqrt(a);
}

}</pre>

第二個方法sqrt()即為默認方法,任何實現了該接口的類都可以直接繼承此方法并調用。

二、Lambda表達式

首先可以看一下 Lamda表達式百度百科的介紹,簡單說來 Lambda表達式就是一個匿名函數,可以用于簡化代碼,在許多語言中都有它的實現(比如 Python、C#)。

Java 8中終于支持了Lambda表達式也算是很大的進步,因為這個改進帶來的影響是顯而易見的。提到匿名函數,就很容易想到匿名內部類,這就是Lambda表達式可以應用的一個場景。

EG:

// 1.1使用匿名內部類
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Hello world !");
}
}).start();

// 1.2使用 lambda expression
new Thread(() -> System.out.println("Hello world !")).start();

// 2.1使用匿名內部類
Runnable race1 = new Runnable() {
@Override
public void run() {
System.out.println("Hello world !");
}
};

// 2.2使用 lambda expression
Runnable race2 = () -> System.out.println("Hello world !");</pre>

當然其實這也只能算是一個語法糖,給人的感覺牛逼一點。事實上Android Studio 中很早就開始把寫好的匿名內部類優化成Lambda表達式來簡化代碼了。

Lambda表達式基本格式:

(參數/空)->表達式與返回值

EG:

// 1. 不需要參數,返回值為 5
() -> 5

// 2. 接收一個參數(數字類型),返回其2倍的值 x -> 2 * x

// 3. 接受2個參數(數字),并返回他們的差值 (x, y) -> x – y

// 4. 接收2個int型整數,返回他們的和 (int x, int y) -> x + y

// 5. 接受一個 string 對象,并在控制臺打印,不返回任何值(看起來像是返回void) (String s) -> System.out.print(s)</pre>

三、函數式編程

有關這個話題我暫時不談,因為自己對函數式也沒多少了解(囧)。還是等我也學一門函數式語言之后再回來填這個坑。

可以看一下這幾個鏈接:

淺談Java 8的函數式編程

Java函數式編程教程

四、多重注解

Java 8中支持多重注解了,先看個例子來理解一下是什么意思。
首先定義一個包裝類Hints注解用來放置一組具體的Hint注解:

<pre>@interface Hints { Hint[] value(); }

@Repeatable(Hints.class) @interface Hint { String value(); }</pre>

Java 8允許我們把同一個類型的注解使用多次,只需要給該注解標注一下@Repeatable即可。

例 1: 使用包裝類當容器來存多個注解(老方法)

<pre>@Hints({@Hint("hint1"), @Hint("hint2")}) class Person {}</pre>

例 2:使用多重注解(新方法)

<pre>@Hint("hint1") @Hint("hint2") class Person {}</pre>

五、方法與構造函數引用

這也算是支持函數式編程所引入的一個功能,現在我們可以把方法作為參數來傳遞了。

Java 8 允許使用::關鍵字來傳遞方法或者構造函數引用,下面的代碼展示了如何引用一個靜態方法和一個對象的方法:

Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);   // 123

converter = something::startsWith; String converted = converter.convert("Java"); System.out.println(converted); // "J"</pre>

這里的Converter是一個函數式接口,在聲明時需要加上@FunctionalInterface注解。

另外 Java 8也新增了許多內建的函數式接口,并對Date類的 API 進行了許多更新,這些不在這里詳述。

有關更加詳細的 Java 8新特性可以看這里

Android M新特性/API

一、新特性

1.運行時權限管理

這個功能與iOS上彈出對話框向用戶請求權限的方式類似,所有權限都可以在運行時請求,并可以由用戶在設置里面自行開啟/關閉權限開關(不過預覽版里顯示的權限種類只有7種,許多權限歸在一個大類)。

開發者可以在M的 SDK 構建的 app里使用Context.checkSelfPermission()檢查有無獲取到權限以及通過Activity.requestPermission()方法請求權限。對于開發者帶來的相應改變就是:現在需要根據有無獲取到權限寫兩套邏輯,當然一般未獲取到權限的邏輯也相對簡單。

另外有一個需要注意的是,這種運行時權限管理的功能只有在 M 之后的 SDK 構建的應用才有效,之前的 SDK 構建的依然是在安裝時詢問權限并默認全部允許,自己在設置里關閉權限有可能會引起 app 崩潰。

2.app link

這個功能的目的是減少用戶點擊鏈接后因為有多個 app 具有相應intent-filter而彈出選擇啟動相應 app 對話框的情景。

現在開發者可以將一個web域名 與自家 app 綁定,比如在瀏覽器里點擊 非死book 域名時會直接打開 非死book 官方app 不會有第三方客戶端的機會。

有關怎么實現 app link可以看這里的中文教程

3.doze 模式

doze 模式的引入算是一種學習iOS電源管理方式的省電功能。根據官方文檔描述,基本功能是:

當手機沒有連接電源、屏幕關閉、并處于靜止狀態(放在口袋里走路就不行)一段時間后(一小時左右)會啟動此模式,在doze模式下會有以下影響:

  1. app網絡連接會被停用, 只有使用具有高優先級比如 GCM網絡連接的 app 可以正常工作;

    </li>

  2. wakelock 會被忽略;

    </li>

  3. 使用 AlarmManager設定的定時任務會被忽略,除非是使用setAlarmClock()和AlarmManager.setAndAllowWhileIdle()方法設定;

    </li>

  4. 同步和 JobScheduler 會停止工作;

    </li>

  5. wifi掃描會停止工作;

    </li> </ol> </blockquote>

    在 doze 模式下,國產 app理論上是無法向用戶推送消息的(GCM 在國內是不存在的),應該說Google 這種舉動是在有意強推 GCM,在 GCM 已經發展得足夠穩定可靠的時候本是好事,奈何國內互聯網環境如此奇葩,所以對國內用戶并沒有什么卵用。

    而且現在已經找到了從 .so層繞過 doze模式限制的方法,雖然不知道等 M 正式版的時候這個應該算 Bug的東西會不會被修復。總之現在看來這個原本很贊的省電功能對國內用戶來說真是雞肋了。

    PS:在設置中可以設置白名單使一些 app 不受 doze 模式影響。

    4.app standby

    這個功能是 M 致力于省電的另一個表現,具體特性是:
    當 app 被認為處于閑置狀態時停用它的同步功能與網絡連接直到手機連接電源或恢復正常狀態。當 app 處于后臺不使用一段時間后就會進入閑置狀態,除非系統收到以下信號:

    1. 用戶重新啟動 app;
    2. app 具有前臺 activity 或 service 在運行;
    3. app 具有仍在顯示的 Notification;
    4. 用戶在設置里設置不對該 app 進行 app standby 優化;
    5. </ol>

      這個功能有點自帶綠色守護的意思。

      5.APK 驗證

      現在系統會進行更嚴格的 APK 驗證,當檢查到在Manifest里聲明的文件在 APK 中并不存在時,則認為此 APK不合法,需要重新生成簽名。

      6.文本選擇

      在用戶選擇一段文本時,開發者可以設置一個彈出對話框讓用戶更方便的執行文字編輯操作:

      7.其他功能

      全平臺數據自動備份、通過Audio manager設置聲音不再支持、指紋識別、相機服務改變、ART bug修復

      Android M新特性官方文檔

      二、新 API及開發工具

      1.八個新組件(Material design 風格并且向后兼容)



      新控件
      </div>
      AppBarLayout:一個垂直方向的LinearLayout,可以在其中放ToolBar配合TabLayout構成Material design下典型的 AppBar(比如 Play store那種) ;

      NavigationView:這個應該很熟悉了,就是那個根據導航不同做出好看動畫的左上角導航圖標,現在不需要使用第三方庫了,原生支持并向后兼容;

      FloatingActionButton:又一個典型的 MD 控件;

      TabLayout:原生實現的頂部 Tab;

      SnackBar:官方建議替代 Toast 的一種控件;



      snackbar
      </div>

      CoordinatorLayout:更加強大的FrameLayout,通過配合 FAB 等控件使用,可以方便的實現 MD 下一些滑動后動態改變界面布局的效果,方便實現不同控件間層級合理顯示;

      Collapsing Toolbars:實現 MD 式滑動隱藏 Tab 效果的輔助 Layout;

      TextInputLayout:類似這個輸入效果的 Layout;

      2.SVG 支持


      svg.jpg
      </div>

      現在可以在 Android studio 中使用 SVG 資源了,實現一些復雜動畫又有了新的方法。

      3.C/C++與 NDK支持

      AS 中直接集成了 JetBrains 家的 Clion,進行 C/C++開發更為方便。另外這個 Clion特別為 Android開發進行了優化,可以自動生成JNI 方法名。

      4.Data binding

      現在可以通過在XML文件中進行 Data binding,只需要在當前app模塊添加如下依賴:

      dependencies {
         classpath "com.android.tools.build:gradle:1.3.0-beta1"
         classpath "com.android.databinding:dataBinder:1.0-rc0"
         }
          }

      就可以在布局文件中寫下與業務邏輯、數據綁定的代碼。
      這個特性使得在 Android 開發中實現 MVVM 更為方便(之前有一個開源庫 Android binding就是致力于實現 MVVM),有關這個問題我過兩天再單獨寫一篇博客討論。
      5.語音API

      現在有了可以在第三方app里配合語音輸入使用的 API,用戶可以通過語音輸入與 app 進行交互。(前提是使用 Google voice input

      6.Assist API

      這個新 API 是為了將開發者開發 app 中的內容暴露給Google now分析,使用戶能夠通過長按 Home呼出 Google now動態分析 app內容給出搜索結果或者推送相關內容,app 也可以通過此行為進行交互。

      7.direct share


      direct-share-screen_2x.png
      </div>

      可以直接指定分享方式(郵件、短信、FB)來對特定目標(比如聯系人 app 中聯系人)進行分享

      8.Notification API

      9.其他
      4K顯示模式、相機 API 更新、音視頻API

      參考

      Android M新 API 官方文檔

      Google I/O 2015 為 Android 開發者帶來了哪些福利?

      來自:http://www.jianshu.com/p/8c11262fcb41

       本文由用戶 f627 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
       轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
       本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!