Android 学习系列 - Activity

464 查看

最近受女票大人之邀要做一个 android app,:- (, 鉴于已经很久没碰过 android ,加上以前写过系列的 android 学习笔记,这里总结下来,权当复习回顾,如果能帮助刚开始学 android 的童鞋就太好了,有误的地方砖家们快给我头上拍一下

Android Activity

关于

每一个activity作为application展现给用户的一个交互界面,应用由多个交互界面组成,那么就可能需要多个activity。

每个activity的交互界面通过ViewGroup组成,activity 之间的通信通过 Intent(动作和动作对应的数据)。 从一个交互界面跳转到另外一个交互界面相当于一个activity跳转到另外一个activity。这个动作携带的数据由Intent来描述。

每一个应用都有一个主界面对应一个 main activity 且每一个activity都需要在manifest中注册才能被使用, 对应到 AndroidManifest.xml

 <activity
    android:name=".MyActivity"
    android:label="@string/app_name">
    <!-- 通过intent-filter 过滤出用本activity想要处理的intent -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
 </activity>

sample activity

 public class MyActivity entends Activity {
    private MyApplication app;

    @Override 
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.main);
    }
 }

activity stack

activity的状态由activity 在 activity stack中的位置决定,last-in-first-out的策略
应用的优先级是由activity stack中最高优先级的activity来决定的。

activity 状态

  1. active

    • 栈顶得activity

  2. pause

    • 可见但是没有focus的activity

  3. stopped

    • 不可见的activity

  4. inactive

    • kill掉的activity

生命周期

active lifetime

 onResume -> onSaveInstanceState -> onPause -<
 onRestart

visible lifetime

 onStart -> [active life] -> onStop(killble) -> onRestart -<

full lifetime

 onCreate -> (stopped? onRestoreInstanceState:pass) -> [visible lifetime] -> onDestroy[killable] -<

重一个activity 回退到另外一个activity的时候,为了保证用户的UI 的状态, activity应该监听这些状态做到数据和UI的保存。

  1. onRestoreInstanceState(Bundle savedInstaceState)

    • 只有当activity曾经被kill过才会调用

    • 先调用onCreate 从savedInstanceSate中恢复UI状态

life cycle sample

有3个Acitivity: 分别用One(main), Two(透明的), Three(全屏)

    打开应用:
        onCreate(One)
        onStart(One)
        onResume(one)

    打开 activity Two:
        onPause(One)
        onCreate(Two)
        onStart(Two)
        onResume(Two)

    返回:
        onPause(Two)
        onActivityResult(One)
        onResume(One)
        onStop(Two)
        onDestroy(Two)

    打开 activity three:
        onPause(One)
        onCreate(Three)
        onStart(Three)
        onResume(Three)
        onStop(One)

    返回:
        onPause(Three)
        onActivityResult(One)
        onRestart(One)
        onStart(One)
        onResume(One)
        onStop(Three) 
        onDestroy(Three) // killed three

    返回:
        onPause(One)
        onStop(One)
        onDestroy(One)
    // 横屏切换的生命周期
    打开应用:
        onCreate()
        onStart()
        onResume()

    横屏:
        onSaveInstanceState()
        onPause()
        onStop()
        onDestroy()
        onCreate()
        onStart()
        onRestoreInstanceState()
        onResume() 
    竖屏:
       两次横屏log结果 

    // 如果设置了 android:configChanges="orientation"
    横屏:
        onSaveInstanceState()
        onPause()
        onStop()
        onDestroy()
        onCreate()
        onStart
    竖屏:
        一次横屏log结果
  1. 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

  2. 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

  3. 设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

  4. 当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变

  5. Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause--> onStop,再次进入激活状态时: onRestart -->onStart--->onResume (在visible 周期)

Activity的系统子类

  1. ListActivity

  2. MapActivity

  3. ExpandableListActivity

ActivityManager

Activity 继承自 Context