Intent FLAG_ACTIVITY_CLEAR_TOP

大家都知道FLAG_ACTIVITY_CLEAR_TOP的作用如下
A->B->C->D
然后在D中跳转B时加上FLAG_ACTIVITY_CLEAR_TOP时,C会出栈,A会收到Intent。栈变成了A->B
看运行结果:
48BCC60B-FCB4-49AD-BD96-4380C0C3CFA3
注意Main2Activity的ID。
现在执行D->B,结果:
0CE591DB-C53F-4691-9C28-9CCF78367D87
Main2Activity的ID不一样了。
看我的Log:
FA979A50-2D2C-40EA-A8DF-3DF0E3CEA604
显然是走oncreate()重新创建了一个Main2Activity,但是栈中依然是A->B
看看官方文档的说明:

The currently running instance of activity B in the above example will
either receive the new intent you are starting here in its
onNewIntent() method, or be itself finished and restarted with the
new intent

在上面可以看出,有两种情况,一种是调用onNewIntent()。一种是finish原来的,restart一个新的,也就是会调用onCreate()方法,接下来看什么时候会出现这两种情况:

If it has declared its launch mode to be “multiple” (the
default) and you have not set {@link #FLAG_ACTIVITY_SINGLE_TOP} in
the same intent, then it will be finished and re-created; for all other
launch modes or if {@link #FLAG_ACTIVITY_SINGLE_TOP} is set then this
Intent will be delivered to the current instance’s onNewIntent().

如果你的Activity的launchMode是”mutiple”(默认)或者你没有在相同的intent中set FLAG_ACTIVITY_SINGLE_TOP时会出现上面第二种情况,否则会出现上面第一种情况。
关于”mutiple”和”standard”,他俩其实是一样的,参考:
http://stackoverflow.com/questions/15905558/what-is-launchmode-multiple

下面来看看调用onNewIntent()的结果:
代码:

运行结果:
180504B3-5D00-42A1-87BF-AD1B42B6F322

AE7944C7-BD66-4BD0-B51E-025B6374F7A2
可以看到Main2Activity的ID没变,栈中依旧是A->B。
以上就是本文的全部内容,希望对读者有所帮助!

使用EventBus需要注意的地方

Android optimized event bus that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality(摘自Github上的EventBus)
以下主要描述最近项目中遇到的一个坑:
官方注册EventBus的事例代码:

但是这样注册的Activity只有在onStop()调用之前能够收到消息。但是有时候我们必须在两个Activity之间传递信息,但是activity压入栈中肯定是调用了onStop()方法的,所以这样注册是不行的。没有办法我们只能在oncreate()和onDestory()中注册和取消注册了。所以很严重的问题就来了:
在Keep开发过程中,我就用了这样一种方法,写完,发布感觉没有任何问题,但是bugly报上来的crash却很多。为什么呢?就是因为我这个activity在栈中不只有一个,每一次发送这个activity感兴趣的事,栈中的activity都会接受到,然后处理,但由于每个activity中的数据可能不一样,所以可能会造成crash。
最终我的解决办法是想办法在某个过程中销毁栈中其他的这个activity。
非常感谢同事的帮忙找出这个bug。
其实这些问题每个人都很容易理解,写代码时有时候也会注意,但有时粗心难以避免,发现错误的源头才会恍然大悟。愿这篇文章帮助我自己在也不会发生这样的错误。
在写文章时又看了一遍Eventbus的文档,好像Sticky Events能够解决这样的问题,明天实践一下,再来发表。大家有什么指导欢迎留言!谢谢!

HashMap采用数组加链表却Key不能相同的原因

大家都知道JAVA的HashMap采用数组加链表实现,但是又非常奇怪为什么Key值不能相同,下面从源码看看:
5033D668-F784-4689-942C-B8C0FE70F9AC
这是HashMap数组中存着的数据结构,包括一个hash值,我们常用到的Key,Value,以及一个链表。
看put方法:
B4C6A120-351F-4195-9521-71BAF8065162
551C0577-89FE-4D10-ABC3-0DDE16350C7F
重点看一下652行,很明显如果原来的key对应有值,则直接覆盖。到这儿真是越来越模糊了,明明是采用数组加链表实现的,为什么会覆盖原来的值呢,这显然不和道理嘛,接着往下看:
看get方法:
1EB8FCBE-4F06-4BF9-8858-BB458658D69B

C7978E2D-4382-40AF-829A-F26F7ED472C5

大概是这样的,先根据key的hash值取出对应的链表,然后在该链表中根据key值查找对应的value。原来一切的奥妙蕴含在hash值里面。
从get方法中可以看出,不同的key,hash值可能会相同,所以链表用来存储hash值相同的key-value。但这种情况比较低,所以看第570行,总是检查链表的第一个节点。为了更好的理解,可以去看看java的hashcode,想想为什么你的对象在做map的key时要重写hashCode()方法。

Intent传递大数据

有时候在Activity跳转的时候,我们可能要传递大的数据,又因为Intent传输数据大小有限制,这时可怎么办呢?
这时我们可以增加一个单例用来维护我们要传递数据的引用,在跳转成功后,我们再把这个数据取出来,并且销毁这个单例所维护的引用,这样就完成了数据的传递。未命名图片
注意点:
1.我们取出的数据与上一个Activity的数据是同一个引用,这时我们应该用这个对象重新生成一个仅属于这个Activity的对象。不然我们对这个对象的修改会影响上一个Activity。

Android View 的位置

getLeft,getTop,getBottom,getRight可以为负值
都是距父布局的距离
getBottom = getTop + getHeight
getRight = getLeft + getWidth
view可以定义一个padding,但它并不支持margin

Android Studio更新后gradle的正常使用

Android自从0.1版本发布以来,更新速度非常的快,可是作为合作者的工程构建工具gradle却难以跟得上google的节奏。每次Android Studio更新后,会将gradle更新到最新,这是会出现一些错误。比如说:打开一个以前的工程它会说你的gradle过期了,需要一个更新版本的gradle。这时你将build.gradle中的配置改为最新的,然后它又会去下载最新的gradle,特别慢!
解决方案:
NTQIDD<code>@18ZP7</code>B5H21L7O1″ width=”300″ height=”39″ class=”alignnone size-medium wp-image-375″ /></a><br />
改为:<br />
<a href=}O6DB3HLA@B_1_)VUTVX{]D
然后重新编译就ok了,当然其中会遇到很多问题:
比如runProguard找不到了,只需将其改为minifyEnabled就ok了

