Android

Android

Android不需要重新编译打渠道包

原文参考Android批量打包提速 - 1分钟900个市场不是梦 Apk打渠道包简直是一个噩梦,每个apk打包需要两分钟的话,40个包那就是需要很长时间。 这篇文中使用了一个技巧就是: 如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。 从Apk中读取渠道名字的代码如下: /** * 从apk中获取版本信息 * @param context * @param channelKey * @return */ private static String getChannelFromApk(Context context, String channelKey) { //从apk包中获取 ApplicationInfo appinfo = context.getApplicationInfo(); String sourceDir = appinfo.sourceDir; //注

By Race604

Android

绚酷的ViewPager动画

参考自原文Great animations with PageTransformer。 以前的对ViewPager动画只是停留在整个Pager切换的动画。例如这个JazzyViewPager库,把各种专场动画做的非常绚丽。其实,利用ViewPager还有更迷人的动画效果。例如雅虎的News Digest应用的开场动画: 滑动翻页的同时,里面的View也分别也做各种动画。 实现的方法就是利用ViewPager.PageTransformer。作者实现了一个简单的例子,先看效果: 实现方法就是: mPager.setPageTransformer(false, new ViewPager.PageTransformer() { @Override public void transformPage(View view, float position) { .... } }); 其中transformPage()的实现如下: public void transformPage(View view, f

By Race604

Android

从ListView迁移到RecyclerView

RecyclerView是Google在Support库中新发布的控件。从名字上看,就知道其作用了。意图是用来替换ListView和GridView这类的AdapterView。但是其灵活性却远比AdapterView高。RecyclerView只是一个框架,具体的布局需要LayoutManager来控制。 文章Migrating to RecyclerView from ListView这里号召了大家转移到RecyclerView。介绍了使用RecyclerView需要注意的地方。 实际上使用RecyclerView和ListView基本一样,如果不自定Layout的话,切换起来非常方便。使用方法可以参考官方demo。也可以参考我的上一篇博客Android上实现进入详情展开的动画中提到的那个例子。 需要注意的是,默认RecyclerView是不支持HeaderView和FooterView的。但是也非常容易让它支持,这里有一个解决方案,方法就是使用ViewType来实现。这里也可以看出它的灵活。 另外,默认RecyclerView是不支持OnItemClick和OnItemL

By Race604

Android

Android的Parcelable自动生成

Android中大量用到Parcelable对象,实现Parcable接口又是非常繁琐的。下面有几个工具可以减轻你的痛苦。 Parceler 通过注解及工具类自动完成实体类 Parcelable及值传递。基本用法如下: @Parcel public class Example { String name; int age; public Example(){ /*Required empty bean constructor*/ } } // wrap to parcelable Parcelable wrapped = Parcels.wrap(new Example()); // unwrap Example example = Parcels.unwrap(wrapped); 可以看出Parceler使用起来非常方便,代码也非常整洁。 需要注意的是,Parceler支持绝大部分的数据类型,但是也有些不支持,例如DateTime,如果你使用了这写类型,编写代码的时候并不会提醒你,这只会在运行过程中给你报错。 1. Intellij/Andri

By Race604

Android

Android上实现进入详情展开的动画

Android Lollipop中引入的Material Design,概念中要求任何变化都是流畅的,不能突然出现和消失。Instgram的工程师实现的了如下图所示的效果: 作者的原文在这里,讲了一些实现方法,并附上了源代码。 这里总结一下实现的关键点。 进入详情页时,禁用Acitivity切换的动画,使ToolBar(或者ActionBar)看起来就像没有变一样: overridePendingTransition(0, 0); 设置详情页的Activity的背景为透明,详情页动画的时候,还能看到原来的页面。设置Activity的Theme如下: <style name="AppTheme.CommentsActivity" parent="AppTheme"> <item name="android:windowBackground">@android:color/transparent</item> <item

By Race604

Android

LinearLayout的divider属性

我们都知道ListView的divider属性,没有想到LinearLayout也有divider属性,定义其中各个item之间的分割线的样式,使用这里有一篇长长的文章来说使用divider的好处。使用方法也摘抄自这篇文章: 先定义一个Drawable,文件名为:drawable/spacer_medium.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <size android:width="@dimen/spacing_medium&

By Race604

Android

Android中使用sqlite3工具

我们知道Android中数据库使用的是Sqlite,这个是一个轻量级的关系数据库。每个App的数据文件一般是放在/data/data/package.name/databases/dbname.db路径下面。 使用方法如下: $adb shell # 操作SettingsProvider内容 sqlite3 /data/data/com.android.providers.settings/databases/settings.db # 查看所有的system设置 >select * from system; # 设置某个值 >update system set value=1 where name='key_name'; 大部分的Android机器都把sqlite3工具给裁剪掉了,使用上面的命令,会提示sqlite3命令找不到。 解决方法是可以从模拟器,或者有sqlite3工具的机器中pull出sqlite3可执行程序,一般在/system/xbin/

By Race604

Android

Android的ListView/ScrollView支持回弹效果

看到iOS里面的Table和ScrollView都能在拉到头的时候,还能继续滑出来,松手就弹回去,感觉确实很爽。但是Android上默认是没有这个效果的,很多第三方rom或者app都支持这种效果。 搜索了一下才发现这篇博客,原来Android2.3中就支持overscroll功能。但是实现机制和iOS不一样,可能是专利的问题。Android上实现很简单,如果拉到底了,就会在边上出现发光效果。我们可以很容易修改,达到像iOS上面那样的效果。代码如下: public class BounceListView extends ListView{ private static final int MAX_Y_OVERSCROLL_DISTANCE = 200; private Context mContext; private int mMaxYOverscrollDistance; public BounceListView(Context context){ super(context); mContext = c

By Race604

Android

Android中移除TextView上下的空间

我们知道在Android中,使用TextView的时候,文字的上下都会默认留一些空间。特别是TextView中添加一个背景颜色的时候,就会特别明显。如果你想移除这个空间,设置: android:padding="0dp" 没有任何效果,甚至设置padding为负数,都不能减少其空间。正确的做法如下: android:includeFontPadding="false" TextView的android:includeFontPadding属性,官方文档的解释是: Leave enough room for ascenders and descenders instead of using the font ascent and descent strictly. (Normally true). 大概的意思是:用来设置是否预留足够文字上下行距离的,而不是用字体的行间距,一般情况是true。 参考StackOverflow上的答案。这里是官方文档

By Race604

Android

Android中的SwipeRefreshLayout

在Android的官方v4的包里面有一个import android.support.v4.widget.SwipeRefreshLayout。 官方文demo,可以直接下载源代码download1, download2. 不得不惊叹Google牛x。SwipeRefreshLayout是一个滑动刷新的终极解决方案,可以Swipe任何的的view。也不用重在任何View,使用起来很简单,如下(参考): <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height=

By Race604

Android

Retrofit使用配合GSON

在前面的这篇文章中Android开发的5个神器中,推荐了Retrofi库,这是一个网络请求库,默认是使用Gson解析JSON数据。 Gson解析JSON数据,默认是把JSON的字段名和java对象的变量对应。如果不一样,可以用Annotation声明对应的JSON字段名,如下: public class User { @SerializedName("userid") public String uid; @SerializedName("username") public String name; } 对应的Json就是这样的: { "userid": 123; "username": "Jack" } 还有一些控制Java对象中的成员是否需要序列化的方法。 * transient关键字,可以控制不进行序列化和反序列化JSON * @Expose可以精细控制序列化和反序列化 public class Account { @Expose(deserialize = false) private String account

By Race604

Android

Android获取设备相关信息

获取设备相关信息,是很多App想要做的事情。Android设备相关的信息有:电话相关的信息,Wifi模块相关信息。下面分别介绍一下相关方法。 获取电话相关信息 获取电话相关信息,主要是利用TelephonyManager这个service提供的接口。这里有很详细的文章介绍。这里主要列几个常用的接口: TelephonyManager tm = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE); String imei = tm.getDeviceId(); //取出IMEI String tel = tm.getLine1Number(); //取出MSISDN,很可能为空 String iccid =tm.getSimSerialNumber(); //取出ICCID String imsi =tm.getSubscriberId(); //取出IMSI 注意,使用这个Sevice需要在AndroidManifest.xml中添加如下权限: <uses-p

By Race604

Android

Android开发的5个神器

本文摘抄于Top 5 Android libraries every Android developer should know about -by Dario Penic 好的library可以奇迹般的降低开发难度和加快开发速度。 本文介绍Android开发中可以极大提高你的开发效率的工具库。 1. GSON Gson是非常方便的JSON解析和序列化工具。网络请求经常使用JSON来传输数据。 // Serialize String userJSON = new Gson().toJson(user); // Deserialize User user = new Gson().fromJson(userJSON, User.class); 2. Retrofit Retrofit是一个网络请求库,直接把REST Api映射成java接口。所有请求URL和方法都使用java标签annotation实现,保持了代码清楚和整洁。请求可以同步和异步方式返回。 public interface RetrofitInterface { // asynchronousl

By Race604

Android

Android TV开发

Android 5.0发布以后,开始正式官方支持Anroid TV。Android TV的开发成为了热点。这里收集一些Android TV开发的入门帖子。目前虽然没有开发的需求,可以做备忘: Porting an Android app to Android TV and the nexus player 这篇文章比较浅显,每个方面都提了一下,可以从头开发和发布一个能够在Android TV上运行的app。 Get Started with TV Apps 官方的入门教程,不能不看 Leanback support library Leanback support library官方提供的一些TV支持库,提供了很多实用工具

By Race604

Android

给Apk瘦身

本文是摘抄自:Putting Your APKs on Diet,这里简单总结如下。 现在apk越来越大,原因有如下几个: * 多dpi支持([l|m|tv|h|x|xx|xxx]dpi) * Android开发工具和生态系统的发展 * 为了提高用户体验的高分辨率ui设计 * ... 减少Apk大小的,可以从如下几个方面入手: * Java源代码 * 资源文件res/assets * native code 具体的方法如下: * 保持代码卫生: 去掉不用的代码和类库,保持代码干净; * 运行Proguard: proguard能够便利你所有的代码路径,把没有用到的代码重apk中剔除。并且能够重命名变量,尽量精简你的代码; * 使用Lint: 上面的proguard只是分析Java代码。lint工具能够分析你资源文件(/res),使用./gradlew lint就能够检测出没有用的资源文件; * 合理使用资源: 资源文件并不必要覆盖所有的dpi,我个人只是覆盖了hdpi、xhdpi、xxhdpi; * 最小化资源配置: 引入第三方库的时候,

By Race604