《第一行代码》拾遗

时间:2023-01-12 23:43:40

本文是在看郭霖的《第一行代码-Android》过程中的知识点汇集,下面的摘录知识点都是我认为之前Android开发中容易忽视,或者特别重要的知识点。
1. 隐式启动一般依靠action、category、data进行匹配,只有activity的这三项内容能够匹配Intent指定内容时才会响应Intent。
每个Intent 只能指定一个action,却能指定多个category。
隐式启动除了能启动自己程序内的activity,还可以启动其他activity,使得Android 多个应用程序这间功能共享成为可能。
2. 自定义控件时,当将布局文件加到自定义控件中,有人喜欢

  contentView = LayoutInflater.from(context).inflate(R.layout.my_view, null);
addView(contentView);

如果自定义只有这个布局时,其实这样更好:

LayoutInflater.from(context).inflate(R.layout.my_view, this); //将R.layout.my_view 加到view中
  1. 如果需要按下Back 返回上个fragment,可以在FragmentTransaction增加addToBackStack(),就能将事物添加到返回栈中;
  2. 新fragment替换旧fragment时,旧fragment 的onPause()、onStop()、onDestroyView()方法依次执行,如果替换时没有调用addToBackStack()方法,此时旧fragment就会进入销毁状态,onDestroy()和onDetach()依次执行。如果调用了addToBackStack(),则老fragment不会被销毁,按下返回键会重新回调屏幕,依次调用onCreateView()、onActivityCreated()、onStart()、onResume()方法。
  3. 系统提供的openFileOutput(String fileName,int Mode);
    创建的文件保存在/data/data//files/目录中,而且文件名fileName 不能包含分隔符”/”,
    openFileInput(fileName)得到她的对应得输出流。
  4. PreferenceManager.getDefaultSharedPreferences(Context context) 自动使用当前应用程序的包名作为前缀来命名的SharedPreferences文件。
  5. Android 系统提供SQLiteOpenHelper帮助类,通过实现onCreate()、onUpgrade()来实现创建,升级数据库的逻辑。构建完SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()/getWritableDatabase()方法就能够创建数据库了,数据库文件会放在/data/data//databases/目录中。
    另外注意数据库与数据库上的表的区别。
    onCreate()创建了数据库,数据库创建了以后不再执行,当版本号大于数据库之前的版本号onUpgrade()才会执行,
    而且onCreate(),onUpgrade不要外部直接调用,调用它的getReadableDatabase()/getWritableDatabase()它会按照SQLiteOpenHelper传过来的构造参数自动执行。
  6. SQLiteDatabase类为我们提供了很多种方法,而较常用的方法如下
(返回值)方法名 方法描述
(int) delete(String table,String whereClause,String[] whereArgs) 删除数据行的便捷方法
(long) insert(String table,String nullColumnHack,ContentValues values) 添加数据行的便捷方法
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs) 更新数据行的便捷方法
(void) execSQL(String sql) 执行一个SQL语句,可以是一个select或其他的sql语句
(void) close() 关闭数据库
(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 查询指定的数据表返回一个带游标的数据集
(Cursor) rawQuery(String sql, String[] selectionArgs) 运行一个预置的SQL语句,返回带游标的数据集(与上面的语句最大的区别就是防止SQL注入)

9. apk只有签名后才能在手机上安装,即使是程序开发中运行的debug版本,系统采用了默认的keyStore文件进行自动签名。
10. Android获取手机旋转方向和角度是通过加速度传感和地磁传感器共同计算出。
11. 服务并不是运行在一个独立的进程中的,而是依赖于创建服务时所在的应用进程。当某一个应用程序被杀掉时,所以依 赖于该进程的服务也会停止运行。另外实际服务不会自动开启线程,所有的代码都是默认运行在主线程当中的。
12. 服务中重写onCreate()、onStartCommand()和onDestroy()这三个方法。其中onCreate()方法会在服务创建的时候调用,onStartCommand()方法会在每次服务启动的时候调用,onDestroy()方法会在服务销毁的时候调用,服务中任何位置可以调用stopSelf()停止服务。
13. 一旦调用Context的startService()方法,相应的服务就会启动起来,并回调onStartCommand()方法,如果这个服务没有创建过,onCreate()方法会先于onStartCommand()方法执行。另外可以调用Context的bindService()来获取一个服务的持久连接,回调服务中的onBind()方法,如果这个服务之前没有创建过,onCreate()方法会先于onBind()方法执行。之后调用方可以获取onBind()方法中返回IBinder对象实例,可以与服务进行*通信。
14. 当调用startService()方法后,只要调用一次stopService(),服务中的onDestroy()方法就会执行,销毁服务。类似调用了bindService()方法后,又去调用unBindService()方法,onDestroy()也会执行,如果某服务既调用了startService()又调用了bindService()方法,必须同时调用stopService和unBindService(),onDestroy才会执行销毁服务。
15. 前台服务和普通服务最大的区别在于,它会有个正在运行的图标在系统的状态栏显示,下来状态栏后才可以看到更加详细的信息,非常类似通知的效果。
16. 从Android 4.4开始AlarmManager任务触发时间变得不再准确,有可能会延迟一段时间。这是系统在耗电性能方面的改进优化,系统会自动检测目前有多少个Alarm任务存在,然后将触发时间将近的几个任务放在一起执行,大幅度减少CPU被唤醒次数,从而有效延迟电池使用时间,如果要求执行时间必须正确无误,可以调用AlarmManager的setExact()方法替代set(),保证任务准时执行。
17. 当手机收到一条短信时候,系统就会发出一条android.provider.Telephony.SMS_RECEIVED的广播,这条广播携带这个与短信相关的所有的数据。