- 博客(43)
- 收藏
- 关注
原创 Retrofit 动态代理+反射 基本原理
retrofit = new Retrofit.Builder().baseUrl("https://www.httpbin.org/").build(); httpbinService = retrofit.create(HttpbinService.class);public <T> T create(final Class<T> service) { validateServiceInterface(service); return (T) ..
2021-08-31 10:08:37
470
原创 Java流程控制
Java流程控制可大致分为以下几部分:1.复合语句:与C语言及其他语言相同,Java语言的复合语句是以整个块区为单位的语句,所以又称块语句。复合语句由开括号“{”开始,闭括号“}”结束。2.条件语句:条件语句可根据不同的条件执行不同的语句。包括if条件语句和switch多分支语句。3.循环语句:while循环、do while循环、for循环、foreach循环一.if条件语句if条件语句是一个重要的编程语句,用于告诉程序在某个条件成立的情况下执行某段语句,而另一种情况下执行另外的语句。
2021-04-08 14:08:16
210
2
原创 Java运算符
运算符是一些特殊的符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面。Java中提供了丰富的运算符,如赋值运算符、算术运算符、比较运算符等。1.赋值运算符(“=”):赋值运算符以符号“=”表示,它是一个二元运算符(对两个操作数作处理),其功能是将右方操作数所含的值赋给左方的操作数。2.算术运算符:“+”(加)、“-”(减)、“*”(乘)、“/”(除)、“%”(取余)3.单目运算符:自增、自减 (++a、a++、--a、a--) 自增与自减都是相对于操作元i和表达式而言的...
2021-04-07 15:23:39
265
转载 Java变量与常量
在程序执行过程中,其值不能被改变的量称为常量,其值能被改变的量称为变量。变量与常量的命名都必须使用合法的标识符。一.标识符和关键字1.标识符:标识符可以简单地理解为一个名字,用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。Java语言规定标识符由任意顺序的字母、下划线(_)、美元符号($)和数字组成,并且第一个字符不能是数字。标识符不能是Java中的保留关键字。...
2021-04-07 10:45:29
220
原创 Java基本数据类型
在Java中有8种基本数据类型,它们分别被用来处理3种类型的数据,数值型、字符型、布尔型。1.数值型:整数类型(byte、short、int、long),浮点类型(float、double)2.字符型:char3.布尔类型:boolean一.整数类型整数类型用来存储整数数值,即没有小数部分的数值。可以是正数,也可以是负数。整型数据在Java程序中有3种表示形式,分别为十进制、八进制和十六进制。十进制:十进制的表现形式大家都很熟悉,如120、0、-127八进制:如0123(转换成十
2021-04-06 15:41:09
310
原创 Java主类结构
Java语言是面向对象的程序设计语言,Java程序的基本组成单元是类,类体中有包括属性和方法。每一个应用程序都必须包含一个main()方法,含有main()方法的类称为主类。下面通过程序来介绍Java主类结构。package com.it.cast.cn;public class First { static String s1="你好"; public static void main(String[] args){ String s2="Java";
2021-04-06 11:11:18
236
原创 Java简介与HelloWorld第一行代码
一.基本信息1.设计人:詹姆斯·戈士林博士(Sun公司研究院院士)2.创建时间:1995年3.特点:跨平台,用Java编写的程序可以运行在任何平台和设备上,如跨越IBM个人电脑、MAC苹果计算机、各种微处理器硬件平台、Windows、UNIX、OS/2、MAC OS等系统平台。4.重点:Java之所以跨平台主要原因是因为JVM的跨平台,不同操作系统中都支持JVM,而使用Java语言编写的源程序代码被编译器编译成.class文件可以直接被各操作系统的JVM直接识别,识别后别解释成机器码(就都是
2021-04-06 10:27:02
167
原创 重学《Java从入门到精通》第四版 清华大学出版社
作为一名刚毕业1年半的Android Developer,在工作后总发觉自己的Java功底很是欠缺。所以准备再重新学习一遍Java。温故而知新,可以为师矣。Java这门编程语言或许会被其他编程语言所代替,但其优秀的编程思想却永远不会消失,所以不用有所质疑,选择它没有错。Java这门编程语言我是从大二以看视频的方式开始学起的(那种零基础学Java视频)。在学校图书馆看了近1个月,大致了解了Java中的一些关键字、对象名称、常用特性等。至于手敲还是很懵懂、也不熟练。所以就淘宝选购了本《Java从入门到精通》
2021-04-02 11:00:57
504
1
原创 实现跨程序数据共享
我们这里先假设先有一个A应用程序,这个程序中存在一个BookStore数据库和一张Book表,然后还有一个B应用程序,跨程序实现数据共享的意思就是,通过B程序,我们可以对A程序中Book表中的数据进行CRUD(增删改查)操作。下面我们就一一来实现A应用程序和B应用程序。A应用程序:DatabaseSaveB应用程序:ProviderTest我们需要实现ProviderTest应...
2019-01-24 13:40:19
1952
1
原创 创建自己的内容提供器
如果想要实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承ContentProvider的方式来创建一个自己的内容提供器。ContentProvider类中有6个抽象方法,我们在使用子类继承它的时候,需要将这6个方法全部重写。新建MyProvider继承自ContentProvider,代码如下所示:package com.example.administr...
2019-01-23 10:54:05
506
原创 运行时权限+读取系统联系人
GitHub项目地址:https://github.com/Skymqq/ContactsTest.git 首先在模拟器中创建2个联系人,如下所示:我们看到列表中中已经存在2位联系人了。新建一个ContactsTest项目。activity_main.xml代码:<?xml version="1.0" encoding="utf-8"?>&l...
2019-01-22 13:20:16
1320
原创 访问其他程序中的数据(ContentResolver的CRUD操作)
内容提供器的用法一般有两种:1.使用现有的内容提供器来读取和操作相应程序中的数据2.创建自己的内容提供器给我们程序的数据提供外部访问接口。如果一个应用程序通过内容提供器对其数据提供了外部访问接口,那么任何其他的应用程序既可以对这部分数据进行访问。Android系统中自带的电话薄、短信、媒体库等程序都提供了类似的访问接口,这就使得第三方应用程序可以充分地利用这部分数据来实现更好的功能...
2019-01-22 12:11:19
1066
1
原创 (调用系统电话薄)运行时权限的基本使用
GitHub项目地址:https://github.com/Skymqq/RuntimePermissionTest.git运行时权限是Android6.0系统引入的新特性,那么为何要引入这种运行时权限的机制呢?这是为了保障用户的安全和隐私,如果系统声明了某些危险权限,而这个时候用户却一点都不知晓,这就显得很不人性化,如果在程序安装界面,弹出一个对话框来通知用户,是否允许当前程序拥有一些权...
2019-01-22 09:43:20
874
原创 使用LitePal操作数据库(CRUD增删改查) 项目已上传GitHub
GitHub项目地址:https://github.com/Skymqq/LitePalSave.git LitePal是一款开源的Android数据库框架,它采用了对象关系映射(ORM)映射的模式,并将我们平时开发最常用到的一些数据库进行了封装,使得不用编写一行SQL语句就可以完成各种建表和增删改查的操作。首先新建一个LitePalSave项目。配置LitePalA...
2019-01-20 12:43:01
2407
2
原创 Android数据存储之SQLite数据库存储,数据库的CRUD操作(增、查、改、删)(创建BookStore.db数据库,创建Book表,并了解adb shell来查看数据库和表的创建情况)
GitHub项目地址:https://github.com/Skymqq/DatabaseSave.gitSQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源也很少,通常只需要几百KB的内存就足够了,因而特别适合在移动设备上使用。SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,所以只要你以前使用过其他的关系型数据库,就可以很快的上手SQLite。而SQ...
2019-01-15 10:52:25
2535
原创 Android数据存储之SharedPreferencesSave存储(保存数据,读取数据的操作)
GitHub项目地址:https://github.com/Skymqq/SharedPreferencesSave.git不同于文件的存储方式,SharedPreferences是使用键值对的方式来存储数据的。也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出来。而且SharePreferences还支持多种不同的数据类型存...
2019-01-14 15:50:48
1769
原创 Android数据存储之文件存储(瞬时数据的存储与读取)项目已上传GitHub
GitHub地址:https://github.com/Skymqq/FileSave.git 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设备中的数据是处于持久状态的,持久化技术则提供了一种机制可以让数据在瞬时状态和持久状态之间进行转换。Android系统中主要提供...
2019-01-13 18:23:28
643
原创 广播,实现强制下线功能(项目文件已上传GitHub)
项目文件GitHub地址:https://github.com/Skymqq/BroadcastBestPractice.git 新建BoradcastBestPractice项目。首先我们需要制作一个登录界面,并且定义它为第一个显示的界面。新建LoginActivity.java,代码如下:package com.example.administrator.broadc...
2019-01-12 14:15:10
244
原创 初识广播机制(监听网络状态的改变,监听网络是否可以使用)
Android系统中的广播机制比较灵活,因为Android中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。Android提供了一套完整的API,允许应用程序自由地发送和接收广播。广播的类型主要可以分为以下两种:1.标准广播(无序广播) 特点:无序、异步,几乎同时接收到2:.有序广播...
2019-01-10 20:30:37
1157
原创 Fragment碎片的基本使用(手机平板需要更好地兼容)
碎片(Fragment)是一种可以嵌入在活动当中的UI片段,它能让程序更加合理和充分地利用大屏幕的控件,因而在平板上应用得非常广泛。碎片其实与活动十分相似,同样都能包含布局,也同样拥有着自己的生命周期。你甚至可以将碎片理解成一个迷你型的活动,虽然这个迷你型的活动有可能和普通的活动是一样大的。接下来我们来了解下Fragment的具体使用。新建一个FragmentTest项目,并且创建好一个平板模...
2019-01-09 19:17:32
441
原创 编写精美的聊天界面(左边显示接收消息,右边显示发送消息)(项目已上传GitHub)
附上我的GitHub项目地址:https://github.com/Skymqq/UIChat.git 学习Android开发,了解一个精美聊天界面的实现是很有必要的,如果可以掌握这个技能,那么在下次接触聊天项目的时候,UI这方面你就有了些基础经验了,加油哟。首先创建一个UIChat项目。在实战开始之前,我们还需要学习一下如何制作Nine-Patch图片。你可能之前还没有听说过...
2019-01-08 20:43:43
2911
原创 RecyclerView控件实现横向滚动和瀑布流布局,以及RecyclerView的点击监听(项目已上传GitHub)
先附上我的GitHub项目地址:https://github.com/Skymqq/RecyclerViewTest.git 我们已经知道,ListView的拓展性不好,它只能实现纵向的滚动的效果,如果想进行横向滚动的效果,ListView就做不到了,毫无疑问,RecyclerView是可以做到的。fruit_item.xml列表项布局文件代码:<?xml versio...
2019-01-08 13:34:33
1105
原创 RecyclerView控件的基本使用(增强版的ListView)
ListView由于其强大的功能,在过去的Android开发当中可以说是贡献卓越,直到今天仍然还有不计其数的程序在继续使用着ListView。不过ListView并不是完全没有缺点的,比如说如果我们不使用一些技巧来提升它的运行效率,那么ListView的性能就会非常差。还有ListView的拓展性也不够好,它只能实现数据纵向滚动的效果,如果我们想实现横向滚动的话,ListView是做不到的。为...
2019-01-08 10:46:47
621
原创 提升ListView的运行效率
之所以说ListView这个控件很难用,就是因为它有很多细节可以优化,其中运行效率就是很重要的一点。目前我们ListView的运行效率是很低的,因为在FruitAdapter的getView()方法中,每次都将布局重新加载了一遍,当ListView快速滚动的时候,这就会成为性能的瓶颈。仔细观察发现,getView()方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓...
2019-01-07 14:13:23
290
原创 定制ListView的界面(使用自定义的列表项布局,一边显示水果图片,一边显示水果文字)以及ListView的点击事件
只能显示一段文本的ListView实在是太过单调,我们现在就来对ListView的界面进行定制,让它可以显示更加丰富的内容。首先,我们需要准备好一组水果图片,分别对应上面提供的每一种水果,待会我们要让这些水果名称的旁边都有一个图样。 接着定义一个实体类,作为ListView适配器的适配类型。新建类Fruit,代码如下:package com.example.adminis...
2019-01-07 13:39:00
3826
1
原创 ListView控件的基本使用(方式一:使用ArrayAdapter适配器实现)
ListView绝对可以称得上是Android中最常用的控件之一,几乎所有的应用程序都会用到它。由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的时候,就可以借助ListView来实现。ListView允许用户通过手指上下滑的方式将屏幕外的数据滚动到屏幕内,同时屏幕上原有的数据则会滚动出屏幕。相信你其实每天都在使用这个控件,比如查看QQ聊天记录,翻...
2019-01-07 11:01:51
2093
原创 PercentFrameLayout(百分比布局)的基本使用
前面的3中布局,LinearLayout、RelativeLayout、FrameLayout都是从Android1.0中就开始支持了,一直沿用到现在,可以说是满足了绝大多数场景的界面设计需求。不过细心的你会发现,只有LinearLayout支持使用android:layout_weight属性来实现按比例指定控件大小的功能,其他两种布局都不支持比如说,如果想用RelativeLayout来实现两...
2019-01-06 18:25:50
6066
原创 FrameLayout(帧布局)的基本使用
FrameLayout又称作帧布局,它相比于LinearLayout和RelativeLayout要简单很多,因为它的应用场景也少了很多。这种布局没有方便的定位方式,所有的控件都会默认摆放在布局的左上角。activity_main代码:<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="h...
2019-01-06 16:39:07
32765
1
原创 RelativeLayout(相对布局)的基本使用
RelativeLayout又称作相对布局,也是一种非常常用的布局。和LinearLayout的排列规则不同,RelativeLayout显得更加随意一些,它可以通过相对定位的方式让控件出现在布局的任何位置。也正因为如此,RelativeLayout中的属性非常多,不过这些属性都有规律可循的,其实并不难理解和记忆。我们还是通过实践来体会一下activity_main.xml代码:<...
2019-01-06 16:14:15
9318
原创 LinearLayout(线性布局)的基本使用
LinearLayout又称作线性布局,是一种非常常用的布局。正如它的名字所描述的一样,这个布局会将它所包含的控件在线性方向上依次排列。既然是线性排列,肯定就不仅只有一个方向,这里一般只有两个方向:水平方向和垂直方向。下面我们将LinearLayout(线性布局)常用到的属性简单归纳一下:属性1:android:orientation 指定线性布局的方向(水平或者垂直)属性2:a...
2019-01-06 10:30:25
49601
2
原创 ProgressDialog(带进度条的对话框)的基本使用
ProgressDialog和AlertDialog有点类似,都可以在界面上弹出一个对话框,都能够屏蔽掉其他控件的交互能力。不同的是,ProgressDialog会在对话框中显示一个进度条,一般用于表示当前操作比较耗时,让用户耐心地等待。他的用法和AlertDialog也比较相似。效果图: activity_main.xml代码:<?xml version="1.0...
2019-01-04 15:57:43
4616
2
原创 AlertDialog(对话框)的基本使用
AlertDialog可以在当前的界面弹出一个对话框,这个对话框是置顶于所有界面元素上的,能够屏蔽掉其他控件的交互能力,因此,AlertDialog一般都是用于提示一些非常重要的内容或者警告信息。比如为了防止用户误删重要内容,在删除前弹出一个确认对话框。下面我们来学习一下它的用法。效果图: activity_main.xml代码:<?xml...
2019-01-04 14:54:21
2127
1
原创 ProgressBar(圆形、水平进度条)的基本使用(点击Button1按钮,显示或消失圆形ProgressBar)(每点击一次Button2按钮,水平进度条增加10%)
ProgressBar用于在界面上显示一个进度条,表示我们的程序正在加载一些数据。它的用法也非常简单。首先它有两种形式,一种是圆形进度条,另一种是水平进度条。效果图:activity_main.xml代码<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http...
2019-01-04 14:17:48
3013
原创 ImageView控件的基本使用(点击Button按钮,切换图片显示)
ImageView是用于在界面上展示图片的一个控件,它可以让我们的程序界面变得更加丰富多彩。学习这个控件需要提前准备好一些图片,图片通常都是放在drawable开头的目录下的。这里我们为了让程序的图片显示更加精美,我们可以使用矢量图来作为资源图片。这里我就不具体讲解如何将.svg矢量图在AndroidStudio中变成.xml适量图了。网上很多教程。程序效果图: activit...
2019-01-04 13:13:50
12156
1
原创 EditText控件的基本使用(点击Button按钮,Toast提示EditText中的内容)
EditText是程序用于和用户进行交互的另一个重要控件,它允许用户在空间里输入和编辑内容,并可以在程序中对这些内容进行处理。EditText的应用场景非常普遍,在进行发短信、发微博、聊QQ等操作时,你不得不使用EditText。接下来我们直接看实现效果图,再看代码。效果图: activity_main.xml中:<?xml version="1.0" encoding...
2019-01-04 12:28:21
6006
原创 Button控件的基本使用(初识封装、减少代码冗余性、代码优化)
Button是程序用于和用户进行交互的一个重要控件,它的配置属性和TextView差不多,这里我们可以注意观察一下Button众多属性中的两种:1.属性名android:textAllCaps (用于设置Button控件中的英文字母大小写)2.属性名android:visibility (用于设置Button控件是否可见,以及不可见的时候是否占据屏幕空间) 下面我...
2019-01-02 14:36:11
965
原创 TextView控件的基本使用(各种属性的基本使用方法)
TextView的在安卓中可以理解为一个文本视图控件,Android的视图控件的基类是View类,可以理解的TextView是View的子类。我们通常在.XML布局文件中会为文本视图控件指定各种属性来设置它的样式。1.属性名andorid:id id2.属性名layout_width宽度3.属性名layout_height高度4.属性名layout_weight权重比例5.属性...
2018-12-29 14:55:16
10046
原创 返回数据给上一个活动
既然可以传递数据给下一个活动,那么能不能够返回数据给上一个活动呢?答案是肯定的。不过不同的是,返回上一个活动只需要按一下Back键就可以了,并没有一个用于启动活动的Intent来传递数据。通过查阅文档你会发现,Activity中还有一个startActivityForResult()方法也是用来启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。毫无疑问,这就是我们所需要的。...
2018-12-29 13:54:18
947
原创 使用显式Intent向下一个活动传递数据
在启动活动时传递数据的思路很简单,Intent提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出取出就可以了。比如说MainActivity中有一个字符串,现在想把这个字符传递到SecondActivity中,你就可以在MainActivity中这样子编写:btn1.setOnClickList...
2018-12-29 12:58:03
543
原创 使用隐式Intent打开系统内置拨号界面
效果图: 3行代码搞定。 Intent intent1=new Intent(Intent.ACTION_DIAL); intent1.setData(Uri.parse("tel:10086")); startActivity(intent1);首先指定了Intent的action是Intent.ACTION_DIAL,这又是一个Android系统的内置动作。然后传入一...
2018-12-29 12:31:21
1797
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人