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 一个返回值,相当于这次的异常被虚拟机抛弃,因为函数仍然形成了闭环,导致对于上层来说,相当于函数依然正常执行.

关于十进制和十六进制的加法规则

《Android 小知识点记录 (一)》 image.png

不难看出,debug 显示十进制数值, 会把非十进制数值转换成十进制在进行计算

4.非静态内部类的初始化方式

    public class A{
         class B{
        }
    }
    A a = new A();
    A.B b = a.new B();
非静态内部类属于对象,用过对象实例化

    原文作者:fushuang
    原文地址: https://www.jianshu.com/p/510c380b9ed3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