zoukankan      html  css  js  c++  java
  • 《第一行代码》读书笔记二

    一:广播

    1:广播接收器的使用步骤

    继承BroadcaseReceiver定义一个类,重写onReceive()方法——注册广播接收器——接受系统广播或其他地方发出的自定义广播并响应

    2:动态注册和静态注册

    广播接收器要注册后才能接受广播并响应,注册的方式有两种:

    动态注册:在activity的onCreate()方法中创建intentfilter,添加action、catagory等过滤条件后,调用registerReceiver(receiver,intentfilter)注册广播接收器;在activity的onDestroy()方法中unregisterReceiver(receiver)注销广播接收器。【动态注册的广播接收器只有在程序activity启动后才被启用,也随着程序的退出而停用】

    静态注册:在AndroidManifest.xml文件中注册广播接收器,并通过intent-filter标签定义过滤条件。【静态注册的广播接收器随着程序的安装而被整个android系统监听】

    3:发送广播

    广播可以来自系统,比如开关机、网络状态变化等系统事件,android都会广播出去,我们可以在程序中监听这些系统广播而作出响应,如:开机自启动、横屏自动全屏、网络状态变化提示等等。【一切android系统自身的变化事件,都可以用对应的广播被我们监听从而作出自定义的响应!另外,日常开发中需要用到的大多都是系统广播

    除了系统广播,我们也可以在程序中发送自定义的广播【一般,自定义的广播用于进行一些跨程序的调用,例如:在微信中启动王者荣耀】。

    发送标准广播:在activity代码中创建intent,设置action等后,sendBroadcast(intent)即可,符合过滤条件的接收器自然会做出响应;【标准广播几乎是异步、同时到达所有广播接收器的】

    发送有序广播:在activity代码中创建intent,设置action等后,sendOrderedBroadcast(intent,null),系统中的广播接收器会根据注册时的优先级或先后顺序依次接受该广播。而在符合过滤条件的广播接收器中,可以在onReceive()方法中响应完毕后通过abortBroadcast()中断广播继续往下传递。

    4:本地广播

     本地广播是只能在程序内部传递的广播,通过LocalBroadcastManager进行广播的注册、发送、注销等。

    使用步骤:

    定义广播接收器类——创建LocalBroadcastManager实例——通过LocalBroadcastManager实例注册广播接收器——通过LocalBroadcastManager实例发送广播——在activity的onDestroy()方法中通过LocalBroadcastManager实例注销广播接收器。

    【本地广播是只能在程序内部传递和响应的,因此其生命周期随同程序,也就是说只能动态注册本地广播接收器

    二:数据持久化

    1:文件存储:用于存储文本文件或二进制文件(多媒体),多用于文件下载、三级缓存等,主要是读写文件流的使用。

    2: sharedpreferences:键值对的形式存储简单数据,多用于配置类信息。注意:这个是全局的,也就是说在一个程序中保存的,其他程序可以通过key来获取对应内容。

    使用步骤:

    存数据:获取sharedpreferences实例——通过sharedpreferences实例.edit()获取editor对象——通过editor.putXX(key,val)添加数据——通过editor.apply()提交数据

    取数据:获取获取sharedpreferences实例——通过sharedpreferences实例.getXX(key)提取对应内容

    3:SQLite:使用LitePal第三方开源ORM库来操作。

    使用方法:定义实体类,实体类要继承自DataSupport——在litepal.xml中注册实体类,映射为表——在代码中通过面向对象的方法操作类实例即可进行增删查改操作

    三:运行时权限

    android6.0新增了运行时权限,程序在运行过程中如果要进行一些涉及用户隐私或者设备安全的操作时,需要用户手动授权才能进行。

    运行时权限主要是一些危险权限,分9组,24个:通讯录、电话、日历、照相机、位置、麦克风、传感器、短信、存储。

    group:android.permission-group.CONTACTS 通讯录方面 
    permission:android.permission.WRITE_CONTACTS 写入通讯录 
    permission:android.permission.GET_ACCOUNTS 访问通讯录权限 
    permission:android.permission.READ_CONTACTS 读取通讯录
    
    group:android.permission-group.PHONE 电话方面 
    permission:android.permission.READ_CALL_LOG 看电话记录 
    permission:android.permission.READ_PHONE_STATE 读取手机状态 
    permission:android.permission.CALL_PHONE 打电话 
    permission:android.permission.WRITE_CALL_LOG 编写调用日志 
    permission:android.permission.USE_SIP 使用SIP 
    permission:android.permission.PROCESS_OUTGOING_CALLS 过程输出调用 permission:com.android.voicemail.permission.ADD_VOICEMAIL 添加语音信箱
    
    group:android.permission-group.CALENDAR 日历 
    permission:android.permission.READ_CALENDAR 读取日历 
    permission:android.permission.WRITE_CALENDAR 写入日历 
    
    group:android.permission-group.CAMERA 照相机 
    permission:android.permission.CAMERA
    
    group:android.permission-group.SENSORS 传感器 
    permission:android.permission.BODY_SENSORS 体传感器
    
    group:android.permission-group.LOCATION 位置 
    permission:android.permission.ACCESS_FINE_LOCATION 获取好位置 
    permission:android.permission.ACCESS_COARSE_LOCATION 
    
    获取粗定位group:android.permission-group.STORAGE 存储 
    permission:android.permission.READ_EXTERNAL_STORAGE 读取外部存储器 permission:android.permission.WRITE_EXTERNAL_STORAGE 写外部存储器
    
    group:android.permission-group.MICROPHONE 扩音器;麦克风 
    permission:android.permission.RECORD_AUDIO 录音
    
    group:android.permission-group.SMS 信息 
    permission:android.permission.READ_SMS 读取信息 
    permission:android.permission.RECEIVE_WAP_PUSH 收到WAP推送 
    permission:android.permission.RECEIVE_MMS 接收彩信 
    permission:android.permission.RECEIVE_SMS 收信息 
    permission:android.permission.SEND_SMS 发信息 

    运行时权限的使用:

    1:注册权限:无论普通权限还说危险权限,都需要先在AndroidManifest.xml中注册;

    2:在程序代码中,申请权限

    if (ContextCompat.checkSelfPermission(活动.this,Manifest.permission.权限名) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(活动.this, new String[]{Manifest.permission.权限名}, 1);
    } else {
            //如果权限已获得,则进行后续操作
    }

    3:重写回调方法,根据用户的授权结果进行相应操作

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //获得授权,则进行后续操作
                } else {
                    //拒绝授权,进行提醒、退出等操作
                }
                break;
            default:
        }
    }

    四:内容提供器

    如果说广播是跨应用间的通信,那么内容提供器就是跨应用间的信息共享,内容提供器可以指定程序中的哪部分数据进行共享,一定程度上保证了数据的安全性(数据持久化用到的方法则是全局的,所有程序都可以访问那些数据)。

    内容提供器的使用主要分两个方面:一是在自己程序中使用内容访问器ContentResolver读写、操作其它程序的数据;二是为自己的程序定义内容提供器ContentProvider,创建数据访问接口。

    1:使用ContentResolver操作其他程序的数据

    通过getContentResolver()获取contentResolver实例——通过contentResolver实例.CRUD(uri,...)进行增删查改操作

    contentResolver实例等增删查改方法中的第一个参数是内容Uri,指明了我们要操作哪个程序的哪张表里面的数据,格式为:authority/path【authority对应ContentProvider注册时的authorities标签值,用于匹配是哪个程序的内容提供器;path则指明是操作哪张表】;其他参数则指明了操作的条件等等。

    2:使用ContentProvider提供自己程序的数据操作接口

    继承ContentProvider定义内容提供器类,重写其中的6个方法,其中4个是增删查改,在4个方法中,根据Uri参数的不同,用switch语句块分别操作不同的表格——然后在AndroidManifest.xml中注册内容提供器,定义好authorities标签,该标签用来标注该内容提供器是属于哪个程序的,一般用包名作值

    五:手机多媒体

    1:通知的使用步骤

    获取NotificationManager实例——通过builder设置通知的标题、内容、图标、点击事件的跳转、自动消失、音效、震动、LED灯闪烁、显示风格(长文本、大图)、重要程度(强制用户看到)等,最后build()方法创建notification实例——通过manager.notify(编号,notification)显示通知。

    其中,点击事件的跳转是通过PendingIntent来定义的:创建一个intent实例,指明了action等过滤条件——用intent作为参数创建pengdingIntent实例。

    2:调用摄像头拍照

    首先创建一个File对象,用于保存等会儿拍照得到的图片——获取这个file对象的Uri地址,用于等会儿拍照时输出保存图片以及拍照完成后读取图片——创建intent,并把上一步得到的uri地址设置给intent作为参数——通过intent启动摄像头——在onActivityResult()回调方法中,根据拍照结果进行后续操作:如果拍照成功,则通过uri地址用contentResolver从摄像机程序中把图片读取出来

    3:播放音频

    使用MediaPlayer播放音频:创建MediaPlayer对象——设置音频文件路径——进入准备状态——开始播放start()——pause()暂停播放——reset()回归起始播放状态——stop()停止播放——release()释放播放资源

    4:播放视频

    可以使用videoView来播放,也可以使用第三方开源库来播放。

  • 相关阅读:
    QQ分享 QQ空间分享 API链接:
    一起谈.NET技术,C# 中奇妙的函数联接序列的五种简单方法 狼人:
    一起谈.NET技术,.NET简谈面向接口编程 狼人:
    一起谈.NET技术,用C#实现HTTP协议下的多线程文件传输 狼人:
    一起谈.NET技术,改善代码设计 —— 简化函数调用(Making Method Calls Simpler) 狼人:
    一起谈.NET技术,改善代码设计 —— 处理概括关系(Dealing with Generalization) 狼人:
    一起谈.NET技术,页面片段缓存(二) 狼人:
    一起谈.NET技术,改善代码设计 —— 简化条件表达式(Simplifying Conditional Expressions) 狼人:
    一起谈.NET技术,回顾.NET Remoting分布式开发 狼人:
    一起谈.NET技术,改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects) 狼人:
  • 原文地址:https://www.cnblogs.com/ygj0930/p/7637401.html
Copyright © 2011-2022 走看看