Android应用
文章平均质量分 77
chenrenxiang
缓慢进步
展开
-
RegisterForActivityResult介绍
RegisterForActivityResult介绍1. 添加引用库2. 相关类和方法介绍2.1 ActivityResultContract2.2 ActivityResultCallback3. 示例4. 官方的封装4.1 实现startActivityForResult4.2 实现requestPermissions首先介绍一下其作用:它可以取代 startActivityForResult方法,获取另一个Activity的返回结果。它可以取代 requestPermissions方法,用原创 2021-07-12 19:20:35 · 8839 阅读 · 2 评论 -
自定义异常处理
首先,Java中定义异常的顶级类是 Throwable,它是 Error类和 Exception类的父类。只有继承于 Throwable类或其子类的对象才能被Java虚拟机或者Java的 throw语句抛出。同样,也只有这样的类才能作为被 catch语句捕获的参数类型。Java中的异常可以分类两类:一类是检测异常(checked exception),又称作编译时异常,它必须在编译阶段处理,一般使用 try...catch来捕获处理,或者用 throws关键字声明。另一类是非检测异常(uncheck原创 2021-01-29 20:28:05 · 243 阅读 · 0 评论 -
LeakCanary实现原理简析
文章目录1. LeakCanary初始化1.1 在ContentProvider中初始化LeakCanary1.2 初始化默认观察器1.3 跟踪观察被销毁的对象2. 观察对象的存活状态3. 分析泄漏对象4. 其它原理这两个字,会让人觉得太深奥,其实只是简单了解下。我记得以前用 LeakCanary的时候,需要在 Application里面进行初始化。版本升级之后发现只需要在 build.gradle里面引用它就可以了,不需要手动初始化,那么它是如何运行起来的呢?1. LeakCanary初始原创 2021-01-11 21:13:59 · 587 阅读 · 0 评论 -
自定义Lint检查规则
文章目录一、Lint基本使用介绍1. 界面操作2 命令行运行二、自定义Lint规则第一步:创建一个Lint规则库1.1 定义Issue1.2 定义Detector1.3 定义并配置Registry第二步:创建一个Android库第三步:在项目中添加自定义Lint规则三、Lint检查的配置四、总结Lint是 Android Studio里面提供的一个代码检查工具,相信大多数Android开发者都用过或了解过Lint,它可以用来对项目做一些基本的但却非常有必要的代码检查,以帮助开发者提升程序的可靠性和性能,原创 2021-01-08 20:16:45 · 1979 阅读 · 1 评论 -
Handler消息机制
文章目录认识Handler类Handler的初始化认识LooperLooper的初始化Looper如何处理消息认识MessageQueue认识MessageHandler发送消息Handler处理消息总结认识Handler类首先看一下Handler源码的官方介绍:A Handler allows you to send and process {@link Message} and Runnable objects associated with a thread’s {@link Messa原创 2020-12-24 00:40:57 · 208 阅读 · 0 评论 -
Gson基本用法
Gson是谷歌官方推出的支持 JSON -- Java Object 相互转换的 Java序列化/反序列化 库,之前由于没有用过,所以学习一下。1. 导入Android Studio工程dependencies { implementation 'com.google.code.gson:gson:2.8.4'}2.简单的 Java Object 序列化/反序列化...原创 2018-05-12 14:25:03 · 128040 阅读 · 14 评论 -
Android依赖库的优化
在Android项目的 External Libraries 下面,可以看到项目所用到的所有官方库或者第三方库。如下: 仔细浏览,有时候会发现,同一个库出现了多个版本,比如上图中的com.facebook.stetho库,一个1.4.1版本,一个1.5.0版本。甚至会看到一些不知从哪里冒出来的库,比如上图出现的com.google.zxing库。据我所知zxing是一个二维码扫描库,但是我的项目里原创 2017-12-12 20:53:18 · 1744 阅读 · 0 评论 -
SQLite数据库的使用
SQLite数据库的使用 app通常需要保存一些有用的数据在本地,如果数据量小,比如app的一些配置信息,可以考虑使用轻量级的SharedPreferences来保存。如果数据量大,且要进行复杂的操作,则可能需要使用数据库来保存数据,而SQLite是Android系统默认支持的一款数据库。业务描述:这篇文章里我们试图来完成这样一个业务,app支持多账号切换,且每个账号都会产生一些训练(比如跳绳原创 2017-12-11 12:07:57 · 949 阅读 · 0 评论 -
给TextView中指定的字符添加点击事件
给TextView中指定的字符添加点击事件一 、需求分析如下图:登陆界面有一个文字说明,其中 Service Terms 和 Privacy Policy 两个词需要高亮显示,且要求点击之后进入相应的页面。 首先我想到的是对Service Terms 和 Privacy Policy 使用不同的TextView,但是这样布局非常麻烦,且需要使用多个TextView,而且对于不同分辨率的手机可能无法原创 2017-11-13 11:50:26 · 1184 阅读 · 0 评论 -
CoordinatorLayout: 自定义Behavior
CoordinatorLayout中的Behavior主要用来实现控件之间的交互以及滑动交互。常见的Behavior有”@string/appbar_scrolling_view_hehavior” 以及 “@string/bottom_sheet_behavior” ,这两个是Design库自带的Behavior。我们自己也可以根据需要自定义Behavior,来实现漂亮的交互。 自定义Behavi原创 2017-10-09 10:00:11 · 363 阅读 · 0 评论 -
Notification的一些新特性
Notification的一些新特性普通的Notification写法首先需要初始化一个NotificationManager:NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);基本的Notifica原创 2017-09-07 15:47:25 · 889 阅读 · 0 评论 -
Button onClick事件一种新的写法
假设layout里有三个Button吧,id分别是 button_1 ,button_2 , button_3之前一直都知道有两种onClick写法:button_1.setOnClickListener(new Button.OnClickListener(){ public void onClick(View v) {原创 2015-06-11 17:54:26 · 755 阅读 · 0 评论 -
使用 Annotations 改进代码检查
使用代码检查工具,例如Lint,能帮助你找到代码中的问题。但有时候检查工具检查的程度还不够,比如说,Android的资源文件 id 统一是 int类型,用来标识 字符串、图片、颜色及其它类型的资源。如果你在本应该使用颜色资源id的地方使用了字符串资源的id,检查工具就无法检查出来,即使这种情况会导致渲染出错甚至app崩溃。而使用Annotations就能检查出上述的问题,当然,Annotations原创 2017-12-18 12:00:45 · 551 阅读 · 0 评论 -
倒计时器 CountDownTimer
倒计时器 CountDownTimer 一个非常简单易用的倒计时类,其实仍然是使用Handler来进行计时,不过封装好之后用起来方便多了。一、10秒倒计时示例 new CountDownTimer(10000, 1000) { @Override public void onTick(long l) { tvCountDown.se原创 2018-05-09 18:38:51 · 660 阅读 · 0 评论 -
带滑动反弹效果的ViewPager
参考了几篇代码,自己弄了一个带滑动反弹效果的ViewPager。代码非常简单,主要原理就是随着手指的移动改变View的X坐标。那么直接就简单粗暴地上代码了:public class BounceBackViewPager extends ViewPager { private int currentPosition = 0; private boolean handleMo...原创 2019-01-03 18:00:42 · 447 阅读 · 1 评论 -
WorkManager的使用
WorkManager可以用来轻松地创建一个任务,然后放手让它在你指定的某种条件下运行。在项目中引入WorkManager:dependencies { def work_version = "1.0.0-alpha11" implementation "android.arch.work:work-runtime-ktx:$work_version" }1. 相关类和...原创 2018-11-16 17:53:39 · 1162 阅读 · 0 评论 -
Room数据库的使用
废话也不多说了,Room数据库就是对SQLite数据库的封装,使之用起来更方便。Google也说了强烈推荐使用Room来替代SQLite。1.在项目中添加Roomdependencies { ... def room_version = "2.1.0-alpha02" implementation "androidx.room:room-runtime:$room_vers...原创 2018-11-14 15:44:32 · 7608 阅读 · 0 评论 -
监听App是否处于前台
今天需要实现一个需求,就是当App对用户不可见时,停止App的某些功能。那么该如何监听App是否处于前台呢?哈哈哈!非常简单,只需要用接口 Application.ActivityLifecycleCallbacks 就能实现该功能。只需要两步,就能实现前后台监听: 一、实现接口 ActivityLifecycleCallbacks基本思路:自定义一个类并实现ActivityLife...原创 2018-07-16 17:57:32 · 2101 阅读 · 5 评论 -
Android8.0无法接收隐式广播消息
App里有一个自己在Manifest文件里面注册的广播接收器(Receiver),到Android8.0的机器上调试的时候却接收不到消息,一番搜索和研究之后,才发现Android8.0已经对隐式广播做了限制。版本区别对于targetSdkVersion 在26或者以上的app,在Manifest里面注册的Receiver已经受到限制,而用Java代码动态注册的Receiver则不受...原创 2018-07-02 16:56:22 · 12692 阅读 · 4 评论 -
给ViewGroup添加LayoutAnimation
先贴一个ViewGroup的方法: ViewGroup.setLayoutAnimation(LayoutAnimationController controller);最近才知道这个方法,实在是惭愧(以前都干嘛去了?)!先说下这个方法的作用:用来给ViewGroup中的子控件添加入场动画。要注意的是: - 它的动画效果只能作用于直接子控件,对于子控件的子控件没有效果 - 它的动画效果...原创 2018-05-28 12:22:23 · 766 阅读 · 1 评论 -
StateListAnimator的应用
StateListAnimator让你能为控件定义一系列的动画,并随着控件状态的改变展示不同的动画效果。比如是否被选中,是否被触碰等状态。先看一张效果图 手指触碰控件后,控件在Z方向上的高度抬升了,而且控件放大了,手指离开之后,控件又恢复原状。这只是StateListAnimator能实现的众多效果之一。通过各种动画的搭配,我们能为不同状态下的控件提供各种动画效果。有一点...原创 2018-05-26 14:16:35 · 4448 阅读 · 0 评论 -
响应组件的生命周期
响应组件的生命周期在MVP模式中,常需要在Presenter里响应Activity或者Fragment的生命周期,对应做一些处理。比如在Presenter里发起了一个网络请求,请求还在进行,而用户点击了返回按钮要退出当前Activity,这时最好能在Presenter中取消当前请求,也就是说,要在Presenter中响应Activity的onDestroy方法,在Activity销毁时取消仍在...原创 2018-05-10 17:58:45 · 258 阅读 · 0 评论 -
2015-11-29 LogCat消失太快&&定时执行任务&&PopuWindow背景模糊
星期天:晴自学Android快半年,才终于找到工作,实在是不容易。今天开了一天的会,主要是确定产品的工作原理和任务安排,事情还是挺多的。今天的三个问题:1. Android Studio用惯了,现在这个公司之前的app是用eclipse做的,所以我也用eclipse了。调试的时候发现LogCat里的消息瞬间消失了,原来是因为缓存条数太少。只需要到Window——>Android原创 2015-11-29 22:26:42 · 814 阅读 · 0 评论 -
Android 使用HorizontalScrollView 实现图片画廊
如图所示:可以把照片排成一行,拖动观看 XML文件 activity_main.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout原创 2015-06-06 22:30:16 · 1827 阅读 · 0 评论 -
2015-12-07 Android Studio logcat不显示正在调试的app信息
对Android Studio还不是很熟悉,这个问题昨天困扰了我一天,真机调试时logcat总是没有任何信息,或者就疯狂刷信息,但不显示当前调试的app信息。如图:第二个条形框里总是显示“no debuggable applications",而不是现在这样显示app包名。解决方法:在Android Studio Tools——>Android——>Enable ADB Int原创 2015-12-08 10:23:12 · 7152 阅读 · 0 评论 -
第一章 layout相关知识
一、 组合使用weightSum和layout_weight<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:ba原创 2016-04-08 15:16:08 · 420 阅读 · 0 评论 -
华为手机PopupWindow弹出时背景不变暗问题
下面这段PopupWindow弹出时背景变暗效果的代码在网上随处可见: private void setBackgroundAlpha(float bgAlpha){ WindowManager.LayoutParams layoutParams = MainActivity.this.getWindow().getAttributes(); layoutPar原创 2016-04-11 14:14:00 · 4313 阅读 · 3 评论 -
第二章 创建炫酷的动画效果
1. 使用TextSwitcher和ImageSwitcher当我们需要改变界面上某一处文字时,通常使用TextView.setText()方法来实现,瞬间即完成。而TextSwitcher可以让我们在改变文字时添加一个退出和一个进入动画。TextSwitcher实现步骤如下:1. 通过findViewById()初始化TextSwitcher控件2. 通过switcher.set原创 2016-04-11 14:40:42 · 838 阅读 · 0 评论 -
第三章 关于控件的一些技巧
1.避免EditText输入日期时的验证当在EditText输入日期时,通常需要对输入的日期进行验证,然而我们可以用Button代替EditText,从而避免验证。首先,使用Button控件替代EditText控件,但给Button控件设置一个EditText控件的背景,使之看起来像一个EditText控件,如下: android:id="@+id/details_date"原创 2016-04-15 10:52:20 · 3413 阅读 · 0 评论 -
第六章 使用列表(list)和适配器(adapter)
列表和适配器是安卓开发中需要重点掌握的两个概念,在这章中,我们将学习列表和适配器的一些技巧。1.处理空列表当列表中没有内容的时候,可以展示一张图片或者文字进行提示,只需要使用ListView的setEmpltyView(view)方法即可。当adapter为null或者adapter的 isEmpty()方法返回true的时候就会展示出来。例如:<FrameLayout x原创 2016-05-17 15:54:45 · 935 阅读 · 0 评论 -
在ListView中使用ImageLoader加载图片时出现闪烁问题
真正的闪烁原因不是display和imageload方法的缘故,而是在设置option时,设置了.displayer(new FadeInBitmapDisplayer(200))的缘故,直接设置为.displayer(new SimpleBitmapDisplayer()),然后再getview方法中调用display方法,就不会闪烁了.解决方案出自以下链接:点击打开链接原创 2016-05-13 16:46:37 · 3063 阅读 · 2 评论 -
修改app名称后,分享到微信的app名称无变化问题
最近遇到了一个问题,我的app原本名称为 loop ,分享到微信之后,会在分享内容的左下角显示app名称,即 loop 。后来公司要求把app名称第一个字母大写,改为 Loop 。所以我在微信开放平台上把app名称也更改了,并提交了审核,不久也就通过了。 然而审核通过之后分享内容到微信,app名称仍然显示为loop 。接下来想了无数办法:比如重复提交审核了3次,仍然无效、 比如尝试去联系开放平台客原创 2016-11-07 11:34:48 · 8470 阅读 · 3 评论 -
Tinker热修复初探
听说热修复已经很久了,但这是第一次尝试去应用它。所以我对其它各种热修复也没什么了解,这里仅仅记下如何使用Tinker热修复。对于Tinker热修复的介绍和问题这里也不写了,因为官方文档已经有了,戳这里进入官方介绍文档 ,这里只记下如何在自己的项目中使用Tinker热修复。步骤一、 通过gradle接入Tinker在项目的build.gradle里添加gradle依赖:原创 2017-02-10 11:59:49 · 1760 阅读 · 0 评论 -
自定义手机锁屏界面
前两天尝试使用『悦跑圈』app跑步,发现一个蛮有意思的功能。手机锁屏之后,再点亮手机,手机锁屏界面变成了悦跑圈的界面,并且实时显示跑步的里程、速度等信息。觉得这个功能还蛮实用的,于是想试着实现一下。搜索了一些资料,具体实现过程如下:1. 首先,锁屏界面是一个单独的界面,新建一个Activity作为锁屏界面。对这个Activity需要有几个设置。1)背景透明,解锁滑动时背后的内容能够原创 2017-05-19 15:27:15 · 3258 阅读 · 0 评论 -
2015-12-05 Eclipse项目导入到Android Studio中时出现的一些问题
代码从Eclipse转到Android Studio中,出现了很多问题android studio 错误 非法字符 65279代码应该保存为utf-8无BOM格式的。用notepad++转换一下就ok了原创 2015-12-05 20:08:23 · 486 阅读 · 0 评论 -
2015-12-03 AndroidStudio模拟器运行失败的问题
今天在一台新电脑上安装AndroidStudio并试运行出错提示如下:emulator: ERROR: x86 emulation currently requires hardware acceleration!Please ensure Intel HAXM is properly installed and usable.CPU acceleration status:原创 2015-12-03 16:44:11 · 672 阅读 · 0 评论 -
Android EditText控制密码的显示和隐藏
首先在xml里创建两个控件 EditText和CheckBox然后就很简单了 dt1=(EditText)findViewById(R.id.password); cb1=(CheckBox)findViewById(R.id.checkbox_1); cb1.setOnCheckedChangeListener(new OnCheckedChang原创 2015-06-07 22:04:30 · 979 阅读 · 0 评论 -
Android 应用的安装位置
应用程序的安装位置想必大家都不陌生,要么安装在手机内存里,要么安装在SD卡里。那么该如何配置应用程序的安装位置呢,,没错,非常简单,就是在AndroidManifest.xml文件里配置,只需要在里添加android:installLocation这个属性就可以了。如下:<manifest xmlns:android="http://schemas.android.com/apk/res原创 2015-06-09 23:05:55 · 883 阅读 · 0 评论 -
通过simpleAdapter创建复杂的ListView
实现后的效果如下:请忽略铃声音量。。。其实都好简单,首先建一个包含ListView的布局activity_main:如下<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" an原创 2015-06-23 14:44:50 · 427 阅读 · 0 评论 -
Android 向联系人名单新加联系人(添加名称和电话号码两项)
//首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId ContentValues values = new ContentValues(); Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);转载 2015-07-02 01:02:43 · 1309 阅读 · 0 评论