JetBrains公司及其产品介绍

相信所有java程序员都曾经深爱过eclipse。它是一个非常强大的ide,通过插件组件构建开发环境。而且它附带一个非常标准的插件集,扩展功能非常的强大,能够有安装各种语言插件,实现各种语言的编译运行。就连强大的google公司也选择跟eclipse合作,开发出了android开发工具。
eclipse
但是,现在又有一家公司–jetbrains,它的产品同样强大。其最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA。它还有许多功能强大的产品,下面一一介绍:
首先介绍我个人用过的:
1.IntelliJ IDEA
如图:
idea

idea1
首先它的界面相对与eclipse来说,有着质一样的变化。其次就是它的运行速度,比eclipse快。至于其代码提示功能,我感觉这差不多。
2.
WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能—-摘自百度百科
如图:
webstorm

webstorm2

3.PyCharm
写python的人用的开发工具有很多,有的人用sublimeText,大神用vim,但更多人用的是PyCharm。
PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发—-摘自百度百科
pycharm

pycharm2

4.Android Studio
这是google公司与JetBrains公司合作的全新的Android开发工具。
对于Android程序员来说,这是一个纠结的问题。很多人入门时用的Eclipse,时间长了,也就习惯了。但是Android Studio却有着很大的优势。它的运行速度比eclipse快的非常多。它的工程构建也比eclipse简单。很重要的是github上很多Android项目都是用Android Studio开发的,并且它能导入Eclipse工程,反之则不行。
android

android1

JetBrains公司还有一些非常强大的工具,我没有使用过,贴图告诉大家:
more

好消息:
作为学生,我们可以免费使用以上强大的工具了:
1

2

进入邮箱,点击链接:
3

4

Student License 有效期为一年,一年之后需要重新认证授权。

android ListView上拉加载

最近做项目时用到了listview上拉加载的功能,由于项目进度太快,我每写一个listView,都重新写一遍上拉加载代码,最后功能实现了,现在回想起来,谁要是接着我的项目继续干下去,一定会感觉恶心到了极点。现在闲下来了,想封装一下,希望能够有机会重构以前那个项目。
首先自定义ListView:
代码:

附上footer的布局代码:

现在看看相当的简单,真是后悔啊!以后写代码一定要想想以后的扩展性。

android-edittext-validator的使用

先看一张图片:
Screenshot_2014-09-04-18-19-49
大家觉得这张图片中的邮箱判断是不是很酷啊!
这都是android-edittext-validator的功劳

android监听网络变化

首先介绍几个网络判断函数:
判断网络是否连接:

判断wifi是否连接:

判断MOBILE网络是否可用

每一次网络发生变换后,android系统会发出android.net.conn.CONNECTIVITY_CHANGE消息:
这时我们可以捕获这个消息
我们写这样一个类:

这时,当系统网络状态改变了,我们都能捕获到。但是,我们怎么发送给别的activity呢,这时EventBus登场了
在我们需要获得网络的现有状态

然后通过EventBus发送出去:

接着在需要实时刷新网络状态的activity中接收

然后就可以刷新UI了,或者告诉用户网络的变化。
附上NetworkChangeEvent.java: