Android基础学习笔记

1.Intent and IntentFilter部分
Question1:
隐式Intent:安卓系统如何从Manifest.xml中寻找目标Activity,并启动?
猜想:从data/目录下遍历不同程序的manifest文件,找到exposed = true且intent filter与启动intent想符合的Activity
API:packageManager.queryIntentActivities()–ResolveInfo–resolvePackageName

收获1:服务禁止隐式启动(API>21,bindService抛异常)

猜想:强制出现选择框,Intent.createChooser

收获2:若要同时设置 URI 和 MIME 类型,请勿调用 setData() 和 setType(),因为它们会互相抵消彼此的值。请始终使用 setDataAndType() 同时设置 URI 和 MIME 类型。

收获3:浏览器中的链接-可以打开Activity,使用CATEGORY_BROWSABLE
猜想:content URI-推断MIME,MIME没必要

收获4:Intent 类将为标准化的数据类型指定多个 EXTRA_* 常量。如需声明自己的附加数据 键(对于应用接收的 Intent ),请确保将应用的软件包名称作为前缀。

收获5:为了接收隐式 Intent,必须将 CATEGORY_DEFAULT 类别包括在 Intent 过滤器中。如果未在 Intent 过滤器中声明此类别,则隐式 Intent 不会解析为您的 Activity。因为Android 会自动将 CATEGORY_DEFAULT 类别应用于传递给 startActivity() 和 startActivityForResult() 的所有隐式 Intent。

每个 元素均可指定 URI 结构和数据类型(MIME 介质类型)。URI 的每个部分均包含单独的 scheme、host、port 和 path 属性:
scheme://host:port/path

useful API:
- Intent.resolveActivity
- packageManager.queryIntentActivities

2.Activity部分

保存状态:
收获1:android:saveEnabled,禁止/开启Activity自动保存一些View的状态

收获2:无法保证系统会在销毁您的 Activity 前调用 onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回” 按钮离开您的 Activity 时,因为用户的行为是在显式关闭 Activity)。 如果系统调用 onSaveInstanceState(),它会在调用 onStop() 之前,并且可能会在调用 onPause() 之前进行调用。

任务和返回栈:

系统停止您的一个 Activity 时(例如,新 Activity 启动或任务转到前台),如果系统需要回收系统内存资源,则可能会完全销毁该 Activity。 发生这种情况时,有关该 Activity 状态的信息将会丢失。如果发生这种情况,系统仍会知道该 Activity 存在于返回栈中,但是当该 Activity 被置于堆栈顶部时,系统一定会重建 Activity(而不是恢复 Activity)。 为了避免用户的工作丢失,您应主动通过在 Activity 中实现 onSaveInstanceState() 回调方法来保留工作。

某些适用于清单文件的启动 模式不可用作 Intent 标志,同样,某些可用作 Intent 标志的启动模式无法在清单文件中定义。

FLAG_ACTIVITY_CLEAR_TOP 通常与 FLAG_ACTIVITY_NEW_TASK 结合使用。一起使用时,通过这些标志,可以找到其他任务中的现有 Activity,并将其放入可从中响应 Intent 的位置。

无论 Activity 是在新任务中启动,还是在与启动 Activity 相同的任务中启动,用户按“返回”按钮始终会转到前一个 Activity。 但是,如果启动指定 singleTask 启动模式的 Activity,则当某后台任务中存在该 Activity 的实例时,整个任务都会转移到前台。此时,返回栈包括上移到堆栈顶部的任务中的所有 Activity

singleInstance
This mode is quite close to singleTask, only single instance of Activity could be existed in the system. The difference is Task hold this Activity could have only one Activity, the singleInstance one.

singleTask
But if there is an existed one, all of Activities placed above that singleTask Activity would be automatically and cruelly destroyed in the proper way (lifecycle trigged) to make that an Activity we want to appear on top of stack.

处理关联
taskAffinity = string:
intent 包含 FLAG_ACTIVITY_NEW_TASK,寻找关联任务,找到不启动新任务,否则启动新任务
allowTaskReparenting,Activity 可以从其启动的任务移动到与其具有关联的任务(如果该任务出现在前台),Activity从background task移动到与其相关的前台task,并加入到前台的返回栈中
清理返回栈
alwaysRetainTaskState
clearTaskOnLaunch

3.Service部分:onStartCommand()
进程间通信,Messenger
Binder
4.View部分

onMeasure一可能会执行两次以上,第一次判断子View期望的大小,传入UNSPECIFIED

onMeasure中的两个参数是在父ViewGroup提供的,见measureChild方法,两个参数取值与子View的LayoutParams有关,见ViewGroup.getChildMeasureSpec()方法,两个参数是为了约束子View的大小

A view’s measured width and measured height values must respect the constraints imposed by the view’s parents. This guarantees that at the end of the measure pass, all parents accept all of their children’s measurements.

参考

View的实际大小 = 内容宽度+padding值

必须要调用setMeasuredDimension去保存根据父ViewGroup约束计算好的measuredWidth和measuredHeight(包括padding)

使用getDefaultSize API获得合适的尺寸

父ViewGroup给我们的最大size是除过其padding的。

drawText:
不同对齐方式下计算baseline的方法:
Align to a Rect (or better, a RectF)
top: y = rect.top + textSize * 5/6
bottom: y = rect.bottom - textSize * 1/6
center: y = rect.centerY() + textSize * 1/3

使用在onLayout中批量增删View时使用addViewInLayout或removeViewInLayout,提高性能

5.AppWidget
AppWidgetProvider,界面,事件
RemoteViews:可用于不同进程的View
appWidgetManager.updateAppWidget,更新Widget
RemoteViewsService:处理集合
耗时操作:使用Service
使用Activity配置Widget

你可能感兴趣的:(android,tips)