android基础知识

第07节  ListView

1.当我们的程序中有大量的数据需要展示的时候,就可以借助 ListView 来实现。ListView 允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。

ListView 的简单用法

1.listView数据的添加  ListView 控件的android:entries 属性设置。

2.数组中的数据是无法直接传递给ListView 的,我们还需要借助适配器来完成。Android 中提供了很多适配器的实现类,其中我认为最好用的就是 ArrayAdapter。它可以通过泛型(参数化类型,类似于方法中的变量参数)来指定要适配的数据类型,然后在构造函数中把要适配的数据传入即可

1.FruitAdapter 重写了父类的一组构造函数,用于将上下文、ListView 子项布局的 id 和数据都传递进来。另外又重写了 getView()方法,这个方法在每个子项被滚动到屏幕内的时候会被调用,其中,参数position 标识我们现在正在绘制 ListView 中第几个 ite m

2.在 getView 方法中,首先通过getItem()方法得到当前项的 Fruit 实例,然后使用 La youtInflater 来为这个子项加载我们传入的布局,接着调用 View 的 findViewById()方法分别获取到 ImageView 和 TextView 的实例,并分别调用它们的 setImageResource()和 setT

ext()方法来设置显示的图片和文字,最后将布局返回,这样我们自定义的适配器就完成

3.我们一般在给一个 activity 设定一个视图的时候,都用的是 setContentView 这个方法来直接指定布局文件,但是 activity 中早已经内置了指定视图的工具 LayoutInflater。这个工具就像是一个压力泵,能够把布局文件压缩成一个视图,呈现出来。它的作用类似于 findViewById(),不同点是 LayoutInflater 是用来找 layout 下 xml 布局文件,并且实例化!而 findViewById()是找具体 xml 下的具体 widget 控件。

getView()方法,一共有三个参数,position 标识我们现在正在绘制ListView中第几个 item,convertView 相当于一个 view 控件的缓存装置,它将我们定义好显示每一行 item 的布局文件压缩成一个视图,布局中的部分 view 都在它里面。

ListView 的点击事件  使用了    setOnItemClickListener()  方法来为 ListView 注册了一个监听器,当用户点击了 ListView 中的任何一个子项时就会回调  onItemClick()    方法

第08节  数据持久化简介

1.数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则是提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换。

2.实现数据持久化三种方式,即  文件存储、SharedPreferences存储以及 SQLite 数据库存储。

3.内部存储是指应用程序中的数据以文件方式存储到设备内部中。当创建的应用程序被卸载时,其内部存储文件也随之被删除。

4.Context 类中提供了一个     openFileOutput()方法,可以用于将数据存储到指定的文件中。

openFileOutput()方法返回的是一个FileOutputStream 对象(文件输出流),得到了这个对象之后就可以使用字节流的方式将数据写入到文件中

5.如何将一段文本内容保存到文件中

通过 openFileOutput()方法能够得到一个 FileOutputStream 对象(文件输出流),然后使用它的 write()方法将文本内容写入到文件中,但是 write()方法需要一个字节数组参数,我们通过字符串的 getBytes()方法可以将字符串转化为一个字节数组。最后,一定要关闭文件输出流。

6.使用 Environment 类的getExternalStorageState()方法来判断 S D 卡是否存在可用。使用 getExternalStorageDirectory()方法来获取 SD 卡根目录的路径,

这样可以避免由于手机厂商不同而导致 SD 路径不同的问题。

7.添加 SD 卡的读写权限,示例代码如下:

<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE" />

SharedPreferences 存储  不同于文件的存储方式,SharedPreferences 是使用键值对的方式来存储数据的,保存为.xml 文件。

8. 三种方法用于得到 SharedPreferences对象

1.Context 类中的getSharedPreferences()方法(指定文件名)

2.Activity 类中的 getPreferences()方法(固定文件名)这个方法

3.PreferenceManager 类中的getDefaultSharedPreferences()方法(固定文件名)

