Java 8+Android M新特性总结(简略版)

这次把这两个主题放在一起写下。虽然 Java 8出来已经有很长一段时间了,而 Android M还只有几周时间,但是前者的很多特性也许很多 Android 程序员都不了解或是没有使用过,所以姑且都算新东西了。

再插一句:作为程序员去了解自己所专研平台或语言的最新趋势是很重要的,所以也为我这么晚才去关注 Java 8的新特性而感到一点惭愧(囧)。

Java 8新特性

一、接口的默认方法

J8允许为接口提供一个默认的实现方法,只用在方法前加上default关键字即可将其作为完整的方法实现:

interface Formula {
    double calculate(int a);

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

第二个方法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 !");  

当然其实这也只能算是一个语法糖,给人的感觉牛逼一点。事实上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)

三、函数式编程

有关这个话题我暂时不谈,因为自己对函数式也没多少了解(囧)。还是等我也学一门函数式语言之后再回来填这个坑。

可以看一下这几个链接:

浅谈Java 8的函数式编程

Java函数式编程教程

四、多重注解

Java 8中支持多重注解了,先看个例子来理解一下是什么意思。
首先定义一个包装类Hints注解用来放置一组具体的Hint注解:

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

@Repeatable(Hints.class)
@interface Hint {
    String value();
}

Java 8允许我们把同一个类型的注解使用多次,只需要给该注解标注一下@Repeatable即可。

例 1: 使用包装类当容器来存多个注解(老方法)

@Hints({@Hint("hint1"), @Hint("hint2")})
class Person {}

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

@Hint("hint1")
@Hint("hint2")
class Person {}

五、方法与构造函数引用

这也算是支持函数式编程所引入的一个功能,现在我们可以把方法作为参数来传递了。

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"

这里的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 绑定,比如在浏览器里点击 facebook 域名时会直接打开** Facebook 官方app** 不会有第三方客户端的机会。

有关怎么实现** app link**可以看这里的中文教程

3.doze 模式

doze 模式的引入算是一种学习iOS电源管理方式的省电功能。根据官方文档描述,基本功能是:

当手机没有连接电源、屏幕关闭、并处于静止状态(放在口袋里走路就不行)一段时间后(一小时左右)会启动此模式,在doze模式下会有以下影响:

  1. app网络连接会被停用, 只有使用具有高优先级比如 GCM网络连接的 app 可以正常工作;

  2. wakelock 会被忽略;

  3. 使用 AlarmManager设定的定时任务会被忽略,除非是使用setAlarmClock()和AlarmManager.setAndAllowWhileIdle()方法设定;

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

  5. wifi扫描会停止工作;

在 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.APK 验证

现在系统会进行更严格的 APK 验证,当检查到在 Manifest 里声明的文件在 APK 中并不存在时,则认为此 APK不合法,需要重新生成签名。

** 6.文本选择**

在用户选择一段文本时,开发者可以设置一个弹出对话框让用户更方便的执行文字编辑操作:

7.其他功能

全平台数据自动备份、通过Audio manager设置声音不再支持、指纹识别、相机服务改变、ART bug修复

Android M新特性官方文档

二、新 API及开发工具

1.八个新组件(Material design 风格并且向后兼容)

新控件

AppBarLayout :一个垂直方向的LinearLayout ,可以在其中放ToolBar配合TabLayout构成Material design下典型的 AppBar(比如 Play store那种) ;

NavigationView:这个应该很熟悉了,就是那个根据导航不同做出好看动画的左上角导航图标,现在不需要使用第三方库了,原生支持并向后兼容;

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

TabLayout:原生实现的顶部 Tab;

SnackBar:官方建议替代 Toast 的一种控件;

snackbar

CoordinatorLayout:更加强大的 FrameLayout,通过配合 FAB 等控件使用,可以方便的实现 MD 下一些滑动后动态改变界面布局的效果,方便实现不同控件间层级合理显示;

Collapsing Toolbars:实现 MD 式滑动隐藏 Tab 效果的辅助 Layout;

TextInputLayout:类似这个输入效果的 Layout;

2.SVG 支持

svg.jpg

现在可以在 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

可以直接指定分享方式(邮件、短信、FB)来对特定目标(比如联系人 app 中联系人)进行分享

8.Notification API

9.其他
4K显示模式、相机 API 更新、音视频API

参考

Android M新 API 官方文档

Google I/O 2015 为 Android 开发者带来了哪些福利?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容