Android 学习历程摘要之二

记录下Android学习与实践过程中遇到的问题和学习要点,可能有些地方可能理解不对,如果有朋友看到的话麻烦指正我一下,万分感谢

  • proguard混淆:对与Activity等不应进行混淆,否则系统将找不到生命周期函数;JSON字符串要考虑混淆之后是否会影响字段名;native方法也不混淆,否则调用不到
  • ListView的onItemLongClickListener返回true时将不会再调用onItemClick
  • 善用单例模式
  • 分享会上所得:重要与紧急哪个优先处理,答案是优先处理重要的事情。处理事情的顺序应该是:重要又紧急,重要不紧急,紧急不重要,不紧急不重要。首先重要的事情一般都是正确的事情,而紧急去做的事情却不一定是正确的,其次重要有紧急的事情占的比例最小,不紧急不重要的事情最多,而如果我们选择先去处理紧急不重要的事情的话,那么之前重要不紧急的事情将会因为重要而变得紧急,那么我们就会陷入一个持续处理重要又紧急事件的循环中,这是一种非常不利的工作状态。
  • 使用番茄来进行自我计划与训练
  • 工程右键——Properties——Android,作为Library的项目要勾上is Library,要引入工程库的点击add(我的Eclipse存在问题,可能是自身配置原因,无法使用绝对路径的工程库,只能使用相对路径,之后查证下)
  • Application层位于最底层,系统层位于最高层,Application无法屏蔽Home键,而Dialog层比Application层等级高,所以可用一个透明的Dialog来实现屏蔽
  • 当有莫名其妙的错误:如不可能的类型转换异常,已导包却报错等,尝试对工程进行clean或许可以解决
  • clampViewPositionVertical返回的是被拖动的子View的被拖动下一刻的位置,如果return 0 则拖动一下子View就会直接出现在最左侧
  • Automatic Target Mode: Unable to detect device compatibility. Please select a target device. 当其他项目都可以运行,但是有项目报这个错误时候,右键propertites选择Android,选择你手机系统版本,然后到清单文件中更改一下,再重新安装
  • SharedPreferences中的apply方法是在API 9之后引入的,调用它会安全地异步写入SP Editor。因为它是异步的,所以是保存SP的首选方法。如果想要确保操作成功,或者想支持早期的Android版本,则可以调用commit方法,它会阻止调用线程,并在写入成功后返回true,在写入失败时返回false。
  • 与标准UI布局不同,首选项定义在res/xml资源文件夹中
  • Android 3.0(API LEVEL 11)之前的Android平台不支持PreferenceHeader和Preference Fragment,在Preference Activity中直接添加PreferenceScreen
  • 如果Activity被销毁,然后被重新启动,以处理硬件配置改变(如屏幕方向改变)的情况,那么可以请求保留Fragment状态。通过再Fragment的onCreate处理程序内调用setRetainInstance,就指定了当与Fragment关联的Activity被重新创建时,Fragment的实例不应该被终止和重新启动。因此,当设备的配置改变,并且与被保留Fragment关联的Activity被销毁和重新创建时,被保留Fragment的onDestroy与onCreate处理程序不会被调用。如果将大部分对象创建代码移入onCreate,同时使用onCreateView和已保存实例值中存储的值来更新UI,这可以显著提高效率
  • 如果应用程序需要外部文件资源,那么可以通过将其放置在项目层次结构的res/raw文件夹中,从而在自己的分发包中包含它们。若要访问,使用Resouce对象的openRawResouce方法,以便基于所指定的文件接收一个InputStream,传入文件名(不带扩展名)作为R.raw类的变量名。
  • 大型的、先前已存在的数据源(如字典)不适合(甚至不可能)转换到Android数据库中,此时,向资源层次结构添加原始文件是一种非常好的解决方法。
  • 如果应用程序需要缓存临时文件,Android提供了一个可管理的内部缓存和(API 8开始)一个不能管理的外部缓存。分别调用getCacheDir和getExternalCacheDir方法可以从当前的上下文中访问他们。
  • SQLite在列定义中使用了一种松散类型的方法。即并不要求一列中的所有值都是同一类型;相反,在每一行中分别设置每个值的类型。这样当从每一行的每一列中分配或者提取值时就不需要进行严格的类型检查了。
  • 等到需要数据库时再创建和打开这些数据库是一种很好的做法。SQLiteOpenHelper会在成功打开数据库实例后缓存它们,所以你可以再刚好要执行查询或事务前请求打开数据库,出于相同的原因,除非不再需要使用数据库否则无需关闭。
  • 由于数据库操作需要较长的时间才能完成,因此,为了确保这些操作不会影响用户体验,应该使所有数据库事务异步执行
  • 如果磁盘空间不够或者没有足够的权限,对getWritableDatabase的调用可能失败,因此如有必要,在需要查询数据库时应该使用getReadableDatabase作为后备。在大多数情况下,它将提供与getWritableDatabase相同的、已缓存的可写数据库实例,除非该数据库实例还不存在,或者存在相同的权限或者磁盘空间问题,那么它将返回一个只读的数据库实例副本。
  • 在创建或者升级数据库之前,必须以可写形式打开数据库,因此一般来说,最好的做法是首先尝试打开可写数据库,如果不能成功打开,就再去尝试打开只读数据库。
  • Android hosts文件位于system/etc中,绑IP地址时如果该地址是最后一个,一定要记得回车
  • 异步持有资源报错是指当我们异步操作的时候却对一个已经不可见的视图进行操作,比如操作一个已经不可见的按钮或者刷新一个不可见的界面时会报错,而持有这个类的变量的话是不会报错的,只是会导致这资源一直被持有而不会被系统回收
  • 当一个class被销毁时,其内部所有资源也会被一起销毁,Visibility的可见与不可见不会销毁资源
  • PreferencesActivity与ListActivity需要用到布局文件中的具有android:id=”@android:id/list”的ListView,否则setContentView来引入布局文件会报错;而setContentView之后你的所有设置参数项都会添加到这个具有android:id=”@android:id/list”的ListView上,如
    setContentView(R.xml.news_category_preferences);//R.xml.news_category_preferences是一个包含了进度条以及ListView的布局文件,而在需要隐藏进度条显示相应的参数数据的时候,在主线程中
    progressBarView.findViewById(R.id.progress_bar).setVisibility(View.GONE);//隐藏进度条
    setPreferenceScreen(getCategoryPreferenceScreen());//设置数据
    findViewById(android.R.id.list).setVisibility(View.VISIBLE);//设置ListView可见,即数据可见
  • Activity的四种加载模式总结
  • clearAnimation();用于如果使用setVisibility隐藏无效的情况下,在setVissibility之前使用该函数即可或者调用setAnimation(null),原因是因为当前视图有在进行动画,动画未完成导致视图被持有而无法改变可视性
  • getSharedPreferences(Configuration.SharedPreferences.SHARED_PREFERENCES_FEEDBACK_NAME,Context.MODE_PRIVATE).edit().clear().commit(); clear之后也需要调用commit才会生效
  • 同一个视图接连进行两个动画时,在设置第二个动画之前要clearAnimation(),否则会动画冲突而无效
  • SimpleDateFormat中如果使用hh:mm则是格式化为12小时制的时间,如果是HH:mm则是24小时制的时间
  • WebView的setBlockNetworkImage方法,true表示阻塞图片加载,false为显示图片
  • 要使ImageView图片不拉伸,两点:ImageView的图片显示状态设为:android:scaleType=”centerInside”;ImageView设置src而不是background,使用函数的话就是setImageResource而不是setBackgroundDrawable,background可以用来设置ImageView被点击时与正常状态下的背景
  • listview与checkbox等控件放在一起存在拖动时checkbox状态混乱,将监听放在初始化checkbox状态的代码之前即可(参见以下文章有详解,GridView状态混乱同理)
    http://www.cnblogs.com/wujd/archive/2012/08/17/2635309.html
  • 监听应用程序的安装卸载时IntentFilter一定要addDataScheme(“package”)否则接收不到intent
  • if (!AnimatorProxy.NEEDS_PROXY) {
         AnimatorProxy.wrap(mTouchedView).setTranslationX(0);
    
    }//SDK11以上版本需要进行这个适配,将view归为到0,否则下次再看到这个view时会在之前滑动到的最后的位置上
  • com.ant.liao.GifView 使用该JAR包时在布局中定义需要加上完整包名,否则会报找不到GifView的错误,此条理论上可推广至前天第三方控件,附:不推荐GifView,android对GIF图片不支持直接播放,需要我们进行解码图片然后逐帧播放,这是非常消耗内存的,随时都会OOM,该框架第二个版本声称解决OOM问题,其实支持将该错误TRY/CATCH起来而已,无崩溃但是播放GIF异常卡顿的原因在此
  • ProgressBar如果有锯齿等问题就按照系统的loading图片大小格式做一份就可解决
  • intent并不是全部都可以进行AndroidManifest中配置拦截,如INTENT.ACTION_SCREEN_OFF等只能在代码中进行注册拦截,进而存在注册该intent的类被关闭后只能拦截静态注册的intent而无法拦截动态注册的intent的问题
  • 建议TableRow下不要再放布局,TableRow可以设置列数或自动缩放等属性
  • 要获取LinearLayout的height可以给该LinearLayout设置一个id,通过id得到LinearLayout对象,就可以getHeight()取得height的值,但是获取的值是跟你设置有关的,如果你的LinearLayout的height设置是fill_content或wrap_content,当然是取得-1或-2.如果你给其指定一个值,就可以获取得到。一般上都是通过layout.getLayoutParams().height = 50;修改LinearLayout的值。也可以直接在xml文件中修改
  • Android频繁更新TextView导致TextView移动过程中突然回到原处的解决方法:
    当TextView设置布局大小为WRAP_CONTENT时,当其被调用setText这个函数时,会先触发setText(“”),然后setText(“实际内容”),具体的原理有待进一步确认,目前解决方法为设置TextVIew固定大小
  • 安卓坐标系学习
  • 图片资源一般一开始先放在res下的drawable-hdpi中,assets放置如字体、文本、jar包等静态资源,不放置图片
  • 不要因为测试而去更改实现代码,要自己写一层测试代码,客户端单元测试学习
  • findViewById需要当前的布局中有这个ID才能找到,可以使用LayoutInflater将其inflate进来然后用该View去调用
  • 类中的private static final String TAG = “类名”是用于打印Log消息中的TAG,或者是fragment中的tag标识
  • CheckboxPreference会自动保存我们上一次操作的值,设置android:persistent=”false”可以取消该功能,更详尽的介绍看下述文章
    http://biancheng.dnbcw.info/shouji/371737.html

版权声明

![Creative Commons BY-NC-ND 4.0 International License](/images/cc.png)

Lam’s Blog by Binghe Lin is licensed under a Creative Commons BY-NC-ND 4.0 International License.
林炳河创作并维护的Lam’s Blog采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于Lam’s Blog - Knowledeg as Action,版权所有,侵权必究。

本文永久链接:http://linbinghe.com/2017/751e5635.html