进入正题,大家应该都听过这样一句话——“UI更新要在主线程,子线程更新UI会崩溃”。久而久之就感觉这是个真理,甚至被认为是“官方结论”。 但是如果问你,官方什么时候在哪里说过这句话,你会不会有点懵。...如果设置为固定值,是不会崩溃的,见案例2,所以是不是跟布局改变的逻辑有关呢? 延时3秒。如果不延时的话,即使是wrap_content也不会崩溃,见案例1,所以是不是跟某些类的加载进度有关呢?...重新运行,在子线程中显示并消失后,点击按钮,不崩溃。 换个手机——三星s9,重新运行,在子线程中的Toast没消失之前点击按钮,不崩溃。...3)那为什么等Toast消失之后,点击按钮又不崩溃了呢?...其中的关键就是view被绘制到界面时候的线程(也就是最顶层ViewRootImpl被创建时候的线程)和进行UI更新时候的线程是不是同一个线程,如果不是就会报错。
---- 关于内容提供器: 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性...不同于文件存储和SharedPreferences存储中的两种全局可读写操作模式,内容提供器可以选择只对哪一部分数据进行共享,从而保证我们程序中的隐私数据不会有泄漏的风险。...> android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com...e.printStackTrace(); } } }); } } 可以看到,在按钮的点击事件中...下面运行程序,点击按钮,会弹出对话框: ? 如果点击拒绝,则会弹出Toast: ? 如果点击允许,则成功进入到拨打电话界面: ? 在这之后: ? ?
当然,这次更新出现的浮窗只出现在 iOS 6.6.7 版本中,而 iOS 的其它更新与 Android 6.6.7 版本的微信更新内容也还有较大区别。...当用户点击文章右上方的「...」栏时,会新出现浮窗按钮,点击之后,该文章会被缩小为一个圆形图标,此后,无论用户处于微信的那个页面,都可以直接通过浮窗打开这篇文章。...从屏幕最左端滑动网页向右将会出现浮窗小圆点选择区域,点击后会出现一个的浮窗。如果是公众号网页内容,浮窗图像为公众号 logo,如果是 H5 等其它网页,浮窗内容为链接样式。...H5 页面 除此之外,还可以点击网页右上角「...」,也会出现浮窗这一选项。 长按浮窗按钮,右下角会出现「取消浮窗」的选项。用户也可以到网页右上角「...」选择取消浮窗。...但是,一个新的发现在于,当你往下刷朋友圈时,「朋友圈」3个字会随之变小,静止不动或者向上滑动时,字体大小不会变化。
细节分析 - ToolBar 上的按钮点击效果 仔细研究的人知道,网易云音乐的UI做的很精致,就拿一个ToolBar为例,上面的每个按钮的点击操作都有各自的效果。...现总结出两个问题:1、ToolBar上按钮的设置;2、不同按钮点击的水波纹效果 对于1: ToolBar上按钮的设置 些许研究了ToolBar的使用后得知,可以直接在其内部包裹Imageview外,还可以通过菜单文件设置...对于2:不同按钮点击的水波纹效果 这里不是使用ripple属性了,而是使用系统自带的点击水波纹选择器,给要产生点击效果的控件设置: android:background="?..." 点击效果就会全部是黑灰的,就是中间三个按钮的那种效果,如果想要点击效果是白色的话,需要设置主题: theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar...大部分数据来自于干货集中营和豆瓣APIV2.0,一切数据解释权都归代码家和豆瓣所有。
Court-Counter 是一个只有几个按钮来修改篮球比赛分数的 App。最终的App有一个bug,如果你旋转手机,当前保存的分数会莫名归零。 ? 这是什么原因呢?...但是,如果你的数据不需要知道或管理 Activity 所处的生命周期状态,这样写会不会导致代码过于冗杂?...Activity 的生命周期中,onCreate可能会被调用多次,比如当应用程序被旋转时,但 ViewModel 会一直存在,不会被重建。...这样,UI控制器就可以在UI交互发生时显示和更新数据,例如按下按钮以增加 Court-Counter 中的分数。...比赛呈现在列表里,然后点击列表中的比赛就会开启一屏与 MainActivity 一样的画面,后面我就叫它 GameScoreActivity。
如果你没有看到任何内容被列出,你需要使用安卓SDK manager去安装一些。...,当用户点击了 发送Send 按钮将会启动一个新的Activity 响应Send按钮 要响应按钮的点击事件,打开fragment_main.xml 布局文件,并且添加 android:onClick...当用户点击按钮时,系统将会调用它。...创建第二个Activity 使用Eclipse创建新的Activity 1.在工具栏点击 New 按钮 2.在出现的窗口里,打开Android 文件夹并选择 Android Activity,点击 Next...如果你使用Eclipse开发,现在你可以执行应用了,但是不会发生什么。点击 Send发送按钮开启第二个Activity,但是使用了被通过模板提供的一个默认的“hello world” 布局。
这是由于onCreate()方法只会在Service第一次被创建的时候调用,如果当前Service已经被创建过了,不管怎样调用startService()方法,onCreate()方法都不会再执行。...那么如果我们是点击的Bind Service按钮呢?...那么如果我们既点击了Start Service按钮,又点击了Bind Service按钮会怎么样呢?...这个时候你会发现,不管你是单独点击Stop Service按钮还是Unbind Service按钮,Service都不会被销毁,必要将两个按钮都点击一下,Service才会被销毁。...如果你希望Service可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台Service。
相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了。...这是由于onCreate()方法只会在Service第一次被创建的时候调用,如果当前Service已经被创建过了,不管怎样调用startService()方法,onCreate()方法都不会再执行。...那么如果我们是点击的Bind Service按钮呢?...那么如果我们既点击了Start Service按钮,又点击了Bind Service按钮会怎么样呢?...如果你希望Service可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台Service。
效果图: 点击屏幕任何一个位置,引导界面消失 ?...,可点击这个按钮,显示引导界面**/ guideUtil.initGuide(MainActivity.this, R.drawable.add_guide);...,那不会显示引导界面。...点击上面的按钮,不会再弹出引导界面**/ //是否是第一次进入app guideUtil.setFirst(false);...:fromAlpha="1.0" android:toAlpha="0.0" /> 源码下载: 原作者想赚点资源分,提供了eclipse项目代码,如果手头分数还算宽裕,去原作者那里下载吧 如果没有分的并且不会转化为
具体操作 1.在Devices设备列表中,找到你所在的设备,点击你想要监控的进程。 2.点击“Update Heap”按钮更新堆内存的情况。...5.观察data oject那一行,每一次点击“Casue GC”的时候,观察Total Size的值,如果该值不断增加,则说明该应用程序存在“内存泄漏”。...理论上如果不存在上述泄漏的代码,之前的Activity会在onDestory之后被回收内存。...而一旦存在上述泄漏的代码,新创建的Ruannale实例会一直处于运行状态,它不会被回收,而它强引用的LeakAty当然也不会被回收,所以在屏幕不断旋转,之前创建的LeakAty就不会被释放,会导致旋转n...下篇将具体探讨一下,在Android的开发过程中,哪些写法容易造成内存泄漏,该如何解决?请阅读Android内存泄漏终极解决篇(下)。
RatingBar 点击评分栏后,通过Toast显示当前分数 单击按钮获取当前分数并将其显示在TextView上 <RatingBar android:id="@+id/rb_normal...它将进步转化为分数。用户拖动进度条进行评分。...当我们点击一个电话号码时,我们将直接跳转到拨号页面。关键是在加载页面时使用onload()加载相应的js脚本。...但如果你在户外,没有网络,GPS仍然可以使用!...您需要尽可能实时更新GPS。
注意: 如果你希望在onCreateDialog()方法之外创建对话框, 它将不会依附在Activity上....如果你不熟悉使用Handler和另外的线程,请看下列例子,该例子使用了一个新的线程来更新进度。 ...注意: 如果你决定在onCreateDialog()方法之外创建一个对话框,它将不会被附着到活动上。...而点击AlertDialog的NegativeButton (Cancel/No)是不会触发的。...注意,只能各自设置一个按钮来响应点击事件。
Button 按钮 Button能对用户的点击行为作出反应。 在xml文件中放置一个button。...button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 这里是按钮点击事件...button 被点击后会执行onClick方法。 系统会在App的主线程中执行onClick方法。我们可以在这里面更新UI。但不要做太耗时的操作。...按下按钮和没按下的时候,按钮的背景颜色是不同的。...如果TextView没有设置点击事件,用户点击或按着这个TextView是不会发生背景变化的。 给TextView设置点击事件后,再点击就可以看到背景变化了。
下一节课将学会使 APP 对按钮做出响应——按钮被按下时,文本框里的内容被发送到另外一个 Activity。...一旦资源 ID 被创建了,其他资源如果引用这个 ID 就不再需要 + 号。...> 注:宽和高被设置为 "wrap_content",这时按钮占据的大小就是按钮里文本的大小。...这个按钮不需要指定 android:id 的属性,因为 Activity 代码中不会引用该 Button。...如果使用 Android Studio开发,现在已经可以点击Send按钮启动这个activity了,但显示的仍然是模板提供的默认内容"Hello world",稍后修改显示自定义的文本内容。
如下所示: 我们一般都会将布局写在 xml 中,默认编译器也会提示我们,但因为其不是强制性,所以如果你不点提示(option+回车),似乎根本不会涉及到[contenDescription] ,如下所示...对于 Android原生UI 而言,如果应用主要使用的是 [系统组件],那么在无障碍下,体验一般不会太差,比如常见的 Text , Button 。在无障碍下都会读取相应的显示文本信息作为描述。...对于我们普通用户而言,大家知道这里可以点击,但是他们并不知道,所以在这里如果使用 ImageButton ,此时在无障碍下的反馈就是: xxxApp,返回 按钮。...那么有没有其他方式,当我点击开关时,手动去通知 更新当前无障碍下的 [选择] 状态呢?...,具体详见 读源码长知识 | 原来可以这样扩大 View 点击区域 处理焦点 对于部分 View ,我们可能并不想在无障碍下被读取,或者需要将一些view进行 合并 ,此时就可以为其增加 importantForAccessibility
如果您更喜欢通过视频了解此内容,请 点击此处 查看。...API Android 12 的推出带来了很多关于 AppWidget API 的更新,本文不会对所有的 API 一一介绍,而是重点介绍几个对 Widget 构建非常有用的 API。...modifier = Modifier.clickable(launchActivity) ) 此外,我们还可以提供自定义操作来执行一些自定义代码,例如,我们可能希望每当用户点击此按钮时就会更新地理位置并刷新...方法被调用一次,如果 Widget 的可用尺寸发生更改,例如用户调整了 Widget 尺寸,则不会刷新内容。...如下图所示,使用了 SizeMode.Single 选项的 Widget,无论其尺寸如何变化,其输出的尺寸大小永远不会得到变化,这是因为 Content 方法只被调用了一次,内容在尺寸发生变化时并没有得到刷新
为了让天下没有不会用小程序的人,知晓程序(微信号 zxcx0101)特地准备了这份小程序常见问题答疑。 如果你不会用小程序,或者你身边有很多对小程序一无所知的人,那么,这篇文章就是解药。 1....如果你的微信版本低于 6.5.3,只要点击「去评分」,就能跳转到 App Store 的微信页面。 这时,点击微信图标右侧的「更新」按钮,就能将微信更新到最新版本。...Android 用户 打开微信,点击底部菜单栏最右侧的「我」,点击「设置」,再点击「关于微信」。 这样,页面顶端就会显示你的微信版本信息。...注:如果点击「发现」按钮后,没有找到「小程序」,请看下一条问题。 Android 用户 点击微信右上角的「放大镜」图标,输入小程序的全称,点击搜索;接着,点击搜索页面最下方的「搜一搜」即可。...如果你从未打开或使用过任何小程序。那么,在发现页面是不会出现小程序按钮的。 想让它现身?只要打开一个小程序就行了。
因为support库是不断更新的,因此建议使用support库中的android.support.v4.app.Fragment,而不要用系统自带的android.app.Fragment。...),那么回退操作就是remove(frag1));如果没添加该语句,用户点击返回按钮会直接销毁Activity。...如果没有加入回退栈,则用户点击返回按钮会直接将Activity出栈;如果加入了回退栈,则用户点击返回按钮会回滚Fragment事务。...功能如下:共有三个Fragment:F1, F2, F3,F1在初始化时就加入Activity,点击F1中的按钮跳转到F2,点击F2的按钮跳转到F3,点击F3的按钮回退到F1。...这里懒加载的实现思路是:用户不可见的界面,只初始化UI,但是不会做任何数据加载。等滑到该页,才会异步做数据加载并更新UI。
, new String[] { "1" }); 下面我们尝试读取手机中的联系人的姓名和电话: 首先我们在布局中简单地设置一个按钮和一个ListView,点击按钮后读取联系人,ListView用于显示...,我们在Activity的onCreate()方法为按钮添加点击事件,点击之后调用我们自己写的一个读取联系人的方法readContrast(),在该方法中我们获取系统联系人的存放的Uri,然后通过获取的...然后当query()方法被调用的时候, 17 * 就会通过UriMatcher的match()方法对传入的Uri对象进行匹配,如果发现UriMatcher中某个内容URI格式成功匹配了该Uri...因为所有的CRUD操作都一定要匹配到相应的内容URI格式才能进行,而我们当然不可能向UriMatcher中添加隐私数据的URI,所以这部分数据根本无法被外部程序访问到,安全问题也就不存在了。...如果内容 URI 以路径结尾,则后接 android.cursor.dir/,如果内容 URI 以 id 结尾,则后接 android.cursor.item/。 最后接上 vnd.
代码编写 编译 APK 文件,让应用在手机上跑起来 0X00 开发工具安装和配置 第一步,需要先在 Android 官网下载 Android Studio(直接点击 传送门 进入下载链接), 如果你不会访问国外网站的话...第一步,安装 JDK 8 首先需要安装 JDK 8,JDK 就是研发 Android 应用的官方环境,点击 这里 下载(我的链接也是适用于 Mac 电脑,如果你的电脑不一样需要切换一下)。...id 找到这个按钮的对象(findViewById(R.id.button)),然后给 button 按钮增加一个点击监听器(setOnClickListener),当按钮被用户触发后,就会回调这个方法...而一旦这个匿名方法被触发,通过 Toast 弹出一串 hello world 的文字内容。...如果正确按照教程,那相信你已经成功的做出了属于自己的第一个 Android 应用,本教程基于 mac 电脑进行实现,如果你的电脑是 Windows 或者其他操作系统,还需要进行一些其他的灵活配置。
领取专属 10元无门槛券
手把手带您无忧上云