安卓系统源码--DeskClock源码解析(一)Direct Boot Mode

   说实话,我是第一次看源码,写在博客里,权当作笔记。望有缘人看见不喜勿喷,谢谢!

   为什么选择系统闹钟,我是希望这块代码对我作做APP保活有一定帮助。众所周知,只要你定义了一个确切的时间,闹钟就会按照你设定的时间准时响起。哪怕是间隔每天,它也不会偷懒。就算最终跟我的设想大相径庭,我也学到了很多编码知识

   源码来自于 http://androidxref.com/8.0.0_r4/xref/ 

--------------------------------------------------------------------------------------

  DeskClockApplication.java

     如果你想判断你的安卓手机版本是不是安卓7.0(包含7.0)以后的版本,可如此使用。

public static boolean isNOrLater() {
    return BuildCompat.isAtLeastN();
}

public class BuildCompat {
    private BuildCompat() {
    }

    /**
     * Check if the device is running on the Android N release or newer.
     *
     * @return {@code true} if N APIs are available for use
     */
    public static boolean isAtLeastN() {
        return VERSION.SDK_INT >= 24;
    }     

   

@TargetApi(Build.VERSION_CODES.N)
private static SharedPreferences getDefaultSharedPreferences(Context context) {
    final Context storageContext;
    if (Utils.isNOrLater()) {
        // All N devices have split storage areas. Migrate the existing preferences into the new
        // device encrypted storage area if that has not yet occurred.
        final String name = PreferenceManager.getDefaultSharedPreferencesName(context);
        storageContext = context.createDeviceProtectedStorageContext();
        if (!storageContext.moveSharedPreferencesFrom(context, name)) {
            LogUtils.wtf("Failed to migrate shared preferences");
        }
    } else {
        storageContext = context;
    }
    return PreferenceManager.getDefaultSharedPreferences(storageContext);
}
    下面这段内容来自于:http://blog.csdn.net/huluboy/article/details/53397582      

  Android N引入了一个新特性: Direct Boot Mode—— 设备启动后进入的一个新模式,直到用户解锁(unlock)设备此阶段结束。在此 Direct Boot Mode 下 APP 比较适合做一些:

  • Alarm、clock 类的操作,如闹钟
  • 需要做重要的或紧急的通知,如短信应用
  • 底层服务类,如辅助工具服务  

数据存储:

使用设备保护存储区为了支持应用在用户提供解锁私有应用数据所需的凭据之前的正常运行,所有 Android N 设备现在均提供两个数据存储位置:
  • credential encrypted storage]凭据保护存储区,这是所有应用的默认存储位置,仅在用户解锁设备后可用

  • device encrypted storage]设备保护存储区,这是一个新的存储位置,当设备启动后(包括直接启动期间)随时都可访问该位置


应用中被标记为支持直接启动的组件必须使用设备保护存储区来存储直接启动模式期间应用操作所需的任何数据。在用户解锁设备后,用户仍可访问凭据保护存储区。


要访问设备保护存储区,您需要为所有文件相关的 API 另外创建并使用一个 Context 对象:

  1. Context deviceProtectedContext = context.createDeviceProtectedStorageContext();  

  2. deviceProtectedContext.openFileInput( ... )  

当您的应用更新到支持直接启动的版本之后,您之前保存的共享首选项或数据库可能需要迁移到设备保护存储区。在访问该存储区之前,即使数据已从旧版本或其他设备中备份并恢复,您仍应使用 Context.moveSharedPreferencesFrom() 和 Context.moveDatabaseFrom(),以确保应用能够继续正常运行。

注意事项:

1.您应审慎考虑要在设备保护存储区中存储哪些数据。应尽量减少在设备保护存储区中存储的数据,以确保您的应用在直接启动期间正常运行为限。例如,在短信应用中,您可以存储一个访问令牌,其作用域仅限于能够访问服务器上的新消息数量。所有敏感的私人信息(例如完整的短信历史记录和读/写访问令牌)仍应保存在凭据保护存储区中。

2.另外需要提醒的一点是:在直接启动期间,应用只能访问其他支持直接启动的应用和组件。如果您的应用依赖外部服务和 Activity,请确保妥善处理外部服务和 Activity 不可用的情形。默认情况下,Intent 过滤器仅匹配当前用户状态(已锁定/已解锁)下可用的组件。现在有两个新的标志,可用于向 Package Manager 显式声明需要枚举哪些组件:PackageManager.MATCH_DIRECT_BOOT_AWARE 和 PackageManager.MATCH_DIRECT_BOOT_UNAWARE。

3.DBM模式下的APP只能和同在此模式中的APP通信。


   

   

   

你可能感兴趣的:(安卓开发)