上篇文章已经介绍了如何使用SharedPreferences存储键值对形式的轻量级数据,对于那些相同结构的多组数据,类似于存储Java中定义的类的多个对象属性值,如果按照键值对的形式一条条读写,需要分别定义每条数据对应的key值,是相当繁琐的.而如果可以使用数据库保存就会方便很多. 正因此,Android系统提供了对SQLite数据库的支持,在应用中创建的数据库,默认也是保存在应用程序的内部存储空间中的,这样也只有当前应用程序内部可以访问其数据库中数据. 使用纯粹的SQLiteDatabase类…
在应用程序间及与用户的通信交互过程中,会产生并传递一系列数据.针对这些数据,有部分是只在应用程序中使用的缓存数据,还有一部分是在不同位置多次或长时间使用的持久化数据. 对于缓存数据来说,通常以代码中定义局部变量或全局变量的方式访问使用,这种使用方式伴随在编程的整个过程中:而持久化数据,则需要以特定的文件格式保存在系统硬盘中,使用系统提供的框架方法来访问使用.而根据要持久化保存数据的复杂程度不同,分别有轻量级SharedPreferences,数据库SQLiteOpenHelper或其封装的Roo…
上回说到应用初始化加载及其生命周期,在Android系统调用Applicaiton.onCreate()之后,继续创建并加载清单文件中注册的首个界面即主Activity,也可称之为入口界面.主Activity的确定规则在Android系统编程入门系列之清单文件有介绍,本文主要介绍Android系统创建Activity之后的生命周期流程. 在清单文件中所注册的界面均为自定义Activity,其父类往上追溯,必须继承自android.content.Activity. 生命周期 Activity作为…
    作为移动端操作系统,目前最新的Android 11.0已经发展的比较完善了,现在也到了系统的整理一番的时间,接下来的系列文章将以Android开发者为中心,争取用归纳总结的态度对初级入门者所应掌握的基础知识聊以标记. 应用环境     Android系统是Google基于Linux系统开发的一套移动系统,不仅应用于手机,还有穿戴设备,TV大屏设备等多种移动场景,其优势是使得硬件具有人性化的界面(Activity),并行的服务(Service),高效的数据存储(ContentProvide…
上篇文章介绍了界面Activity的启动方式和生命周期,本篇将继续介绍在界面Activity中的内容是如何绘制展示给用户的. 在Android系统上运行新创建的界面Activtiy,给用户展示的是空白的.而得益于AndroidStudio的强大模板支持,新创建的界面Activity会自动重写onCreate()方法,并在该方法内自动创建以下两行类似默认代码. super.onCreate(savedInstanceState) setContentView(R.layout.xxx) 显然,se…
在上篇文章中已经了解到界面Activity的绘制完全依赖其加载的视图组件View,不仅如此,用户的每次触摸操作都可以在界面Activity内接收并响应,也可以直接传递给其中的某个视图View响应.本文将针对这两种用户交互方式分别展开介绍. 界面内交互 界面响应 说到界面交互,很容易想到用户在设备屏幕上的触摸操作.可是屏幕那么大要怎么确定用户触摸的位置呢?Android系统定义了一套屏幕坐标规则,该规则不仅适用于当前的屏幕交互,在后文提及的动画绘制及其他屏幕相关操作等都同样适用.该规则将屏幕的左上…
上篇文章介绍了应用程序内对用户操作响应的相关方法位置,简单的响应逻辑可以是从一个界面Activity跳转到另一个界面Activity,也可以是某些视图View的相对变化.然而不管是启动一个界面执行新界面Activity的生命周期方法,还是视图的相对变化,都需要一段时间,所以在响应的最终结果完成之前是有一段空白时间的.而在这段或长或短的时间里,该怎么给用户展示界面呢?这就用到Android系统推荐的动画流程了. 广义上说,Android系统在屏幕上绘制展示给用户的内容发生变化时,都可以使用相关动画…
在响应丝滑动画一篇文章中,分别介绍了作用于普通视图.绘制视图的绘制对象.和界面这三种对象的动画效果,但是都有一些使用的局限性.比如这些动画都只是以屏幕上绘制更新的方式绘制动画,并没有真实改变作用对象的实际位置或属性,这种问题在视图动画中尤为明显,在没有特别设置时,动画结束后的视图状态会还原到动画前,也就是说动画中及动画后的视图对象是没有保存动画中用到的一些属性的.这种情况就需要使用本文所介绍的属性动画了. 属性动画本质是对某个对象的属性提供一组变化更新的属性值,他的作用对象不仅可以是视图和界面,…
之前几篇文章简单梳理了在Android系统的四大组件之一,最主要的界面Activity中,使应用程序与用户进行交互响应的相关知识点,那对于应用程序中不需要与用户交互的逻辑,又要用到哪些内容呢?本文开始将介绍应用程序无需界面交互的内部交互相关知识点,首先从另外一个四大组件之一的服务Service开始. 在清单文件一文的组件声明中,已经知道服务Service与界面Activity一样,都要在清单文件中注册声明.同样的,每个注册声明的服务Service类向上追溯都必须继承自android.app.Se…
在上篇文章中初步了解了Android系统的四大组件之一的服务Service,在服务内可以执行无用户交互的耗时操作任务,但是包括之前关于界面系列文章在内,生命周期方法都是在主线程内被系统回调的.如果直接在生命周期方法中执行耗时操作,同样可能会在主线程5s内无响应而触发系统对应用程序的ANR异常.为了解决这个问题,就需要使用多线程开发来执行耗时任务,在任务执行结束后将结果返回到主线程中响应. 什么是线程呢?每个应用程序在初始化时,默认运行在以其包名命名的进程中,同一进程中的内存是可以共享使用的.而每…
在前边几篇关于Android系统两个重要组件的介绍中,界面Activity负责应用程序与用户的交互,服务Service负责应用程序内部线程间的交互或两个应用程序进程之间的数据交互.看上去这两大组件就能满足日常应用程序的开发需求了,可是应用程序之间的交互,如果都使用服务Service中的AIDL规范,那每个应用程序本身岂不是要声明其他应用程序中的一些接口?这对两个属于不同开发者的应用程序来说很不友好.所以Android系统还提供了称为广播接收者BoradcastReceiver的组件,采用广播机制…
通信硬件NFC的文章,虽然可以在Android系统中通过非直接接触的形式与支持NFC硬件的设备通信,但是也只能交互一些简短的标签内容,对大量的持续性数据,却并不能很好的支持.因此针对这个弊端,可以考虑使用支持Bluetooth技术的硬件. Android系统支持传统的Bluetooth技术,其实现功能不仅可以传输数据,还可以传输并执行远程控制指令.在Android4.3 即API 18 及以后的版本中,低功耗的Bluetooth技术(简称为BLE)取自传统Bluetooth的核心功能,可以更省功…
在上一篇文章中我们了解到Android系统启动应用的时候,会首先加载AndroidManifest.xml清单文件中的一系列信息,在清单文件中如果不指定<application></application>标签中的name属性值,会默认使用android.app.Application作为应用程序加载类,其生命周期与应用程序生命周期是一致的.那么到底应用程序有怎样的生命周期,在不同的生命周期有哪些调用方法可以使用?这章将详细介绍. 生命周期 应用实例化 首先要知道,一个应用程序,有…
在上一篇文章中已经提到,Android系统加载应用程序之后,首先会读取该应用程序的AndroidManifest.xml清单文件,之后根据该清单文件加载后边的东西.所以要开发应用程序,自然要先知道清单文件中都记录了什么东西.一般地,在清单文件中声明定义的内容,称为静态注册,相对应地,可以在代码中定义的内容,称为动态注册. 清单文件的存储位置就是应用程序的根目录,而且文件名也是固定的,必须为AndroidManifest.xml,清单文件中所包含的内容在Android官网应用清单文件中可查.其中的…
在上篇文章以线程间的通信方式Handler类结尾,服务Service还支持的进程间通信,又是具体怎么实现的呢?这就要用到加载服务一文中提到的AIDL语言规范了. AIDL是 Android Interface Definition Language 的缩写,即Android接口定义语言,使用其定义的规范编程,可实现Android系统上不同进程间的通信.官网ADIL概述中以服务端和客户端通信为例做了大致讲述.与线程间的通信类似,不同进程间的通信也是分为通信消息内容.消息发送方.消息接收方三个部分的…
应用中关于数据的持久化保存,不管是简单的SharedPreferences还是数据库SQLiteDatabase,本质上都是将数据保存到系统的某种类型的文件中.因此可以直接使用java.io.File文件类将数据以任意类型存取. 在获取到File文件类的对象后,就可以使用其相关方法执行对文件的读写等相关操作,这部分属于Java语言开发或Kotlin语言开发的基础知识,不再多言.而在Android系统上因为各种原因,获取File对象的方式有所区别,本文将重点介绍. 这里需要注意,File文件类不仅…
在上篇文章了解到应用级文件只能被其所创建的应用程序所访问,那么其他应用程序是不是就无论如何都无法访问了呢?肯定不是的,只要文件经过其创建的应用程序授权,还是可以被其他应用程序所访问的.这也就是应用级文件的共享. 系统只允许共享包含实际数据的纯文件类型,而不推荐共享包含文件的目录类型. 对于文件的访问可以使用java.io.File系统文件类,但是如果想将该文件分享出去,则需要借助android.net.Uri路径定位符类.Uri类是Android系统下自定义的路径定位符规则,其符合Java中定义…
在之前关于应用内数据本地保存为文件时,曾提到应用需要申请外部存储设备的读写权限才能访问外部存储中的文件.那么针对某一种权限,应用程序具体应该怎么申请使用呢?本文将详细介绍. 应用中的权限主要分为两类,分为正常权限和危险权限.在Android6.0即API 23之前,这两种权限均只需要在清单文件中声明即可,自Android6.0即API 23开始,危险权限不仅需要在清单文件中声明,还需要在代码使用该权限的界面Activity中动态申请,弹出权限申请框,由用户决定是否授权.应用所需要的权限列表及授权…
到目前为止,关于应用程序与用户之间的相关内容便比较肤浅的大致介绍完毕.而在整个系统架构中,应用程序与用户之间的交互,犹如参天大树上的枝干和树叶,交互起来五彩缤纷,但使整个生态系统保持生命力的核心,在于树根,也就是应用程序通过Android系统与设备上硬件的交互. 设备硬件 设备的硬件目前主要分为三大类,包括传感器系列硬件(重力传感器.加速度传感器.陀螺仪.位置传感器.光亮传感器等),互联通信系列硬件(SIM卡,无线WLAN,蓝牙.NFC.USB等),多媒体系列硬件(麦克风.播放器.相机等). 虽…
在硬件交互的首篇对设备硬件的分类中,互联通信系列硬件主要用来与其他设备进行数据交互.从本文开始,将重点介绍该系列相关硬件. 互联通信系列硬件 根据硬件的可通信距离,由近及远分为USB.NFC.蓝牙.WLAN,SIM卡槽,这些硬件之间的功能原理及关系可以查找其他资料详细学习.总之,他们为当前设备与其他设备的交互搭建了桥梁,只要双方设备均遵循该系列硬件的协议,就可以在硬件层互相通信,而设备上的Android操作系统便会将硬件层的数据转换为应用层数据,进而与应用程序交互.这样也就实现了两个不同设备上的…
在上篇文章介绍了接入式USB硬件的简单使用,接下来将介绍不依赖物理连接的硬件通信了.本文的重点是近距离通信的硬件NFC. NFC硬件 应用程序中可以通过NFC硬件读取或发送指定协议的技术实现,在Android10.0之前甚至可以封装大段的NDEF数据.另外,Android系统基于NFC的特性,结合移动设备的安全元件,构建了一层HCE架构,从而应用于安全级别较高的公交卡刷卡或付款交易等操作. 权限声明 要想使用NFC硬件的相关功能,必须要声明权限,在应用程序的清单文件中声明<uses-permis…
Android系统的移动设备大多支持无线WLAN技术.利用该技术,不仅能实现互联网通信,还能实现无线定位,热点共享等远程通信功能.针对使用WLAN的不同功能,可能需要分别申请不同的权限声明,同时调用不同的系统框架API,下文将按照不同的使用功能分别介绍. 扫描无线设备 该功能通常只允许在系统自带的设置应用中使用,当然如果是第三方应用的目标版本在Android 9.0即API 28以下,也可以使用该功能.扫描周围的无线设备,需要用到android.net.wifi.WifiManager wifi…
现在的SIM卡通常具备基站定位.语音通话.短信消息.网络流量这四大功能,而在移动端是无法对SIM卡使用基站定位功能的,所以这里只介绍移动端如何使用SIM卡实现语音通话.短信消息.数据流量三个功能. 语音通话 Android系统中提供了通话服务,同时自带系统级应用可以通过该通话服务使用SIM卡的通话功能.因此在第三方应用中使用语音通话功能,有两种思路.其一是通过应用间唤起,由第三方应用传入指定的Intent意图对象调起系统电话应用,之后在系统电话应用操作完成后返回第三方应用:其二是在第三方应用中直…
多媒体系列硬件 多媒体包括图片.动画.音频.视频,这些多媒体素材的采集(输入)主要依靠摄像头和麦克风等硬件设备转化为基础数据,而他们的播放渲染(输出),则需要依靠具有相关功能的编解码软件.当然随着硬件集成度越来越高,也有些基础功能内置到硬件中解码,以此减少软件解码过程中的CPU耗时操作,这种方式称为硬件加速.由于多媒体的播放渲染(输出)是由系统主动向用户发出的,通常不需要向用户申请权限.系统将数据直接发给应用程序,进而在应用程序内编程实现相关数据的解码播放渲染(输出)操作.故文章重点介绍在多媒体…
前两篇文章通过麦克风硬件和摄像头硬件分别采集音频和视频的多媒体数据,在得到的多媒体数据通常是以编码文件的格式存储,在用户需要展示时,可通过设备的内置扩音器或蓝牙耳机等硬件播放音频,通过设备的显示屏或外接投影仪等硬件播放照片.动画或视频. 可以将这些展示类设备分为两类. 一类是内置类多媒体硬件,是通过线路硬连接到设备CPU控制中心,所以在应用程序中可直接调取系统提供的相关接口直接使用这类设备.比如移动手机的内置扩音器.听筒.有线耳机.屏幕等硬件. 另一类是外接类多媒体硬件,是通过配合下文即将介绍的…
内容提供者ContentProvider与前文的界面Activity.服务Service.广播接收者BroadcastReveiver,并列称为Android的四大组件,均是需要自定义子类继承上述组件类,并在清单文件中静态注册或逻辑代码中动态注册才能正常使用. android.content.ContentProvider内容提供者类,是用来对其他应用程序提供分享数据内容的组件类,在应用程序间的文件共享一文中,针对Android7.0以上版本所注册的FileProvider文件提供者,便是已经定…
在多媒体摄像头及相关硬件文章中,对摄像头的使用方式需要区分应用程序的目标版本以使用不同的代码流程,而与之相比,麦克风硬件的使用就简单多了. 麦克风及相关硬件 麦克风硬件在移动设备上作为音频的采集设备,由于只需要一个收声口,其颜值对用户来说关注度比较低.而且不同的麦克风硬件在性能上差距不大,其应用场景也只是在录制视频时的音频采集,或单独的音频采集,故使用流程和相关操作都比较简单易懂. 只是在目标版本为Android9.0即API 28即以上的系统中,如果应用程序想使用麦克风,必须保持前台运行,或使…
下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 这篇博文,包括了,实际生产开发非常重要的,单元测试和调试代码.这里不多赘述,直接送上代码. MRUnit 框架 MRUnit是Cloudera公司专为Hadoop MapReduce写的单元测试框架,API非常简洁实用.MRUnit针对不同测试对象使用不同的Driver: MapDriver:针对单独的Map测试  ReduceDriver:针对单独的Reduce测试    MapReduceDri…
本博文的主要内容有 一.zookeeper编程入门系列之利用zookeeper的临时节点的特性来监控程序是否还在运行   二.zookeeper编程入门系列之zookeeper实现分布式进程监控 三.zookeeper编程入门系列之zookeeper实现分布式共享锁 我这里采用的是maven项目,这个很简单,不会的博友,见我下面写的这篇博客 Zookeeper项目开发环境搭建(Eclipse\MyEclipse + Maven) 这里,推荐用下面的eclipse版本(当然你若也有myeclips…
不多说,直接上干货! 下面,是版本1. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本1(一) 下面是版本2. Hadoop MapReduce编程 API入门系列之挖掘气象数据版本2(九) 这篇博客,给大家,体会不一样的版本编程. 代码 package zhouls.bigdata.myMapReduce.weather; import java.io.DataInput; import java.io.DataOutput; import java.io.IOExce…