(1.调用SharedPreferences 对象的edit()方法获取一个SharedPreferences.Editor对象。

(2.向 SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用 p utBoolean()方法,添加一个字符串则使用 putString()方法,以此类推。

(3.调用 commit()方法将添加的数据提交,从而完成数据存储操作。下面通过一个例子来体验一下 SharedPreferences 存储的用法吧。

4.从 SharedPreferences 中读取数据

SharedPref erences 对象中提供了一系列的get 方法用于对存储的数据进行读取,每种 get 方法都对应了SharedPreferences.Editor 中的一种 put 方法,比如读取一个布尔型数据就使用 g etBoolean()方法,读取一个字符串就使用getString()方法。这些 get 方法都接收两个参数,第一个参数是,传入存储数据时使用的键就可以得到相应的值了,第二个参数是默认值,即表示当传入的键找不到对应的值时,会以什么样的默认值进行返回。

1.SQLiteOpenHelp er 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。

首先你要知道 SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是 onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。

SQLiteOpenHelper 中还有两个非常重要的实例方法,getReadableDatabase()和 get

WritableDatabase()。这两个方法作用和区别这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase() 方法返回的对象将以只读的方式去打开数据库,而 getWritableDatabase()方法则将出现异常。

上述代码就是 Android 中事务的标准用法,首先调用【【SQLiteDatabase【【的       【【beginTransaction()【【方法来开启一个事务,然后在一个异常捕获的代码块中去执行具体的数据库操作,当所有的操作都完成之后,调用【【setTransactionSuccessful()【【表示事务已经执行成功了,最后在 finally 代码块中调用 endTransaction()来结束事务。

第09节  内容提供者ContentProvider

1、内容提供者简介

内容提供者(ContentProvider)是 Android 系统组件之一,主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。目前,使用内容提供者是 Android 实现跨程序共享数据的标准方式

图重点

内容提供者的用法一般有两种:一种是使用 ContentResolver(内容解析者)访问现有的内容提供者暴露的相应程序中的数据;另一种是创建自己的内容提供者为我们程序的数据提供外部访问接口。

(1)ContentResolver(内容解析者)的基本用法对于每一个应用程序来说,如果想要访问内容提供者中共享的数据,就一定要借助【【 ContentResolver【【(内容解析者)类,可以通过 Context中的【【 getContentResolver()【【方法

获取到该类的实例。ContentResolver 中提供了一系列的方法用于对数据进行 CRUD 操作,其中 insert()方法用于添加数据,update()方法用于更新数据,delete()方法用于删除数据,

query()方法用于查询数据。

内容 URI 给内容提供者中的数据建立了唯一标识符,它主要由两部分组成,权限(authority)和路径(path)。权限是用于对不同的应用程序做区分的,一般为了避免冲突,都会采用程序包名的方式来进行命名。比如某个程序的包名是 com.sdbi.app,那么该程序对应的权限就可以命名为 com.sdbi.app.provider。路径则是用于对同一应用程序中不同的表做区分的,通常都会添加到权限的后面。

内容 URI 最标准的格式写法如下:

content://com.sdbi.app.provider/table1

 content://com.sdbi.app.provider/table2

(1)创建内容提供者的步骤

1.定义一个类,继承ContentProvider;

2.定义匹配规则 UriMatcher;

3.通过静态代码块添加匹配规则;

4.一定要记得在清单文件配置内容提供者,不要忘记加 authorities。

ContentProvider 类中有六个抽象方法,我们在使用子类继承它的时候,需要将这六个方法全部重写。onCreate()

初始化内容提供者的时候调用。通常会在这里完成对数据库的创建和升级等操作,返回 true 表示内容提供者初始化成功,返回 false 则表示失败。注意,只有当存在 Con tentResolver(内容解析者)尝试访问我们程序中的数据时,内容提供者才会被初始化。

query()

从内容提供者中查询数据。使用 uri 参数来确定查询哪张表,projection 参数用于

确定查询哪些列,selection 和 selectionArgs 参数用于约束查询哪些行,sortOrder 参数

用于对结果进行排序,查询的结果存放在 Cursor 对象中返回。

insert()

向内容提供者中添加一条数据。使用 uri 参数来确定要添加到的表,待添加的数据保存在 values 参数中。添加完成后,返回一个用于表示这条新记录的 URI。

update()

更新内容提供者中已有的数据。使用 uri 参数来确定更新哪一张表中的数据,新数据保存在 values 参数中,selection 和 selectionArgs 参数用于约束更新哪些行,受影响的行数将作为返回值返回。

delete()

从内容提供者中删除数据。使用 uri 参数来确定删除哪一张表中的数据,selection 和selectionArgs 参数用于约束删除哪些行,被删除的行数将作为返回值返回。

getType()

根据传入的内容 URI 来返回相应的 MIME 类型(Multipurpose Internet Mail Exten sions,多用途互联网邮件扩展类型)。

一个内容 URI 所对应的 MIME 字符串主要由三部分组分,Android 对这三个部分做了如下格式规定。

1.必须以 vnd 开头。 2.如果内容 URI 以路径结尾,则后接android.cursor.dir/,如果内容 URI 以 id 结尾,则后接 android.cursor.item/。 3.最后接上 vnd.<authority>.<path>。

第10节广播接收者BroadcastReceiver

BroadcastReceiver 也就是“广播接收者”的意思,它就是用来接收来自系统和应用中的广播。

之所以叫做广播,就是因为它只负责“说” 而不管你“听不听”,也就是不管你接收方如何处理。此外,广播可以被不止一个应用程序所接收,当然也可能不被任何应用程序所接收。

因此,广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的

Android 中的广播主要可以分为两种类型:标准广播和有序广播。

标准广播(Normal broadcasts)是一种完全异步执行的广播

有序广播(Ordered broadcasts)则是一种同步执行的广播

注册广播的方式一般有两种,在代码中注册和在 AndroidManifest.xml 中注册,其中前者也被称为动态注册,后者也被称为静态注册。

动态注册的生命周期跟程序的生命周期是一样的,程序关闭后动态注册的广播是不能在接收到广播的;静态注册是当程序关闭后,如果有广播发过来,还能启动程序。

动态注册的优点:在 Android 的广播机制中,动态注册的优先级高于静态注册的优先级,因此在必要情况下,我们需要动态注册广播接收器。

静态注册的有点:无需担心广播接收器是否关闭,只要设备处于开启状态,广播接收器就能接收。

动态注册监听网络变化

如何创建一个广播接收者呢?其实只需要新建一个类,让它继承自BroadcastRecei ver,并重写父类的 onReceive()方法就行了

其实这基本上就和前面所学的动态注册广播接收器以及发送广播的代码是一样。

只不过现在首先是通过 LocalBroadcastManager 的 getInstance()方法得到了它的一个实例,然后在注册广播接收器的时候调用的是 LocalBroadcastManager 的 registerReceiver() 方法,在发送广播的时候调用的是 LocalBroadcastManager 的 sendBroadcast()方法,仅此而已。

本地广播的几点优势1.可以明确地知道正在发送的广播不会离开我们的程序,因此不需要担心机密数据泄漏的问题。2.其他的程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐患。3.发送本地广播比起发送系统全局广播将会更加高效。

builder.setSmallIcon(R.drawable.ic_launcher);// 设置通知小图标 builder.setContentTitle("标题"); // 设置通知标题builder.setContentText("内容"); // 设置通知内容

PendingIntent 从名字上看起来就和Intent 有些类似,都可以去指明某一个“意图”,都可以用于启动活动、启动服务以及发送广播等。不同的是,Intent 更加倾向于去立即执行某个动作,而 PendingIntent 更加倾向于在某个合适的时机去执行某个动作。所以,也可以把 PendingIntent 简单地理解为延迟执行的 Intent。它可以设置执行次数,主要用于远程服务通信、闹铃、通知、启动器、短信中。

这里先是使用Intent表达出我们想要启动NotificationActivity 的“意图”,然后将构建好的 Intent 对象传入到 PendingIntent 的 getActivity()方法里,以得到 Pendin gIntent 的实例 pi,再通过 setContentIntent()方法设置通知栏点击意图。

Android四大基本组件分别是ActivityService服务,Content Provider内容提供者,BroadcastReceiver广播接收器

   

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

apache derby_Apache Derby数据库用户和权限

apache derby抽象 Apache Derby很棒&#xff01; 尤其是在微服务环境中&#xff0c;服务的数据&#xff08;可能&#xff09;会缩减&#xff0c;并且不需要强大的RDBMS。 Derby很棒&#xff0c;因为它非常易于使用&#xff0c;特别是在涉及用户和权限时&#xff0c;您不需要任何…

IntelliJ IDEA for Mac在MacOS模式下的版本控制/本地历史记录快捷键(VCS and Local History Shortcut)

快捷键快捷键符号英文名称功能说明Command K⌘KCommit project to VCS提交代码到版本控制器Command T⌘TUpdate project from VCS从版本控制器更新代码CommandShiftK⌘⇧KPush commits推送提交&#xff0c;有问题OptionCommandK⌥⌘KPush commits推送提交Control V⌃V‘VCS’…

nutshell_Nutshell中的Java 8语言功能-第1部分

nutshell你好朋友&#xff0c; Java 8发布已经很长时间了&#xff0c;现在越来越多地被使用。 在本文中&#xff0c;我们将讨论以下Java 8主题。 1.功能接口 2.Lambda表达式 3.默认方法 1.功能界面 什么是功能接口&#xff1f; 与一种并且只有一种抽象方法的接口是功能接口…

windows server 2008 R2 命令行的方式创建用户、设置密码

一、使用命令行的方式创建用户、设置密码 &#xff08;1&#xff09;标准格式&#xff1a; net user username password / add 例如&#xff1a;建立一个名为lijunxuan、密码为Abc_123的用户 net user lijunxuan Abc_123 /add 二、使用命令行修改旧帐户的密码 &#xff…

IntelliJ IDEA for Mac的快速切换当前主题方案(Quick switch current scheme)

文章目录一、配色方案 &#xff08;Color Scheme&#xff09;二、代码样式方案&#xff08;Code Style Scheme&#xff09;三、键映射表&#xff0c;即快捷键方案&#xff08;Keymap&#xff09;四、视图模式/查看模式/显示模式&#xff08;View Mode&#xff09;五、界面外观&…

jpa避免n+1_JPA技巧:避免N + 1选择问题

jpa避免n1介绍 像JPA这样的ORM框架通过帮助我们在对象<->关系数据映射期间避免了很多样板代码&#xff0c;从而简化了我们的开发过程。 但是&#xff0c;它们还给表带来了一些其他问题&#xff0c;N 1是其中之一。 在本文中&#xff0c;我们将简要介绍该问题以及避免这些…

Windows server 2008 基础知识

1、Windows server 2008 安装形式 (1、Virtual (2、Hyper-V (3、VMware 2、对于虚拟内存的大小&#xff0c;建议为实际内存的1.5倍 3、在Windows server 2008系统中安装活动目录的命令是DCPROMO。活动目录存放在域控制器中 4、Windows server 2008支持的两种用户账户&…

Paint X for Mac的用法

文章目录快捷键图形界面介绍快捷键 快捷键说明Command A抓手Command S另存为Command T设置字体Option Command C设置画布大小 Canvas SizeOption Command I设置图像大小 Image SizeShift Command V垂直翻转 Flip VerticalShift Command H水平翻转 Flip HorizontalC…

IntelliJ IDEA for Mac如何替换文件内容中指定的关键词

按下组合键 Shift R 打开替换对话框&#xff08;如下图所示&#xff09;&#xff0c;在对话框中有两个输入框&#xff0c;上面的输入框中输入被替换的关键词&#xff0c;会在指定的范围内查找被替换的关键词&#xff0c;接着在下面的输入框中输入替换的关键词&#xff0c;然后…

海域动态监视监测管理系统_监视和管理备份系统

海域动态监视监测管理系统上一次我们建立一个强大的备份系统时 &#xff0c;现在我们将研究如何监视备份集。 我们需要验证是否正确清理了备份集&#xff08;这称为删除策略&#xff09;&#xff0c;并且它们是一致的&#xff08;称为一致性策略&#xff09;。 备份集可以包含…

Thread 线程同步、线程状态

线程概念 线程&#xff08;英语&#xff1a;thread&#xff09;是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 一、多线程介绍 1.1创建线程类 Java中通过继承Thread类来创建并启动多线程的步骤如下&#xff1a; 1.定义Thr…

jsp过滤器示例_Java 8过滤器,地图,收集和流示例

jsp过滤器示例大家好&#xff0c;许多读者给我发了电子邮件&#xff0c;写了一篇有关Java 8的地图和过滤器功能的文章&#xff0c;因为他们发现它们难以理解和使用。 即使我以前同时写过有关map&#xff08;&#xff09;和filter&#xff08;&#xff09;的博客&#xff0c;我仍…

IntelliJ IDEA for Mac如何使用单元测试Junit

文章目录测试分类Junit 使用步骤测试结果的判定常用的注解BeforeAfter测试分类 黑盒测试&#xff1a;不需要写代码&#xff0c;不需要关注程序执行具体逻辑和流程&#xff0c;给输入值&#xff0c;看程序是否能够输出期望的值 白盒测试&#xff1a;需要写代码&#xff0c;需要…

File类、递归、字节流

一、File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 1.2 构造方法 public File(String pathname) &#xff1a;通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 public File(String …

java求期望_Java 11的期望

java求期望过去的几年对Java世界一直是动荡不安的&#xff0c;在相当多的发行版中添加了各种各样的功能。 在开发人员社区中&#xff0c;人们逐渐意识到Java的开发速度不够快。 在最初的20年中&#xff0c;Java平台和Java开发工具包&#xff08;JDK&#xff09;经历了庞大&…

IntelliJ IDEA for Mac 封装字段(添加setter/getter方法)

可以利用 IDEA 对类中的字段进行封装&#xff0c;所谓“字段封装”&#xff0c;就是指通过调用方法的方式来访问字段&#xff0c;而不是直接通过“对象.字段名”的方式去访问。 例如&#xff0c;成员变量 hairColor 是一个 public 的变量&#xff0c;没有相关的 setter/getter…

JDBC预处理对象prepareStatement

JDBC预处理对象prepareStatement概述 一、SQL注入问题 SQL注入&#xff1a;用户输入的内容作为了SQL语句语法的一部分&#xff0c;改变了原有SQL真正的意义。 假设有登录案例SQL语句如下: SELECT * FROM 用户表 WHERE NAME 用户输入的用户名 AND PASSWORD 用户输的密码; 此…

bean包、entity包、mode包、domain包的区别

文章目录beanentitymodeldomain总结bean 包含的都是 JavaBean。 JavaBean 是一种 Java 语言写成的可重用组件。为写成 JavaBean&#xff0c;类必须是具体和公共的&#xff0c;并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成属性。Jav…

java修改数据历史记录_记录更新(Java数据类)

java修改数据历史记录最近几个月&#xff0c;有一些与“ Java数据类”&#xff08;又称为“记录”&#xff09;有关的更新。 正如我在“ JavaFX&#xff0c;Valhalla&#xff0c;数据类和Java的浮点更新 ”一文中简短提到的那样&#xff0c; Brian Goetz的“ Java数据类 ”“探…

idea配置Maven的本地仓库(打开新的项目时自动更新本地仓库的位置)

配置Maven的本地仓库 一、打开目录然后选择 Other Settings → Settings for New Projects 二、配置自己的文件路径和本地仓库 三、设置每次自动更新本地仓库