Android 学习历程摘要之一

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

  • 善用API DEMO,初学者的需求基本在里面都可以满足,Eclipse导入API Demo工程出错的话可能原因是SDK版本过低,将target属性设高即可,然后prject——clean一下
  • Fragment属于APP,而不是VIEW,这在API Demo中也有体现,因为Fragment不仅仅是为了展示视图,在每一个Fragment中还可以对相应事件进行处理等
  • FragmentTransaction类中的addToBackStack(args)方法,是指当用户按下返回键时,系统会将当前该事务内的所有操作退回去,而不是把该事务保存起来
  • 各组件的生命周期很重要,目前理解还不是很深入,过段时间进行专门的补充
  • 当需要一个Context参数时可用getActivity()或者getActivity().getApplicationContext(),因为Activity与Application都继承与Context,Activity指一个活动的窗体,通过Activity可以获得Appliction
  • Fragment中如果要获得Context需要覆写在onActivityCreated()或该生命周期之后的函数中,不然会因为Activity尚未生成进而出现nullpointer异常
  • ConnectivityManager 操作移动数据网络,网上普遍的是通过自己设置正确参数来开启网络,设置错误参数进而关闭网络的方法,此方法不好或者霸道的一点在于当你设置了错误参数进去时用户自己想打开网络都开不了了,所以个人比较支持采用反射的方式来做,之后会参考网上大神写一篇博文。
  • NetworkInfo中的getTypeName()返回的值为小写的,如果有网络的话,同时如果当前无网络状态NetworkInfo会为null,记得处理,避免nullpointer异常,匹配网络情况的话避免出错请使用equalsIgnoreCase,忽略大小写,此处API 文档上的返回值是大写,自身测试是小写,不知为何
  • String实现了CharSequence接口,所以在需要CharSequence类型变量时直接用String即可
  • 写在onResume()中的操作可能会被重复调用,这涉及到生命周期问题
  • DialogFragment中无法再嵌套子DialogFragment,由于没有使用v4兼容包中的Fragment所以没有getChildFragmentManager,之后会再测试这方法可不可以,setDialogShow()方法再此情况下亦无效,目前使用AlertDialog.Builder来创建对话框,原因是DialogFragment中的id在我调用的时候其实尚未被系统所装载,所以会出现no view found的错误,设想如果提前把需要的资源装载应该可以解决问题,之后会针对这方面写一篇博文
  • AlertDialog.Builder中的OnClickListener()需要使用DialogInterface中的
  • BroadcastReceiver用于处理针对意图的操作,而Service多用于程序在后台运行处理数据、与用户交互等操作
  • AndroidManifest中的package=””属性指定了R文件生成的位置,也是该程序的唯一标识
  • 广播接收者使用静态注册的方式比较好,首先有些Action是只能使用静态注册的,其次代码注册仅在程序开启过程中由我们来注册进而处理一些事情然后在程序结束或者在程序生命周期内的某个特定时候进行关闭时才使用,静态注册需要注意的一点(这是我自己做项目的过程中一开始没有想到的,也是经验不足的原因)就是有的朋友可能会问那静态注册了这个广播接收者,它不就一直在后台运行着,一直在处理事情吗,那我不想它处理了怎么办,其实我们可以通过采用参数的进行控制,比如将一个参数放入SharedPreferences中,然后广播接收者激活时获取一下参数值,根据参数值进行相应的操作
  • SharedPreferences的Mode之前理解错误以为是控制是否复写是否追加,其实是用来控制该XML配置文件的权限的
  • SVN版本控制,主开发于trunk目录中;branchs用于已发布版本基础上的bug调整等;tags用于保存发布版本,此目录只读
  • DDMS中是看不到真机中的data目录的,因为真机没有赋予DDMS这个权限,可通过adb shell查看
  • PendingIntent中的flags参数 指定PendingIntent的一些行为,比如只开启一次等
  • AlarmManagerService是service运行在systmen_server进程
  • Exported receiver does not require permission指自己定义的接收者没有设置权限,设置权限或者 android:exported=”false” 即指定该接收者不能跨进程使用
  • AlarmManager 根据PendingIntent的requestcode来进行区分不同的闹钟,根据这个可以用来取消指定的闹钟任务
  • Calendar.getInstance(Locale.CHINA)之后可以获得本地化的数据,比如星期的第一天是星期一等,不过这个我使用了本地化之后get所取到的星期数依旧是从星期日开始的,不知为何,之后查到资料了补上
  • ListView的使用一定要记得进行优化(holder优化之后会写一篇博文总结)
  • 刷新界面,在Activity中使用广播接收者,创建该Activity时注册,销毁该Activity时注销,但是这点没有实现出来,之后解决了专门写一篇博文总结
  • int month = c.get(Calendar.MONTH)+1; 因为算月份时是计算离第一个月差几个月,那么1月就是0
  • 重点:AlarmManager.set方法的triggerAtTime如果type选择的是绝对值模式,则要使用目标时间的总毫秒数,而不是目标时间减去当前时间的毫秒数,否则会直接发送intent,因为相减之后的毫秒数代表着好早好早好早以前就应该发送意图了
  • 在布局配置文件中,当权重有垂直时,每一个部分的layout_height必须为0dp;当权重为水平时,其每一部分的layout_width必须为0dp
  • 使用SVN commit项目的时候bin、gen这类目录不用提交,是编译生成的文件目录
  • private 类名(){} 把构造函数私有化从而避免用户new
  • 可以从sql_master表中获取目前sqlite中有哪些表进而判断是否需要重新创建我们需要的表
  • 使用OnKeyDown()函数通过参数等方式来做出对后退等事件的处理
  • FragmentTransaction的remove()方法的Fragment类型参数中的fragment可以从碎片栈中通过add时设置的tag获取
  • 使用当前的view来findViewById时只能获取当前这个view视图中的资源,使用getActivity()再去find可获得其他视图资源
  • AlarmManager如果没有设置重复闹钟那么在定时激活后系统将会自动cancel掉,不需要手动进行cancel
  • Happy Path Test是指在测试中仅对用户的正常操作流程进行处理,这个处理的路径就是Happy Path,在代码编写过程中,举个例子,在逻辑处理方面中的必须按照正常逻辑思维去处理,顺序应该是如果满足条件系统去做什么事,不满足条件系统去做什么事,而不应该变成不满足条件系统去做什么事,满足条件系统才去做什么事,这不符合正常逻辑思维
  • 使用String进行数据拼装过于繁琐,之后再进行反向解析耗费时间,可考虑用整形数组等其他方式替代
  • 尽量避免使用String作为比较逻辑处理,可使用int数值等方式替代
  • 扩展系统视图或者系统服务时,在创建时候应该让系统先创建自己的内容,进而再执行我们的操作,而在销毁时,应该先销毁我们的内容再执行系统的销毁操作。如在onCreate()函数时先调用super.onCreate(),在实现自己的操作,而在onDestroy()时,先销毁自定义的内容再调用super.onDestroy()
  • 资源文件命名只能小写,否则会报错生成不了R.Java文件
  • R文件导包时应该导入自己工程的包,而不是Android.R
  • 数据库操作使用SqliteOpenHelper
  • values目录下自定义一个自己的xml文件,获取的方法是R.__横线处根据自定义XML中的子节点而定,比如则就是R.String
  • Eclipse中CTRL+SHIFT+X与CTRL+SHIFT+Y为大小写转换
  • 使用高度为1dp的标签可实现分割线
  • 当一个Fragment叠加在另一个Fragment上时可能存在事件穿透,此时设置上面的Fragment的clickable=”true”即可
  • ImageButton通过设置background=”#00000000”可变为透明,设置其背景与图片背景一样可更为美观,ImageButton需要设置clickable=”true”
  • ConnctivityManager.Connectivity_ACTION为监听网络状态变化,是否是监听所有网络之后看了API说明再补上
    WifiManager.NETWORK_STATE_CHANGED_ACTION为监听WIFI网络变化,包含开启与关闭两种状态
    WifiManager.WIFI_STATE_CHANGED_ACTION为监听WIFI状态变化,包含开启中,已开启,关闭中,已关闭
  • 遇到不需要嵌套的情况比如使用FrameLayout来创建布局所需的单一根节点时,可以使用标签来替代标签,当包含有merge标签的布局被添加到另一个布局时,该布局的merge节点会被删除,而该布局的子View会被直接添加到新的父布局中,merge标签结合include标签一起使用时尤其有用,include标签是用来把一个布局的内容插入到另一个布局中
  • ViewStub是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。当 ViewStub 可见,或者调用 inflate()函数时,才会加载这个布局资源文件。
  • 关于Activity与Fragment的各自以及组合起来的生命周期之后会专门补上一篇博客
  • 在对Fragment进行增删替换等操作之后可指定其动画,再根据需要选择是否添加到back栈中,最后commit()
  • 在需要传入例如作为标志的参数时可以使用“|”来加入多个参数
  • 创建一个类继承Application后可对整个应用程序的生命周期函数进行相应的处理,例如在整个应用程序启动时对数据库进行开启,当应用程序进程被终结时才关闭数据库,但是需要在Manifest清单文件中的application节点指定name属性,值为自己的类名
  • 在一个广播接收者中若要再注册一个广播接收者,需要使用context.getApplicationContext().registerReceiver,可解决ReceiverCallNotAllowedException异常
  • 当我们接收到一个intent时若要对该intent进行数据修改然后再发送出去,此时后面的接收者接收到该intent时是取不到数据的,因为默认情况下intent不能复用,数据会被过滤掉,可以使用flag标识不同的模式以进行复用
  • 使用ComponentName与RemoteViews可对桌面插件视图进行更新
  • Application中的terminate函数不一定会被调用,如果不被调用数据库没有关闭的话,再重装的时候会报错,但不会提示给用户,仅会记录在日志中
  • 目前遇到一个问题,当我用add的方式在原本已经有一个fragment的容器中再添加一个fragment时,后者不会显示,只能使用replace,同时popBackStack函数的实现原理也还需要学习,之后补上
  • 使用nienpatch
  • Manifest文件中使用installLocation属性可以指定是否允许或者首选将应用程序安装到外部存储器上(用户不能拒绝或取出SDK,否则应用程序将立即终止)
    • 不适用于:
      • 具有Widget、Live Wallpaper和Live Folder的应用程序
      • 提供不中断服务的应用程序
      • 输入法引擎IME
      • 设备管理器

版权声明

![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/4e9e789c.html