Android系统中的Activity可以说一件很赞的设计,它在内存管理上良好的设计,使得多任务管理在Android系统中运行游刃有余。但是Activity绝非启动展示在屏幕而已,其启动方式也大有学问,本文讲具体介绍Activity的启动模式的诸多细节,纠正一些开发中可能错误的观点,帮助大家深入理解Activity。 行文之前 在正式行文之前,先介绍一些文章提到的概念 文章后续会提到Task,这里的Task指的是与用户交互的Activity实例的集合。 Task中的Activity实例以栈的形式存放,这个栈就是Activity的回退栈。 本文图片较多,在看图时,请注意观察Activity顶部的title,来区分具体Activity。 为何有启动模式 应用中的每一个Activity都是进行不同的事物处理。以邮件客户端为例,InboxActivity目的就是为了展示收件箱,这个Activity不建议创建成多个实例。而ComposeMailActivity则是用来撰写邮件,可以实例化多个此Activity对象。合理地设计Activity对象是否使用已有的实例还是多次创建,会使得交互设计更加良好,也能避免很多问题。至于想要达到前面的目标,就需要使用今天的Activity启动模式。 如何使用 使用很简单,只需要在manifest中对应的Activity元素加入android:launchMode属性即可。如下述代码 接下来就是介绍launchMode的四个值的时刻了。 standard 这是launchMode的默认值,Activity不包含android:launchMode或者显示设置为standard的Activity就会使用这种模式。 一旦设置成这个值,每当有一次Intent请求,就会创建一个新的Activity实例。举个例子,如果有10个撰写邮件的Intent,那么就会创建10个ComposeMailActivity的实例来处理这些Intent。结果很明显,这种模式会创建某个Activity的多个实例。 Android
解决SuperListview不支持setOnItemLongClickListener问题
一直在项目中使用SuperListview,今天一起啊中发现居然不支持item长按事件,怎么办呢? 要么换掉SuperListview要么找找有没有替换方法 替换SuperListview改动代码略多,所以优先选择后者 通过查看SuperListview的源码,发现功能基本上都是由AbsListView实现的, 更加重要的是AbsListView是protest的,意味着我们通过继承可以使用这个对象。 下面就是我修改后的类 import android.content.Context; import android.util.AttributeSet; import android.widget.AdapterView; import com.quentindommerc.superlistview.SuperListview; /* * Created by pengwei on 15/8/20. * 解决SuperListview不支持Item长按事件 */ public class SuperListViewPlus extends SuperListview { public SuperListViewPlus(Context context) { super(context); } public SuperListViewPlus(Context
[转]RESTful API 入门教程
原文地址:http://www.ruanyifeng.com/blog/2014/05/restful_api.html
linux 设置环境变量
1.编辑/etc/profile vim /etc/profile 2.打开该文件后按Shift+g键跳转至该文件的最后一行,按 i 键进入插入编辑模式 3.输入所缺失的bin目录,多个目录以 : 分割即可 export PATH=/usr/local/mysql/bin:/usr/local/php/bin:$PATH 4.如果不知道命令具体位置,可以使用locate或者whereis进行查找 locate /bin/mysql 5.保存操作 source /etc/profile 不需要重启,立即生效
android部分中文字乱码
原文:http://book.51cto.com/art/201112/306309.htm 中文汉字中出现少部分中文乱码。这种现象看起来很怪异,往往在开发过程中,读者都有可能这样操作了,但没有发现。这种现象是怎么造成的呢?先看例子程序。 实例: 读取文件的核心代码如下(为了测试多一些的汉字,本例将把很多汉字写在test.txt里放在assets文件夹下): ………………..省略部分代码……………… inputStream = this.getAssets().open("test.txt"); byte buffer[] = new byte[100]; StringBuffer sb = new StringBuffer(); int i = 0; while ((i = inputStream.read(buffer)) != -1) { sb.append(new String(
限制EditText输入的最大字符数
在开发过程中,经常遇到需要限制输入框长度的问题,在提交的时候判断长度再提示用户是一种解决方案,但是体验远远不如直接在输入框内限制用户的输入字数,超出后就就不能再输入。 下面介绍下实现这个功能的几种方法: 方法一:在xml设置maxLength属性 * * 方法二:通过setFilters来过滤长度 editText.setFilters(new InputFilter[]{ new InputFilter.LengthFilter(20) }); * * 方法三:通过监听输入过程来控制光标位置 import android.text.Editable; import android.text.Selection; import android.text.TextWatcher; import android.widget.EditText; /* * 监听输入内容是否超出最大长度,并设置光标位置 * */ public class MaxLengthWatcher implements TextWatcher { private int maxLen = 0; private EditText editText
[转]Android性能优化典范 - 第3季
原文地址:http://hukai.me/android-performance-patterns-season-3/ Android性能优化典范的课程最近更新到第三季了,这次一共12个短视频课程,包括的内容大致有:更高效的ArrayMap容器,使用Android系统提供的特殊容器来避免自动装箱,避免使用枚举类型,注意onLowMemory与onTrimMemory的回调,避免内存泄漏,高效的位置更新操作,重复layout操作的性能影响,以及使用Batching,Prefetching优化网络请求,压缩传输数据等等使用技巧。下面是对这些课程的总结摘要,认知有限,理解偏差的地方请多多交流指正! 1)Fun with ArrayMaps 程序内存的管理是否合理高效对应用的性能有着很大的影响,有的时候对容器的使用不当也会导致内存管理效率低下。Android为移动操作系统特意编写了一些更加高效的容器,例如SparseArray,今天要介绍的是一个新的容器,叫做ArrayMap。 我们经常会使用到HashMap这个容器,它非常好用,但是却很占用内存。下图演示了HashMap的简要工作原理: 为了解决HashMap更占内存的弊端,Android提供了内存效率更高的ArrayMap。它内部使用两个数组进行工作,其中一个数组记录key hash过后的顺序列表,另外一个数组按key的顺序记录Key-Value值,如下图所示: 当你想获取某个value的时候,ArrayMap会计算输入key转换过后的hash值,然后对hash数组使用二分查找法寻找到对应的index,然后我们可以通过这个index在另外一个数组中直接访问到需要的键值对。如果在第二个数组键值对中的key和前面输入的查询key不一致,那么就认为是发生了碰撞冲突。为了解决这个问题,我们会以该key为中心点,
TextView显示两行加省略号
设置下面两个属性就好 这样如果超过2行就会只显示2行,而且后面加上省略号。2行以下不受影响。 如果三行加省略号: textview在多行情况下如何显示省略号
通过gradle上传android library到jcenter
教程:http://blog.csdn.net/u013308121/article/details/46360703#plain 有些需要注意的地方 其中之一就是上一篇文章,不要把需要上传的library取名为library 传送门:Android上传开源库到jcenter的一些经验教训 1.如果报错如下: No value has been specified for property ‘packageName’. // load properties Properties properties = new Properties() File localPropertiesFile = project.file("local.properties"); if(localPropertiesFile.exists()){ properties.load(localPropertiesFile.newDataInputStream()) } File projectPropertiesFile = project.file("project.properties"
Android上传开源库到jcenter的一些经验教训
把库成功上传到jcenter后(上传过程下篇文章介绍),出现了一个很奇怪的问题,明明成功上传,为什么在代码中应用报错了? gradle 引用代码 compile ‘com.apkfuns.logutils:library:1.0.0’ 报错的内容 Error:(63, 13) Failed to resolve: com.apkfuns.logutils:library:1.0.0 但是我确定jcenter已经上传成功,在jcenter库中能看到详细信息。 http://jcenter.bintray.com/com/apkfuns/logutils/library/1.0.0/ 尝试了各种方法,比如在最后加上@aar之类的各种方法都没用 最后公司导师提示,才想到可能maven-metadata.xml和library-1.0.0.