【译文】Android M中Intent的解析

原文链接 : Intent Resolving in Android M
原文作者 : Said Tahsin Dane
译文出自 : 开发技术前线 www.devtf.cn。未经允许,不得转载!
译者 : liuling07
校对者: desmond1121
状态 : 完成

译文连接:Android M中Intent的解析

注意了!在Android 6.0中,“隐式Intent”的解析不能像之前版本那样正常工作了。这很有可能导致你的app不能正常使用。

现在让我解释一下这个意料之中的问题以及为什么它不能正常使用: 最近,我正在开发一个小的开源项目,叫做“Open Link With”。希望不久后它能够在应用市场上架。

我的这个app能够让你在其他app之间随意切换。当你给我分享一个链接的时候,我基本上可以根据这个链接查询出所有可以处理这个链接的Activity。然后我会模拟一个系统对话框让你切换app。

阅读全文

【译文】高性能ListViews

原文链接 : Performance ListViews
原文作者 : Brandon
译文出自 : 开发技术前线 www.devtf.cn。未经允许,不得转载!
译者 : liuling07
校对者: desmond1121
状态 : 完成

译文连接:高性能ListViews

列表展示功能几乎在所有app中都会被用到,使用列表可以很方便的展示一些列表项,比如菜谱、联系人,或者任意类型的类别。所以Android有一个内置的方式来展示此类型的数据,也是在情理之中的。RecyclerView是一种最新的展示列表数据的方式,它非常高效,因为它重用视图而不是每一行出现在屏幕上都重新创建。在RecyclerView出现之前,我们可以使用ListView,即使到了现在,ListView也是广泛的被开发者所使用。虽然ListView也是可以回收视图的,但它也一直都是Android中最容易被错误使用的一个控件。我们知道在此之前这个话题已经被写过无数遍了,但是今天我还是要在博客中提出来,因为我们仍然发现很多app在错误的使用它们。

关于ListView中ArrayAdapter的用法,标准的新手写法是这样子的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public View getView(int position, View convertView, ViewGroup parent) {

LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.view_test_row, parent, false);

TextView testName = (TextView)rowView.findViewById(R.id.text_view_test_name);
TextView testDesc = (TextView)rowView.findViewById(R.id.text_view_test_desc);

//modify TextViews, in some arbitrary way

return rowView;
}

阅读全文

Android带多选功能的PhotoPicker

最近利用闲碎的一些时间开发了一个Android库PhotoPicker,前面一篇文章也介绍了,Android高仿微信图片选择功能的PhotoPicker,之前没有加入选择多张图片的功能,现在加上之后一个完整的PhotoPicker库终于算是完工了。

动态效果图

Android带多选功能的PhotoPicker示例图片

阅读全文

Android高仿微信图片选择功能的PhotoPicker

类似于微信修改头像的功能基本上每个app都会有,以前公司开发的项目就有修改头像的功能,但是用的Android系统自带的图片选择器。用Android系统的图片选择器有个好处就是稳定,不会有什么问题。但也有它的缺点,比如不可定制,我们想要修改一下符合自己app的风格无法做到。

既然大部分app都要用到图片选择器,为啥我不自己写一个呢?难不成每次都用系统自带的?那显得太没水平。所以,我就有了一个自己编写一个图片选择器的想法,以后只要有项目需要这个功能,直接拿来用就行了,这多爽!

其实github上也有很多大牛写的图片选择开源库,虽然大家一直都推崇不要重复造轮子这个观念,但是我却不这么认为,同样是轮子,也有不同价格、不同品牌的呢,难不成有了一个制造商生产了轮子,其他厂商就没必要做了吗?所以说,重复造轮子也是有意义的,至少你知道轮子是怎么造的。

阅读全文

科学上网工具Lantern,轻松访问Google、Facebook等被墙网站

给大家推荐一个科学上网的工具,轻松就可以访问google、facebook等被墙的网站:下载Lantern

下载lantern.exe.fbd文件,将.fbd后缀去掉,双击运行即可。可能360会阻止运行,要点击允许。

如下图:
科学上网工具

该工具只能用于PC端浏览器浏览被墙网站,一般查资料够用了。如果需要玩游戏或者其他用途,建议还是买VPN。

MySQL导入数据报Got a packet bigger than‘max_allowed_packet’bytes错误的解决方法

今天将博客的数据库进行了迁移,在执行sql脚本的时候报了Got a packet bigger than‘max_allowed_packet’bytes的错误,上网搜了一下,发现是由于max_allowed_packet的值设置过小的原因,知道原因就好办了,只需要将max_allowed_packet值设置大一点就OK了。
通过终端进入mysql控制台,输入如下命令可以查看max_allowed_packet值的大小。
show VARIABLES like ‘%max_allowed_packet%’;
显示的结果为:

