美文网首页
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