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广播接收器

   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值