自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 Activity的启动模式

Activity四种启动模式

2022-06-12 15:02:37 246 1

原创 Activity被意外销毁,View的保存与恢复

Activity被意外销毁,View的保存与恢复

2022-06-11 22:37:56 1557

原创 最好用的网络库:Retrofit

使用 Retrofit 需要先添加 Retrofit 依赖库。dependencies { ...... implementation 'com.squareup.retrofit2:retrofit:2.8.1' implementation 'com.squareup.retrofit2:converter-gson:2.8.1'}Retrofit是基于OkHttp开发的,因此添加上述第一条依赖会自动将Retrofit、OkHttp和 Okio 这几个库一起下载。第二

2022-04-08 15:28:21 224

原创 使用 OkHttp 以及解析 JSON数据 和网络请求回调

首先需要在项目中添加 OkHttp库 的依赖dependencies { ...... implementation 'com.squareup.okhttp3:okhttp:4.4.1'}创建一个OkHttpClient实例val client = OkHttpClient()创建一个Request对象val request = Request.Builder().url("https://www.baidu.com").build()调用OkHttpClien.

2022-04-07 17:51:24 9767

原创 探究Service

使用Service 需要先创建一个自己的类继承自Serviceclass MyService : Service() { ... override fun onCreate() { super.onCreate() } override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { return super.onStartCommand(intent

2022-04-07 14:13:00 132

原创 Service的生命周期

在项目中任何地方调用 startService() 方法,如果该Service未被创建,会首先调用 onCreate() 方法,然后调用 onStartCommand() 方法;如果已经被创建,会直接调用Context的 onStartCommand 方法。Service启动之后会一直保持运行状态,直到调用了 stopService() 方法或 stopSelf() 方法,或者由于系统内存不足,被回收。每调用一次 startService() 方法,都会调用一次onStartCommand(),但是,只

2022-04-07 12:01:41 131

原创 Git 使用

创建代码仓库git init提交本地代码提交某个文件git add build.gradle提交app目录git add app提交所有文件git add .添加好文件之后,就可以提交了git commit -m "First commit."每一次提交必须有名称!!!忽略文件不是所有的文件都要提交,创建项目自动生成 .gitignore 文件,在里面添加不需要提交的内容即可!例如:测试文件,在 .gitignore 添加:/build/src

2022-04-06 17:20:16 118

原创 Android 播放多媒体文件:音乐和视频

一、播放音乐播放音乐主要是使用 MediaPlayer类来实现!!MediaPlayer类常用方法汇总:工作流程:创建一个MediaPlayer对象,调用setDataSource() 方法,设置音频路径 调用 prepare() 方法来让MediaPlayer 进入准备状态 调用 start() 方法 开始播放 调用 pause() 停止播放 reset() 停止播放实例:class MainActivity : AppCompatActivity() { ...

2022-04-06 16:18:44 3276

原创 Android 通知用法

1、首先创建一个NotifyManager对通知进行管理,调用Context的 getSystemService() 方法。getSystemService() 方法用于接收一个字符串来确定从系统获取什么服务:Context.NOTIFICATION_SERVICE 代表获取系统的通知服务。val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagerif (Build.VERSION.SDK_I

2022-04-06 11:38:05 2625

原创 Kotlin扩展知识(三):泛型 和 委托

Kotlin扩展知识(一):延迟初始化和密封类Kotlin扩展知识(二):扩展函数和运算符重载泛型定义泛型类及函数,语法结构如下:class MyClass { fun <T> method(param: T): T { return param }}调用方式:val myClass = MyClass()val result = myClass.method<Int>(123)之前定义的高级函数 build 如下:

2022-04-02 17:35:02 140

原创 跨程序共享数据,探究 ContentProvider

一、Android权限机制:Android现在将常用的权限大致归成了两类,一类是普通权限,一类是危险权限。普通权限指的是那些不会直接威胁到用户的安全和隐私的权限,对于这部分权限申请,系统会自动帮我们进行授权,不需要用户手动操作。危险权限则表示那些可能会触及用户隐私或者对设备安全性造成影响的权限,如获取设备联系人信息、定位设备的地理位置等,对于这部分权限申请,必须由用户手动授权才可以,否则程序就无法使用相应的功能。危险权限一览:二、在程序运行时申请权限以拨打电话权限为例。修改

2022-04-02 16:26:54 312

原创 Android 数据存储三种方式(二)

Android 数据存储三种方式(一)https://blog.csdn.net/Tefuir111/article/details/123867585三、SQLite数据库存储这是一个重要的技术,SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百KB的内存就足够了,因而特别适合在移动设备上使用。SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,而且SQLite比一般的数据库要简单得多,它甚至不用设置用户名和密码就可以使用。Android正

2022-04-01 10:57:22 2727

原创 Android 数据存储三种方式(一)

一、文件存储:将数据存储到文件:Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。该方法接受两个参数:第一个参数是文件名,文件创建时使用,不可以包含路径,只是文件名,因为所有的文件都默认存于 /data/data/<package name>/files 目录下。第二个参数是文件的操作模式:主要有MODE_PRIVATE 和 MODE_APPEND两种,默认是MODE_PRIVATE,表示,当存在相同名称的文件时,所写入的内容

2022-03-31 15:31:32 2479

原创 Android的广播机制:BroadcastReceiver

Android中的广播主要可以分为两种类型:标准广播和有序广播。标准广播为异步,有序广播为同步。接收系统广播(动态监听时间变化):我们可以根据自己感兴趣的广播,自由地注册BroadcastReceiver,这样当有相应的广播发出时,相应的BroadcastReceiver就能够收到该广播,并可以在内部进行逻辑处理。注册BroadcastReceiver的方式一般有两种:在代码中注册和在AndroidManifest.xml中注册。其中前者也被称为动态注册,后者也被称为静态注册。动态注册实现

2022-03-30 16:53:46 2016

原创 Kotlin扩展知识(二):扩展函数和运算符重载

Kotlin扩展知识(一):延迟初始化和密封类扩展函数:扩展函数表示即使在不修改某个类的源码的情况下,仍然可以打开这个类,向该类添加新的函数。当我们想要实现一个 统计某个字符串中的字母数量 的方法时,之前通常需要创建一个单例类,来实现一个函数,函数参数为字符串,进行统计,如下:object StringUtil { fun lettersCount(str: String): Int { var count = 0 for (char in str)

2022-03-30 14:59:31 157

原创 Kotlin扩展知识(一):延迟初始化和密封类

延迟初始化:假设当我们的类中有全局变量 adapter ,而且该全局变量需要在 onCreate() 中初始化,因此需要先将adapter 定义为null,同时将类名声明为 ? 。我们想在onClick() 中使用adapter需要保证它在onCreate() 函数调用之后在调用,但是在onClick()方法中仍需要进行判空处理,否则编译不通过。当全局变量少时,可以通过添加判空符号进行处理,但是随着全局变量增多,会需要编写大量的判空处理代码,而仅为了满足编译器要求。代码如下:class Mai..

2022-03-30 14:16:41 163

原创 Fragment实战:手机和平板同时适用

具体代码见:D:\code\FragmentBestPracticeFragmentBestPractice 项目1、创建News类,包含title 和 content2、创建布局文件news_content_frag.xml作为新闻内容的布局。需要将新闻内容设置成不可见,因为双页模式下,不点击新闻标题,不对新闻内容进行显示。3、新建 NewsContentFragment 类,在类中加载 news_content_frag.xml 布局文件,并提供一个refresh(title,cont.

2022-03-30 11:36:26 203

原创 动态加载布局技巧

使用限定符(qualifier):如果你经常使用平板,应该会发现很多平板应用采用的是双页模式,使用手机则为单页模式,如何在运行时判断是双页还是单页模式,可以使用限定符。修改FragmentTest项目中的activity_main.xml文件,代码如下所示:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" and

2022-03-29 17:29:50 152

原创 Fragment

简单写法(静态添加):分别建立两个fragment布局:left_fragment.xml 和 right_fragment.xml然后创建两个类,都继承自Fragment类,代码如下:class LeftFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState

2022-03-29 17:23:05 97

原创 制作9-Patch图片以及设计聊天界面

普通图片会被均匀拉伸,如下:会被均匀拉伸成使用效果非常差,可以使用9-patch图片来进行改善。、在Android Studio中,我们可以将任何png类型的图片制作成9-Patch图片。步骤如下:首先对着 message_left.png 图片右击 → Create 9-Patch file,会出现如下图片:在上边框和左边框绘制的部分表示当图片需要拉伸时就拉伸黑点标记的区域在下边框和右边框绘制的部分表示内容允许被放置的区域需要删掉原来的图片,因为Androi...

2022-03-29 15:59:35 762

原创 更强大的滚动控件:RecyclerView

ListView功能很强大,但并不是完美无缺的,比如如果不使用一些技巧来提升它的运行效率,那么ListView的性能就会非常差。还有,ListView的扩展性也不够好,它只能实现数据纵向滚动的效果,如果我们想实现横向滚动的话,ListView是做不到的。Android提供了更强大的RecyclerView,可以轻松实现ListView的功能,同时优化了ListView的不足指出,未来会有更多的程序由ListView转为RecyclerView。RecyclerView基本用法:RecyclerV

2022-03-29 11:08:32 1081

原创 最常用和最难用的控件 ListView

创建一个ListViewTest项目。创建一个布局放入Listview控件,代码如下:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <List

2022-03-28 19:20:59 668

原创 创建自定义控件

我们所有的控件都是继承或间接继承自View的,所用的所有布局都是直接或间接继承自ViewGroup的。View是Android中最基本的一种UI组件,它可以在屏幕上绘制一块矩形区域,并能响应这块区域的各种事件,因此,我们使用的各种控件其实就是在View的基础上又添加了各自特有的功能。可以利用上述继承结构来自定义控件。首先引入布局:自定义标题栏方法:首先在layout文件中建立一个title.xml布局,如下:<?xml version="1.0" encoding="utf-..

2022-03-28 14:28:13 856

原创 三种Android布局方式:LinearLayout

LinearLayout线性布局控件的排列方式:垂直排列、水平排列android:orientation 属性:可选值为 vertical (垂直的)和 horizontal (水平的) 如果不指定 android:orientation 默认值是 horizontal (水平)如果排列方式是水平,则控件宽度不能设置成match_parent。android:layout_gravity 属性和android:gravity 属性不同:android:gravi...

2022-03-28 10:21:50 2059

原创 Android开发:控件类型及使用

1、TextViewlayout...xml中定义的TextView<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical"

2022-03-25 19:37:16 982

原创 标准函数with、run、apply等和静态方法

一、标准函数Kotlin的标准函数有很多,先学习常用的with、run、apply三个。还有let标准函数,主要是配合 ?. 操作符进行判空处理,以保证线程安全。标准函数with:with函数接收两个参数:第一个参数可以是任意类型的对象。第二个参数是一个Lambda表达式,表达式中提供参数对象的上下文,即参数对象所在的场景,并使用Lambda表达式中的最后一行作为返回值。使用格式为:val res = with(obj){ //obj的上下文,要做的事 "v

2022-03-25 15:49:15 463

原创 必备技巧(一):更方便的编写启动Activity

正常启动Activity:编写意图Intent,然后调用startActivity来启动Intent。如果需要传输数据,则向Intent中使用putExtra()函数来添加需要传输的数据。但是,实际项目中,有可能一个人只需要负责编写一个Activity,如果涉及到不同Activity之间的数据传输,则需要重新阅读Activity中需要的数据,或者向编写其他Activity的人询问需要传输的数据,浪费时间。例如,SecondActivity需要两个String字符串,则需要这样编写:val in

2022-03-25 14:20:01 961

原创 知晓自己在哪个Activity以及随时随地退出程序。

知晓自己在哪个Activity的方法:在你进入一家公司之后,更有可能的是接手一份别人写的代码,因为你刚进公司就正好有一个新项目启动的概率并不高。阅读别人的代码时有一个很头疼的问题,就是当你需要在某个界面上修改一些非常简单的东西时,却半天找不到这个界面对应的Activity是哪一个。解决办法为:创建一个BaseActivity类,让他继承AppCompatActivity类,然后让其它的Activity继承BaseActivity类,代码如下:class BaseActivity : App

2022-03-25 11:18:27 871

原创 Activity的生命周期

Android是使用任务(task)来管理Activity的,一个任务就是一组存放在栈里的Activity的集合,这个栈也被称作返回栈(back stack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的Activity,它就会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()方法去销毁一个Activity时,处于栈顶的Activity就会出栈,前一个入栈的Activity就会重新处于栈顶的位置。系统总是会显示处于栈顶的Activity给用户...

2022-03-24 16:39:03 1205

原创 初识Android(二):Intent的使用,在Activity中穿梭

使用Intent的目的:启动器点击图标只会进入程序的主Activity,如何进入其他的Activity,实现不同Activity之间的交互。使用intent来实现。Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前空前要执行的动作,还可以在不同组件之间传递数据。Intent一般可用于启动Activity、启动Service、发送广播等场景。1、使用显式Intent首先要创建新的一个Activity,并给新的Activity一个新的layout布局。

2022-03-24 15:42:18 1802

原创 初识Android(一):Toast、Menu实现以及销毁Activity

1、Activity 中 使用 ToastToast是Android提供的友好的提醒方式,在程序中可以它将一些较小的信息通知给用户,并在一段时间后自动消失,并且不占用屏幕空间。定义一个弹出Toast的触发点。首先在layout中声明一个Button。使用按钮的点击事件 作为弹出Toast的触发点。在onCreate()方法中添加如下代码:class FirstActivity : AppCompatActivity() { override fun onCreate(savedIn

2022-03-23 18:01:28 461

原创 Android入门:向Activity中创建和加载布局

1、创建一个布局文件在res文件夹中创建layout目录在layout目录中创建一个布局,本人创建的是LinearLayout布局。生成一个LinearLayout线性布局,以及一个按钮<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent"

2022-03-23 16:31:02 2544

原创 Kotlin小技巧:拼接字符串、参数默认值

拼接字符串不同于Java,Kotlin支持字符串内嵌套表达式功能,不需要再进行字符串拼接!Kotlin字符串内嵌表达式的语法规则:" hello ${obj.name}, nice to meet you!"Kotlin 允许字符串内嵌套 ${} 这种表达式,并在运行时使用表达式的执行结果替换这一部分内容,当表达式内只有一个变量时,可以将大括号省略。val list2 = mutableListOf("Apple","orange","StrawBerry")for (fruit

2022-03-23 15:31:54 7130

原创 Kotlin中的空指针检查

在任何编程语言中,空指针异常高居各类崩溃排行榜榜首!!!主要是因为空指针是一种不受编程语言检查的运行时异常,只能由程序员主动通过逻辑判断来避免,Kotlin科学的解决了这个问题,在编译时的判空检查机制几乎杜绝了空指针异常。1.1 可空类型系统声明:下面代码的Study 为自行创建的一个接口Study,代码如下:interface Study { fun readBooks() fun doHomeWork(){ println("do homework de

2022-03-23 15:07:48 1478

原创 Kotlin学习记录(二) 2022/3/22

Kotlin学习记录(一) 2022/3/221.5 类和对象Kotlin语言是支持面向对象编程的,即要先将事物封装成具体的类,然后将事物所拥有的属性以及能力定义为类的字段和函数,然后再适当时候创建类的对象,调用对象中的字段和函数来满足实际编程的需求,这是面向对象编程的基本思想。创建一个Person类:class Person { var name = "" var age = 0 fun eat() { println("$name is eati

2022-03-23 10:11:17 199

原创 Kotlin学习记录(一) 2022/3/22

编程根本:变量和函数1.1 变量Kotlin定义一个变量不同于Java与C/C++,其只允许在变量前声明两种关键字:val和varval ( value ):声明一个不可变的变量,不可重新赋值,对应于java中的finalvar ( variable ):声明一个可变变量,可被重新赋值Kotlin有类型推导机制,可以根据赋值变量类型推导变量类型。注意:Kotlin每一行后不需要分号,这与其它编程语言不同,需注意。fun main(){ val a=10 prin

2022-03-22 15:59:19 596

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除