美文网首页
Android Activity笔记

Android Activity笔记

作者: ChrisChanSysu | 来源:发表于2019-02-24 17:00 被阅读0次

概括

  • Android应用没有特定的单一入口,Activity可以作为程序的入口
  • Activity必须在manifest中注册,对应标签为<activity>,唯一必须的属性是<name>,指定activity的类名;十分有用的属性是<intent-filter>,使得该activity可以被隐式地调用

生命周期

Activity生命周期
  • onCreate(Bundle savedInstanceState):
    • 必须实现的回调,在Activity被系统创建出来的时候调用,setContentView()应该写在该回调中
    • 接受的参数是savedInstanceState包含此前被onSaveInstanceState(Bundle outState)保存的bundle,如果这个activity从未出现过,那么该参数为null
    • 如果有lifecycle-aware组件,在onCreate()阶段会受到一个ON_CREATE事件
  • onStart():onCreate()调用结束之后,Activity进入Started状态时调用,之后Activity变得可见,在该回调中可以初始化维护UI的代码
  • onResume():在Activity和用户进行交互之前调用,此时该Activity处于栈的顶端。应用的大部分核心功能在此处实现。
  • onPause():当Activity失去焦点进入Paused状态的时候调用,意味着Activity仍然部分可见,但用户正在离开;
    • 处于Paused状态的Activity仍然可能更新UI
    • 处于Paused状态的Activity可能完全可见,只是失去焦点不能交互,比如多窗口模式下
    • 不要在onPause()回调中进行数据保存或者网络操作,因为onPause()的执行时间很短,可能没有足够的时间完成这些操作
    • onPause()回调中可以执行一些释放UI无关资源的操作节省资源
    • onPause()执行结束之后,下一个回调函数要么是onStop()要么是onResume():取决于Activity进入Paused状态之后发生了什么
    • onPause()执行结束并不意味着Activity离开Paused状态,完全不可见之后才会离开Paused状态
  • onStop():Activity变得不再可见后调用,接下来要么调用onRestart()重新与用户交互,要么调用onDestroy()被完全销毁,可以在onStop()中进行数据保存和网络操作
  • onRestart():当处于Stopped状态的Activity将被restart的时候调用,恢复activity在被stopped时的状态,随后将调用onStart()
  • onDestroy(): 在activity被销毁前调用,释放资源的操作放在这里,activity被销毁有两种情况:
    • 回退或者调用了finish(),这种情况下activity就完全gone了
    • 被系统回收或者配置改变(例如旋转屏幕)导致activity重建,这种情况下,系统会记得Activity的存在,当用户回到这个activity时,会使用之前保留的数据重建这个activity,为了让系统能保留控件的数据,控件必须要有id
  • onSaveInstanceState()
    • 在此函数会对空间数据进行保存,例如EditText的文字,listView的滚动位置
    • 显式调用finish()是不会调用onSaveInstance()函数的
    • 不应该在此回调中进行数据持久化,应该在
  • onRestoreInstance()的调用时机在onStart()之后

Activity跳转过程的生命周期顺序

  • A的onPause()
  • B的onCreate(),onStart(),onResume()
  • A的onStop()

Task与回退栈

  • 定义启动模式
    • 通过manifest定义
    • 通过IntentFlags定义
  • 四大启动模式与intentFlag
    • standard,标准模式,创建一个新的实例压入当前task的栈顶
    • singleTop,FLAG_ACTIVITY_SINGLE_TOP如果目标activity已经在当前task的栈顶,系统会通过调用onNewIntent()直接使用这个activity而不是创建一个新的实例
    • singleTask,FLAG_ACTIVITY_NEW_TASK如果没有存在实例系统会创建一个新的task栈,然后创建新的activity实例压入到新的task栈中;如果有,通过onNewIntent直接调用
    • singleInstance 目标activity所处的task不会再放入其他activity,目标activity将是其中唯一的activity

taskAffinity

  • affinity用来标识一个activity应该属于哪一个task,默认情况下同一个应用的所有app都具有同一个affinity
  • 通过<activity>的<taskAffinity>属性来定义affinity

清空回退栈

  • 如果用户离开了某个task太长时间,系统会清空task里面除了根activity以外的activity,可以通过以下方式更改这种情况:
    • 设置task的根activity的alwaysRetainTaskState为true,task里的activity都会保留
    • 设置task的根activity的clearTaskOnLaunch为true,task里的所有activity包括根activity都会被清空
    • 设置某个activity的finishOnTaskLaunch属性,效果类似于clearTaskOnLaunch,但是作用于某个activity上的,而不是整个task

进程和应用生命周期

  • 前台进程
    • 正在运行一个和用户交互的Activity
    • 正在运行BroadcastReceiver的onReceive()方法
    • 正在运行Service的onCreate()或onStart()或onDestroy()方法
  • 可见进程
    • 正在运行一个可见的Activity
    • 正在运行一个通过startForeground()运行的Service
  • 服务进程
    • 持有一个通过startService()方法运行的Service
  • 缓存进程
    • 系统不再需要的进程
    • 这些进程通过一个伪LRU表保存

Parcelable和Bundle

  • 不是bundle的数据体积不能超过1M,而是Binder的buffer只有1M

Loader

  • Android3.0引入,用于在Activity或者Fragment中异步加载数据
  • 监控其数据源并在内容变化时传递新结果
  • 在某一配置更改后重建加载器时,会自动重新连接上一个加载器的游标
  • 相关概念
    • LoaderManager 与Activity或者Fragment相关联的抽象类,用于管理一个或多个Loader实例
    • LoaderManager.LoaderCallbacks 回调接口,用于与LoaderManager进行交互
    • Loader 加载器的抽象基类,通常使用的实现是CursorLoader

相关文章

网友评论

      本文标题:Android Activity笔记

      本文链接:https://www.haomeiwen.com/subject/srbgeqtx.html