android webview demo在开发过程中有哪些坑

Android开发中那些需要注意的坑
作者:xueshanhaizi
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Android开发过程中那些需要注意的坑,有一些是自己遇到的,特分享给大家,需要的朋友可以参考下
这个是看知乎的时候发现的一个问题,感觉挺有意思,就将自己遇到的坑记录下来。
1、Andorid L theme colorPrimary 不能使用带有alpha的颜色值,否则会有异常抛出, 直接判断了是否alpha是否等于0或者255,其他都会异常
protected void onApplyThemeResource(Resources.Theme theme, int resid,
boolean first) {
if (mParent == null) {
super.onApplyThemeResource(theme, resid, first);
theme.setTo(mParent.getTheme());
} catch (Exception e) {
theme.applyStyle(resid, false);
// Get the primary color and update the TaskDescription for this activity
if (theme != null) {
TypedArray a = theme.obtainStyledAttributes(com.android.internal.R.styleable.Theme);
int colorPrimary = a.getColor(com.android.internal.R.styleable.Theme_colorPrimary, 0);
a.recycle();
if (colorPrimary != 0) {
ActivityManager.TaskDescription v = new ActivityManager.TaskDescription(null, null,
colorPrimary);
setTaskDescription(v);
* Creates the TaskDescription to the specified values.
* @param label A label and description of the current state of this task.
* @param icon An icon that represents the current state of this task.
* @param colorPrimary A color to override the theme's primary color. This color must be opaque.
public TaskDescription(String label, Bitmap icon, int colorPrimary) {
if ((colorPrimary != 0) && (Color.alpha(colorPrimary) != 255)) {
throw new RuntimeException("A TaskDescription's primary color should be opaque");
mColorPrimary = colorP
2、android 5.0花屏,由于过度绘制导致,关闭硬件加速, 尤其是使用webview后,可能会有大概率出现。
3、华为手机被KILL一系列问题
用户可以设置某个应用是否后台保护,按照华为的功能说明,理解为,如果不保护,那锁屏后程序将无法保持运行,也就是进程可能被KILL
新安装应用后,华为会给出选项,是否保持,这个默认选项上存在问题,有的应用默认不允许,有的应用默认就允许。
关于耗电高被KILL问题。
关于锁屏后网络被切断问题。锁屏就算保护,而网络或者SOCKET也可能被主动切断。
华为自己给出了BASTET系统解决方案,具体不展开。
4、相同颜色值在全局是同一份,如果对其改变获取后的colorDrawable值,会导致其它所有使用的地方都改变,可以采用mutable避免。 这个其实不能算作坑,是自己代码没有看仔细。
5、华为p8手机,如果service与ui不在同一进程,service中监控网络的BroadcastReciver 会收不到网络连接的广播,但是能收到断开的广播,这个应该也是华为自己的优化,但是ui中的连接与断开都能收到广播。
6: Android 在4.4后更新了webview内核,在5.0前在webview中,不用的域可以读取其它域设置的cookie,但是在5.0开始,系统默认值改为了false。这样会导致之前以前采用旧方法的不能获取到。(其实在我看来,确实不应该跨域来读取cookie,多不安全)
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
以上就是本文的全部内容,希望对大家的学习有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具Android 开发中,有哪些坑需要注意?
楼主自己来一个,用appcompat21版的ActionBar高度默认是56Dp,不知道这个算不算
按投票排序
1、不要排斥新技术和新工具。
Android Studio 1.0 之后的版本,基本已经稳定到可以支持正常的工作开发的程度了。单纯就书写效率而言,Android Studio 带来的好处绝对大于它和Gradle的学习成本。JetBrains的IDE,用过都说好。还有就是适当的提升targetSdkVersion到新版本。 2、代码设计方面的问题,大部分都能在Android系统源码里找到解决方案。
当你想设计一个新模块,或者实现一个新ui组件的时候,应该采用哪些设计模式、应该以哪种形式给外界提供接口之类的问题,大部分都可以参考Android系统的源码,找到实现方式。Google为安卓程序员提供了一座现成的宝库。3、理解Android和Java内存管理方式,至少要理解垃圾回收和Java的引用。
就好比学OC就要先理解黄金法则一样,而java的内存管理,其实比OC要好理解多了。
这可能会帮助你大大减少程序异步操作产生的空指针崩溃。也会帮助你理解为什么滥用单例模式会导致内存的臃肿。还会帮助你养成不用“+”去连接超大字符串的好习惯。4、ContentProvider并不是只有在跨进程共享数据的才有用,把数据库表映射到一个独立的uri是Google鼓励的实现方式。 从设计上讲,用uri(统一资源标识符)去描述数据,肯定比sql语句要理想。从效果上讲,用CursorLoader读取数据是让iOS程序员都羡慕不已的事情,作为android程序员,何苦不用呢。5、理解Activity任务栈。非Activity的Context对象如果直接启动Activity会报错,这只是一个表面现象,真正起作用的其实是Activity任务栈机制。理解Activity任务栈机制以及Activity的各种启动方式,会帮助解决大部分页面关系错乱问题,以及应用互相掉起、任务栏进入应用、后台弹窗引起的各种问题。6、对于一些奇葩的第三方ROM,调用其非主流api的时候,可以使用反射。在适配一些第三方ROM的的时候,调用一些在开发环境中没有,但在运行环境中有的方法时,可以使用反射。比方说,华为双卡手机可能会提供获取第二块SIM卡信息的api,如果直接调用,在开发环境可能无法通过正常编译,用反射就没问题。这属于不得已而用反射的一种情况。7、SQLite的锁,是数据库级别的锁,也就是说同一个数据库的写操作无法并发执行。所以,在数据库设计的时候,如果表太多,尽量将没有关联的表拆到多个数据库文件中。8、Bitmap的内存占用问题。这是一个困扰2.X时代android程序员的问题。2.X时代Bitmap对象虽然存储在堆内存中,但是用了一个byte数组存储其像素信息。通过计数器来记录该像素信息被引用的个数。有人认为这个byte数组在native堆中,但事实上它也在堆中。只有在使用者调用recycle()后,Bitmap对象才会释放像素信息,才会在失去引用后,被垃圾回收机制销毁。再加上DVM的heap size有严格的阀值,所以在使用大量图片资源的时候,及其容易发生OOM。解决办法一般都是,用一个哈希表存储Bitmap对象的软引用,作为内存缓存,并在适当时机掉用其recycle()。3.0以上版本Bitmap对象可以通过垃圾回收机制完全销毁,理论上不用再调用recycle()。
暂时想到这些,想到其他再补充。
Android 6.0 中,使用 SYSTEM_ALERT_WINDOW 绘制的悬浮窗不能含有 elevation 属性,否则会在真机上崩溃,模拟器正常。使用 AppCompat v21+ 后,在 LG 4.1- 带有实体菜单键的机型上按菜单键会崩溃。三星 5.0-5.1 机型上 DatePicker 控件会崩溃。MIUI 上 SYSTEM_ALERT_WINDOW 需要额外申请权限,默认会拒绝掉,除非 type 设置为 TYPE_TOAST。其他很多忘了,想到再补充。另外 bugme 上面一切看起来好像正常的代码都有可能蹦。
作为一个有三、四年Android应用开发经验的码农,自然会遇到很多坑,下面是我能够想起的一些坑(实践证明不记笔记可不是个好习惯),后面有想到其它坑会陆续补上。在Android library中不能使用switch-case语句访问资源ID:不能在Activity没有完全显示时显示PopupWindow和Dialog:在多进程之间不要用SharedPreferences共享数据,虽然可以(MODE_MULTI_PROCESS),但极不稳定:有些时候不能使用Application的Context,不然会报错(比如启动Activity,显示Dialog等):备注:大家注意看到有一些NO上添加了一些数字,其实这些从能力上来说是YES,但是为什么说是NO呢?下面一个一个解释:1、数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task,一般情况不推荐;
2、数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用;
3、数字3:在Receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视);
4、ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。同一个应用的JNI代码,不要轻易换NDK编译的版本,否则会有很多问题(主要是一些方法实现不一样,并且高版本对代码的检测更严格),比如r8没有问题,但到r9就有问题了,这是个大坑;Android的JNI代码中,有返回类型的函数没有返回值编译的时候也不会报错;当前Activity的onPause方法执行结束后才会执行下一个Activity的onCreate方法,所以在onPause方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率;谨慎使用Android的透明主题,透明主题会导致很多问题,比如:如果新的Activity采用了透明主题,那么当前Activity的onStop方法不会被调用;在设置为透明主题的Activity界面按Home键时,可能会导致刷屏不干净的问题;进入主题为透明主题的界面会有明显的延时感;不要在非UI线程中初始化ViewStub,否则会返回null;公共接口一定要考虑到代码重入的情况,能设计为单例就尽量用单例;不要通过Bundle传递大块的数据,否则会报TransactionTooLargeException异常:尽量不要通过Application缓存数据,这不稳定:(AnimationDrawable在Android5.0及以上的版本已有明显的优化)尽量不要使用AnimationDrawable,它在初始化的时候就将所有图片加载到内存中,特别占内存,并且还不能释放,释放之后下次进入再次加载时会报错;9图不能通过tinypng压缩,不然会有问题;genymotion模拟器快是因为它是基于x86架构的,如果你的应用中用到了so,但没有x86架构的so,只能放弃使用它;Android Studio的模拟器也一样;Eclipse的Android开发环境配置好后不要轻易升级ADT和build tools,不然会浪费你很多时间,还有就是一个workspace中的工程不要太多,不然每次启动都会很慢;Android studio每个版本、gradle每个版本差别都比较大(我是这样认为的),对于jni代码的编译建议在Eclipse中进行,如果在Android studio中开发jni会浪费很多时间,主要是编译脚本的配置比较麻烦;Eclipse中的Lint太不靠谱,特别是主工程中依赖library的时候,很多提示都是有问题的,建议使用Android Studio的工程清理工具,特别推荐;不同API版本的AsyncTask实现不一样,有的是可以同时执行多个任务,有的API中只能同时执行一个线程,所以在程序中同时执行多个AsyncTask时有可能遇到一个AsyncTask的excute方法后很久都没有执行。同一个应用,相同的图片分别放在drawable-xxhdpi、drawable-xhdpi、drawable-hdpi、drawable-mdpi、drawable-ldpi中,在同一设备中占用的内存会大不一样(设备的dpi是固定的,图片放在不同的dpi文件夹下,在设备上显示时需要将图片转换成和当前屏幕一样dpi后在设备中显示,所以即使该图片在不同dpi文件夹下大小一样,但放在内存中的大小却不是一样的,并不一定是长*宽*4),做应用的内存优化之前可以先看一看你的工程是如何做屏幕适配的,是否有优化的空间。强烈推荐这个屏幕适配视频教程,花两个半小时就能看完:谨慎对待数据库升级(比如需要在原数据库中增加字段),避免数据丢失或者操作数据库异常的情况,数据库升级方法可以查阅《第一行代码》P263;多个程序共用一套代码(一套代码,在桌面上多个图标)时需要处理好不同入口进入时的堆栈问题;使用Adapter的时候,如果你使用了ViewHolder做缓存,在getView的方法中无论这项的每个视图是否需要设置属性(比如TextView设置的属性可能为null,item的某一个按钮的背景为透明、某一项的颜色为透明等),都需要为每一项的所有视图设置属性(textview的属性为空也需要设置setText(""),背景透明也需要设置),否则在滑动的过程中会出现内容的显示错乱。谨慎使用Android的多进程,多进程虽然能够降低主进程的内存压力,但会遇到如下问题:(1)不能实现完全退出所有Activity的功能(如果有同行在应用内采用多进程成功实现过完全退出程序欢迎沟通交流);(2)首次进入新启动进程的页面时会有延时的现象(有可能黑屏、白屏几秒,是白屏还是黑屏和新Activity的主题有关);(3)应用内多进程时,新启动一个进程都会重新跑一次Application的onCreate方法,不上重新创建一个Application,但会重新跑Application的onCreate,这样就不能在Application中缓存数据作为内存共享的途径了;(4)多进程间通过SharedPreferences共享数据时不稳定,具体可以查阅《Android开发艺术探索》。使用Toast时,建议定义一个全局的Toast对象,这样可以避免连续显示Toast时不能取消上一次Toast消息的情况(如果你有连续弹出Toast的情况,避免使用Toast.makeText);View的面积越大绘制的时间就越长,透明通道对View的绘制速度影响很大;不要通过Msg传递大的对象,会导致内存问题。关于AS的使用经验,参见:[Android Studio使用过程中需要弄明白的一些问题]()Eclipse的工程转成AS的版本后,在同一个机器中安装会报”INSTALL_FAILED_VERSION_DOWNGRADE“这个错误,原因是因为as除了可以在Manifest.xml文件中设置apk的版本名和版本号,还可以在build.gradle文件中设置apk的版本名和版本号,记得修改build.gralde中的版本名和版本号到最新就可以了;通常情况下,在插入USB之后可能会跳转到一个新的界面,这时候可能你本来是横屏的,突然跳转到这个新界面是竖屏的,虽然你的界面被压在下面,但是还是会被强制横竖屏切换一次,如果这时候你的界面不做处理就会重载,如果你的界面里面有很多fragment,这时候的重载更加复杂,难以处理。所以建议不做横竖屏切换的界面都弄一下横竖屏切换不重载。如果你在 manifest 中把一个 activity 设置成 android:windowSoftInputMode="adjustResize",那么 ScrollView(或者其它可伸缩的 ViewGroups)会缩小,从而为软键盘腾出空间。但是,如果你在 activity 的主题中设置了 android:windowFullscreen="true",那么 ScrollView 不会缩小。这是因为该属性强制 ScrollView 全屏显示。然而在主题中设置 android:fitsSystemWindows="false" 也会导致 adjustResize 不起作用;做自定义手写功能时,底层上报的点并不会都在MotionEvent中能够及时接收到,比如底层一秒钟200个点,上层收到的可能只有几十个点,为了提高手写的流畅度,在onTouchEvent中,通过MotionEvent中的getHistorySize能够获取到从底层传输到上层过程中所有的点;在Android 4.0以后,在Manifest.xml中静态注册的广播,程序安装后必须启动一次才能接收到广播,比如你的应用监听开机启动的广播,必须要你的程序被运行过才能监听到;一个AS的工程中,module不宜太多,否则会影响编译的速度,建议将不是经常变动的module打包成aar,主工程直接依赖aar可以大大提高编译的速度;在AS中,如果你想动态同步一个依赖包的更新,可以在依赖包的最后面写上“+”,比如:compile 'com.android.support:appcompat-v7:23.0.+'
,但这种方法需要谨慎使用,否则会因为依赖包的变动导致你的项目不稳定:release版本的apk需要签名才能正常安装;在2.3之前GC操作是不能并发进行的,也就是系统正在进行GC程序就只能阻塞住等待GC结束,在2.3之后GC操作改成了并发的方式进行,GC过程中不会影响程序的正常运行,但在GC操作的开始和结束还是会短暂阻塞一段时间。所以频繁的GC会导致使用应用的过程中卡顿,所以为了应用在使用过程中更流畅,需要尽量减少触发GC操作,这涉及到性能优化,对于静态代码的分析,AS已经很强大了,可以使用Android Studio的Analyze→Inspect Code...进行分析;尽量避免给window和Activity同时都设置了背景,这样会造成过渡绘制,可以通过在给Activity设置主题时,去掉windowBackground背景的方式减少一层过渡绘制,有时候为了避免进入Activity时会黑屏或者白屏(和主题有关),会在给Activity设置主题的时候给window设置背景,如果这种情况下给Activity也设置了背景,是会增加一倍内存的:&item name="android:windowBackground"&@null&/item&
一个类的finalize方法调用时机是不确定的,应该避免指望通过这个方法去释放与类相关的资源,否则会导致一些随机bug;Activity的onDestory方法调用时机是不确定的(有时候离开界面很久之后才会调用onDestory方法),应该避免指望通过onDestory方法去释放与Activity相关的资源,否则会导致一些随机bug;不要指望MAT明确告诉你哪里存在内存泄露,它只会提供各个类间的引用关系,所以可以通过leakcanary或者通过adb shell dumpsys meminfo packagename查看进入/退出一个界面后activity和views数量的变化情况,来初步定位可能存在内存泄露的地方,然后通过MAT工具找到具体的地方。关于更多Android开发方面的文章,可以看看我的专栏:知识面有限,有很多没有深入理解的知识点,可能会导致理解上的偏差,欢迎指正交流~~~
这个问题很早就关注了,
与不少同学的回答都很赞,我个人平时也没有填完坑随手记录的习惯,踩过的坑再一一捡起来比较费劲了,不过还是可以提一点,貌似没看到其它答主提到:其实Android已经提供了一个平台,记录了一些坑。这其实是用来记录Android系统的各种坑,等待Android官方修复的,但很多Android应用开发者们也会把开发过程中踩到的一些坑提交上去,而且Android系统的坑经常也是导致各种开发问题的根源,值得大家看看。比如最近有朋友遇到一个坑,明明没有主动加READ_PHONE_STATE权限,但却被自动加上了这权限,这个坑很早前坑过我们一次,还导致过Hotfix,我印象很深,就翻了出来,就是在这个网站找到的答案,各位有兴趣的可以看看。目前总共有46505个issue,Android的坑之多确实名不虚传,当然这其中不排除有重复或无效的信息。这么多的issue怎么看呢?很简单,根据Star排个名,有兴趣的可以挨个看看。看看哪些坑最多人感同身受,掉进去的人最多,当然还有诸如Status, Priority以及各种高级Search技巧,可以方便查看你自己感兴趣领域的坑。我们也是经常在踩到坑之后,各种Google最后被引导到这个网站,找到了答案,相信不少同学也有这方面的经历,当然都是英文内容,也许还要翻墙,但这对我们有志搞好Android开发的同学来说,不应该是问题。
最近遇到的一个,特来补充:Android 的 PackageManager 在 App 升级时 .so 库可能没有成功复制到 /data/data/xxx/lib/ 下,所以在加载 .so 库时会出现 java.lang.UnsatisfiedLinkError 错误。解决办法:如果找不到.so文件,就从apk中解压相应的 .so 文件复制到指定目录下。由于我们的产品用了 fresco ,很大一部分 Crash 是 fresco 的 SoLoaderShim.java 这个类造成的,而这个类简单地使用 System.loadLibrary 来加载 .so 库。已经有库子来解决这个问题了: 。不过ReLinker并不能处理 .so 依赖 .so 的情况,Facebook 最近出了一个 SoLoader: ,它可以自动解决依赖的问题。另外,fresco 的 issue 里看到回复说,之后的更新会用上 SoLoader。
刚刚遇到一个:(gradle plugin 1.3.0,gradle 2.4.0)1.app的build.gradle中productFlavors 随手添加了一个main,代表“野路子”安装的,谁知道死活编译通不过,猜测可能main是保留字。“main {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Main"]
}”这货productFlavors {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Main"]
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Xiaomi"]
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Baidu"]
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Wandoujia"]
2. 使用了appcompat后,添加shrinkResources true,导致找不到资源This has to be a bug in appcompat. I had a similar problem with abc_screen_simple.xmlshrink resources was working for about a month before the lollipop release broke it.
卸载android studio的时候一定要小心!!!!!!我**几十个G的sdk没了!!!!!这会儿正下呢!!!!
小米的手机Toast任意布局都不会出问题,其他手机崩溃。不小心改动了一个控件的id,造成了一个控件的空引用,并且只是setText一个常量字符串,在小米手机上不会崩溃,其他手机死一片。在小米手机上使用SurfaceView时,并没有在创建完成的回调里面进行操作,直接在构造里面进行一些操作,完美通过,其他手机崩溃一片。跪求小米ROM团队不要在FrameWork层打这么多补丁...
说下这段时间遇到的问题1.要实现popupwindow点击外部dismiss的话,要在代码中设置其background2.在android studio中使用android:icon=icon格式的图片来设置app图标,会使as的xml设计界面崩溃,要用android:logo=icon格式,或者android:icon=png格式,是不是很坑爹?3.父控件高和宽设为wrap_content的话,子控件alignparent后怎么margin也没有用。
已有帐号?
无法登录?
社交帐号登录通常我们会将经常遇到的问题、容易犯错的地方都放在一个checklist中,说说在Android开发过程中有哪些问题值得你放在自己的checklist中。举例说明:检查项:是否调用了类的finalize方法作为释放与类相关的资源?可能存在问题:类的finalize方法的调用时机由系统而定,不能准确知道调用时机,可能会导致程序在使用过程中的异常。解决方案:将与类释放资源相关的操作封装成一个共有方法供外部使用,而不是调用类的finalize方法释放与类相关的资源。
个人观点,只有「内存问题」是需要列 checklist 来仔细执行的,剩下能 crash 的问题都不是问题。所以……Lifecycle! Lifecycle! Lifecycle! 很重要所以说三遍。理解了 Lifecycle 就是个合格的 Android 研发工程汪了喵~避免 Lifecycle 对象 (四大组件) 的引用被 Lifecycle 无关对象 (单例) 持有,这往往会造成内存问题各种 Adapter 跟着 View 的 Lifecycle 创建和销毁 (onViewCreated/onDestroyView),跟着 Controller 一般会导致 Adapter 内部的 Observer 引用到 AdapterView/RecyclerView 而泄漏 View 内存 (Fragment 的 Lifecycle 中比较明显)引入第三方接口 (特别是各种 SDK) 的时候尽量使用 ApplicationContext,因为这些 SDK 的创建者大都无视 Lifecycle……剩下的…… (也许叫 Best Practice 比较好)实现 Parcelable (有点辛苦,却是值得的)实现 onSaveInstanceState/onRestoreInstanceState,丢状态的 App 很让用户抓狂的 (使用「开发者选项-&不保留活动」测试)有 id 的 View 会自动保存和恢复状态,没有 id 的则不会使用单例持有 Lifecycle 对象的时候使用 WeakReference透过支持 Lifecycle 控制的框架使用多线程哦对,还有 WebView……WebView 默认并不启用 JavaScriptWebView 需要额外的工作来支持 HTML5 Video谨慎使用 addJavascriptInterface,WebView 在 Android & 4.2 上有反射漏洞关于适配…… 又是另一个 checklist 了。
1导入的类库需要和项目在同级目录下,谨防资源文件与类库中冲突&br&2textviewsetText为int时候,textview的color代码设置,set/getTextSize 单位问题&br&3json 属性节点不能有空格&br&4asset下使用第三方字体 xx.ttf 必须都为小写&br&5listView自定义adapter中复用holder时候,如果view/checkbox等对应不同状态显示不同的图片,切记情况写全,不然会出现错乱问题。&br&6做上传时候记得问问服务端是否限制了上传文件大小&br&7context/getApplicationContext,视你是否需要涉及到ui时候选择合适的context&br&8存在复用时候,尽量new对象等操作移到复用之外,以防oom&br&9数据库操作加锁&br&10用Activity来显示出的dialog,popupwindow等控件需要在Activity关闭时候(之前也给关了)&br&11toast,判断是否格式(为空等)封装&br&12ui布局在多机型上的测试&br&13new handler时候尽量写在紧跟其他控件的获取之后,防止空指针&br&14context.startActivity();要intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);&br&15针对一些特定的只能为数字的editText 设置软键盘类型为数字,为用户节省切换这一步骤。edittext.setInputType(EditorInfo.TYPE_CLASS_PHONE);&br&16armeabi-v7a&br&17监听键盘输入会有两次:(一次up 一次down)&br&18 不同类型的资源文件最好不要重名,不然会偶尔发现空指针,eclipse会抽,找成另一控件&br&19AlarmManager PendingIntent 这玩意在miui 不管用。。。。&br&20部分系统 datepickdialog 的onDateSet 执行两次&br&21fragment startActivityForResult 回调
1导入的类库需要和项目在同级目录下,谨防资源文件与类库中冲突2textviewsetText为int时候,textview的color代码设置,set/getTextSize 单位问题3json 属性节点不能有空格4asset下使用第三方字体 xx.ttf 必须都为小写5listView自定义adapter中复用holder时…
谢邀。吃完午饭遛弯回来,购得猪肉脯牛肉干若干,一边吃一边写。&br&&ol&&li&TextView(往往 TextView 派生子类同样适用)调用 setText 方法设置一个 int 型的数据,千万要将该值转为 String,否则在某些设备中它会默认去查询 R 文件中定义的资源。&/li&&li&使用友盟分享 SDK,需要执行分享的 Activity 请不要为该 Activity 设置&div class=&highlight&&&pre&&code class=&language-xml&&android:process
&/code&&/pre&&/div&属性。比如你的 App 运行在 com.codingfish.test 进程,需要产生分享动作的Activity 设置 android:proces=&:com.codingfish.hello& ,那么新浪微博就会出现你设置的分享内容没有显示的问题。该 Bug 已经提交给友盟的技术人员,但是 N 久没有得到修复。&/li&&li&上线之前一定要使用正式签名打包。某朋友公司 Android 的应用上架之前,负责打包上线的童鞋(新人,老人已离职,只有这一个Android)没有签名的概念,直接将 Debug 签名的 Apk 投放到渠道了,到现在还有一批设备没有替换回来。&/li&&li&在 Activity 中尽可能少的创建 Handler 对象,创建一个主线程 Handler,一个后台 HandlerThread 就可以了。&br&&/li&&li&使用 BitMap 之后,一定要记得释放。&/li&&li&使用线程的地方尽量不要 new Thread,而是使用 AsyncThread 。&/li&&li&&div class=&highlight&&&pre&&code class=&language-java&&&span class=&n&&onCreate&/span&&span class=&o&&(&/span&&span class=&n&&Bundle&/span& &span class=&n&&savedInstanceState&/span&&span class=&o&&)&/span&
&/code&&/pre&&/div& 切记将&div class=&highlight&&&pre&&code class=&language-java&&&span class=&kd&&super&/span&&span class=&o&&.&/span&&span class=&na&&onCreate&/span&&span class=&o&&(&/span&&span class=&n&&savedInstanceState&/span&&span class=&o&&);&/span&
&/code&&/pre&&/div& 放在一切业务的前面。&/li&&li&创建了四大组件一定记得要在 AndroidManifest 文件中声明(当然 BroadcastReceiver 可以动态注册)。&/li&&/ol&===========写着写着就写成了应该注意的事项了,自己汗一个,挖个坑,找个时间再写。=============&br&&br&刚才 Google 了一下,有一篇文章介绍的不错,肥肥做了一次伸手党,直接复制过来了。&br&原文链接: &a href=&///?target=http%3A//www.jb51.net/article/37127.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Android生存指南之:开发中的注意事项_Android_脚本之家&i class=&icon-external&&&/i&&/a&&br&&br&&strong&1. 为Activity声明系统配置变更事件
&/strong&系统配置变更事件是指转屏,区域语言发生变化,屏幕尺寸发生变化等等,如果Activity没有声明处理这些事件,发生事件时,系统会把Activity杀掉然后重启,并尝试恢复状态,Activity有机会通过onSaveInstanceState()保存一些基本数据到Bundle中,然后此Bundle会在Activity的onCreate()中传递过去。虽然这貌似正常,但是这会引发问题,因为很多其他的东西比如Dialog等是要依赖于具体Activity实例的。所以这种系统默认行为通常都不是我们想要的。&br&为了避免这些系统默认行为,就需要为Activity声明这些配置,如下二个是每个Activity必须声明的:&br&&activity android:configChanges=&orientation|keyboardHidden&&&br&几乎所有的Activity都要声明如上,为什么Android不把它们变成Default的呢?&br&&br&&strong&2. 尽量使用Android的API &/strong&这好像是废话,在Android上面开发不用Android API用什么?因为Android几乎支持Java SE所有的API,所以有很多地方Android API与Java SE的API会有重复的地方,比如说对于文件的操作最好使用Android里面Context封装的API,而不要直接使用File对象:&br&Context.openFileOutput(String); // no File file = new File(String)&br&原因就是API里面会考虑到Android平台本身的特性;再如,少用Thread,而多使用AsyncTask等。&br&&br&&br&&strong&3. 要考虑到Activity和进程被杀掉的情况
&/strong&如了通常情况退出Activity外,还有Activity因其他原因被杀的情况,比如系统内存过低,系统配置变更,有异常等等,要考虑和测试这种情况,特别是Activity处理重要的数据时,做好的数据的保存。&br&&br&&br&&strong&4. 小心多语言
&/strong&有些语言真的很啰嗦,中文或英文很简短就能表达的事情到了其他语言就变的死长死长的,所以如果是wrap_content就可能把其他控制挤出可视范围; 如果是指定长度就可能显示不全。也要注意特殊语言比如那些从右向左读的语言。&br&&br&&strong&5. 不要用四大组件去实现接口
&/strong&一是组件的对象都比较大,实现接口比较浪费,而且让代码更不易读和理解; 另外更重要的是导致多方引用,可能会引发内存泄露。&br&&br&&br&&strong&6. 用getApplication()来取Context当参数 &/strong&对于需要使用Context对象作为参数的函数,要使用getApplication()获取Context对象当参数,而不要使用this,除非你需要特定的组件实例!getApplication()返回的Context是属于Application的,它会在整个应用的生命周期内存在,远大于某个组件的生命周期,所以即使某个引用长期持有Context对象也不会引发内存泄露。&br&&br&&br&&strong&7. 主线程只做UI控制和Frameworks回调相关的事。附属线程只做费时的后台操作。交互只通过Handler。这样就可以避免大量的线程问题。&/strong&&br&&br&&br&&strong&&br&8. Frameworks的回调不要做太多事情仅做必要的初始化,其他不是很重要的事情可以放到其他线程中去做,或者用Handler Schedule到稍后再做。&/strong&&br&&br&&br&&strong&&br&9. 要考虑多分辨率
&/strong&至少为hdpi, mdpi, ldpi准备图片和布局。元素的单位也尽可能的使用dip而不要用px。&br&&br&&strong&10. 利用Android手机的硬键
&/strong&几乎所有的Android手机都有BACK和MENU,它们的作用是返回和弹出菜单,所以就不要再在UI中设计返回按扭和菜单按扭。很多优秀的应用如随手记和微信都有返回键,他们之所以有是因为他们都是从iOS上移植过来的,为了保存体验的一致,所以也有了返回和菜单。但这不够Android化,一个纯正的Android是没有必须重复硬键的功能的。
谢邀。吃完午饭遛弯回来,购得猪肉脯牛肉干若干,一边吃一边写。TextView(往往 TextView 派生子类同样适用)调用 setText 方法设置一个 int 型的数据,千万要将该值转为 String,否则在某些设备中它会默认去查询 R 文件中定义的资源。使用友盟分享 SDK,需…
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 android webview 缓存 的文章

 

随机推荐