Activity简说

Posted on 2018-11-28 16:11  老大闯天下  阅读(119)  评论(0编辑  收藏  举报

Activity 四个状态

  running 运行:前台显示,当前焦点

  paused 暂停:上面被其他activity覆盖,有一部分可见

  stopped 停止:被其他activity完全覆盖,不可见

  destroyed 销毁:人为或系统销毁,完全销毁

Activity生命周期

  onCreate:

  onRestart:

  onStart:

  onResume:

  onPause:

  onStop:

  onDestroy:

  

  从整个生命周期来说,onCreate与onDestroy是配对的,只能调用一次;

  从Activity是否可见来说,onStart与onStop是配对的,可多次调用;

  从Activity是否在前台来说,onResume与onPause是配对的,可多次调用。

  

  一个完整的生命周期:onCreate->onStart->onResume->onPause->onStop->onDestroy

  activityA 启动 activityB的生命周期:A onPause ->B onCreat->B onStart ->B onResume->A onStop

  此时back键:B onPause->A onRestart->A onStart->onResume->B onStop->B onDestroy

  注意:由上可知,在执行onPause后启动另一个Activity,所以在onPause中不要有过的操作,影响Activity的启动速度

  

  activity异常销毁,横竖屏切换时也会执行

  会调用onSaveInstanceState,在onStop之前被调用。可在onSaveInstanceState保存一些数据,通过Bundle把数据传递给下一次启动Activity的onGreat和onRestoreInstanceState

 

configChanges系统配置改变

  android:configChange="***|***"

  常用项目:locale;keboard;keyboardHidden;screenSize;orientation;......

  系统配置改变时执行 onConfiguragionChange(configuration *)

 

Activity启动模式LaunchMode

  ActivityA,B,C,D

  standard:标准模式,A启动B,B启动C,C启动A ,栈内Activity结构 ABCA。不同任务栈启动,每次都会从新创建。

  singleTop:栈顶复用模式,一个栈内 A启动B,B启动C,再次启动C。 栈内结构ABC。A启动B,B启动C,在启动B,栈内结构ABCB

  singleTask:栈内复用模式,一个栈内 A启动B,B启动C,C启动B。栈内结构AB

  singleInstance:单例模式,每启动一个Activity,都是一个新栈。创建是会查看系统内是否已经创建过,如果重建构建过就不在重新创建,否则会新建。

  启动模式先找对应的任务栈,然后根据启动模式判断时候重新构建。

 

  前台任务栈AB,后台任务栈CD(启动模式SingleTask)

  1,启动D:activity顺序ABCD,back键->ABC->back键->AB

  2,启动C:activity顺序ABC,back键->AB

 

  任务栈:TaskAffinity:任务相关性

  与SingleTask启动模式或allowTaskReparenting属性配合使用,其他情况下没有意义。

 

  Activity的Flags

  Flags有很多,有标记启动模式的,有影响Activity运行状态的。

  FLAG_ACTIVITY_NEW_TASK:singleTask启动模式

  FLAG_ACTIVITY-SINGLE_TOP:singleTop启动模式

 

Activity启动方式

  显式启动:通过包名和类名启动,不管是不是本应用的activity

  隐式启动:通过过滤列表启动:action,category,data

    action:字符串,过滤其中可以有多个,只需完全匹配一个就可以

    category:字符串,过滤其中可以有多个,只需完全匹配一个就可以。

        这个属性可以不写,系统默认android.intent.category.DEFAULT,如果写了最好将这属性添加进去,这样启动时可以缺省category

    data:类似action,如果定义intent中必须使用,主要两部组成:mimeType和URI

<activity ...>
    <intent-filter>
        <action android:name="com.***.a1"/>
        <action android:name="com.***.a2"/>
        <category android:name="com.***.c1"/>
        <category android:name="com.***.c2"/>
        <categoryandroid:name="android.intent.category.DEFAULT"/>
        <data android:mimeType="image/jpeg" />
    </intent-filter>
</activity>

Intentintent = new Intent("com.***.a1");
intent.addCategory("com.***.c1");
intent.setDataAndType(Uri.parse("file://abc"), "image/jpeg");
startActivity(intent);