+——————–+———+
| Variable_name | Value |
+——————–+———+
| max_allowed_packet | 1048576 |
+——————–+———+

以上说明目前的配置是:1M
执行一下命令可以将max_allowed_packet的值设置大一点:
set global max_allowed_packet = 210241024*10
退出mysql命令行,然后重新登录。
show VARIABLES like ‘%max_allowed_packet%’;

设置完之后,再重新导入数据,OK,一切正常。

注意,使用这种方法,重启服务器之后又恢复默认值了。这里博主只是导数据的时候临时将其值设置大一点,导完之后尽量让其恢复原值,因为max_allowed_packet设置过大可能会导致服务器太忙来不及接收,网络差的时候也可能会出现丢包的现象。

C++学习随笔

最近由于公司部门调整,博主被安排去做游戏开发了,使用的是cocos2d游戏引擎,开发语言为C++。所以硬着头皮边熟悉cocos2d边学C++。对于写了多年Java的来说,看C++代码很坑爹有木有。
但是作为Android工程师,C/C++还是有必要学的,因为Android系统源码大部分都是C写的。之前看过一段时间的Android源码,看到C++部分也是比较吃力,现在借此机会学学C++也是挺不错的。
下面简单记录在学习C++过程中遇到的一些不懂的东西(持续更新)。

std::nothrow

在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL。
如:auto layer = new (std::nothrow) FirstLayer();

auto
auto是C++11的新特性,自动类型推断,用于从初始化表达式中推断出变量的数据类型,有点类似于js中的弱类型var。

阅读全文

RecyclerView的使用

什么是RecyclerView

RecyclerView是Android 5.0 materials design中的组件之一,相应的还有CardView、Palette等。看名字我们就能看出一点端倪,没错,它主要的特点就是复用。我们知道,Listview中的Adapter中可以实现ViewHolder的复用。RecyclerView提供了一个耦合度更低的方式来复用ViewHolder,并且可以轻松的实现ListView、GridView以及瀑布流的效果。

RecyclerView的用法

首先我们要gradle的依赖库中添加  compile 'com.android.support:recyclerview-v7:21.+'  。如果是eclipse直接导入android-support-v7-recyclerview.jar就可以了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* 设置Adapter
*/
mRecyclerView.setAdapter(mListAdapter);
/**
* 设置布局管理器
*/
mRecyclerView.setLayoutManager(linearLayoutManager);
/**
* 设置item分割线
*/
mRecyclerView.addItemDecoration(itemDecoration);
/**
* 设置item动画
*/
mRecyclerView.setItemAnimator(new DefaultItemAnimator());

使用RecyclerView,基本上要上面四步。相比ListView只需设置Adapter而言,RecyclerView的使用看起来似乎要复杂一些。但是它的可定制性更高了,你可以自己定制自己的分割线样式或者是item的的动画。

阅读全文

Android自定义相机拍照、图片裁剪的实现

  最近项目里面又要加一个拍照搜题的功能,也就是用户对着不会做的题目拍一张照片,将照片的文字使用ocr识别出来,再调用题库搜索接口搜索出来展示给用户,类似于小猿搜题、学霸君等app。

  其实Android提供Intent让我们打开系统的相机,但是系统相机跟自己app风格不搭,而且用起来体验不好。所以我使用了SDK提供的camera API自定义了一个相机,并且在相机界面上面添加了参考线,有助于用户将题目拍正,提高ocr的识别率。

阅读全文

ListView实现Item局部刷新

   对于ListView数据的刷新大家都知道,改变Adapter的数据源,然后调用Adapter的notifyDateSetChanged()方法即可。

  但是博主在做公司项目的时候,有个下载模块,因为可能同时下载好几个数据,所以用的listview展示所有正在下载的内容。因为下载进度要实时更新,所以要不停的调用notifyDateSetChanged刷新数据。这样会不停的重新绘制整个listview的界面,性能开销非常大。而且如果每个item有图片的话,每个item的图片都需要重新加载,就算图片做了内存缓存,刷新一下图片也会闪一下,不停的刷新就会导致各个item的图片不停的闪,体验一点都不好。

  那么对于上面问题,有没有解决办法呢?当然是有的。我们可以针对某一个item进行局部更新,而不影响其它没有修改的item。那么具体如何实现的呢?我们看下面的代码。

阅读全文