Activity

本博客:http://blog.csdn.net/xiaowu_zhu/article/details/70142479

Activity是android与用户交互的组件,Activity中的所有操作都与用户密切相关,可以通过setContentView(View)来显示指定的控件。

在一个android应用中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听处理用户的事件并作出反应。

Activity形态

  • Active/Running –> Paused –> Stop –> Killed

生命周期

  • 正常情况下:

    • onCreate()
    • onStart()
    • onResume()
    • onPause()
    • onStop()
    • onDestroy()
  • Activity的重新创建过程

    • 如果activity长时间处于stopped形态,而此时系统内存紧张时,系统就会回收activity,并将activity的状态通过onSaveInstanceState()方法保存到Bundle对象中,当需要重新创建的时候,保存的Bundle对象就会传入Activity的onRestoreInstanceState()方法与onCreate()方法中。

    • onSaveInstanceState()并不是每次都会被调用,如果调用了finish(),就不会。

  • Activity优先级:

    • 前台Activity— 正在和用户交互的activity,优先级最高
    • 可见非前台Activity — 比如Activity中弹出了一个对话框,导致activity可见,但是位于后台无法和用户交互
    • 后台Activity — 已经被暂停的activity,比如执行了onStop的,优先级最低
  • 屏幕旋转后不重新创建activity

    android:configChanges="orientation|keyboard|keyboardhidden|screensize"
    

上述设置,系统会调用onConfigurationChanged()方法

AndroidManifest启动模式

  • standard

    • android默认的模式,每次启动都会创建一个实例
  • singleTop

    • 在启动时,系统会判断当前启动的activity是不是和栈顶的相等,是就不会重新创建,否则才创建。这种启动模式,虽然不会重新创建实例,但是会调用onNewIntent()方法。
  • singleTask

    • singTask和singTop类似,但是singleTask是检测的整个activity栈,需要注意的是如果启动模式为singleTask的activity已经在后台一个任务栈中了,那么在启动的时候会将这个任务栈切回到前台 ,并将该activity以上的activity全部出栈。
  • singInstance

    • 这种模式和使用的浏览器类似,申明的singleInstance的Activity会出现在一个新的任务栈中,而且该栈中只存在这一个activity。

注意 : singleTop和singleTask模式下,通过startActivityForResult()方法来启动一个activity时,系统会直接返回Activity.Result_Canceled,而不再等待返回。这是由于Framework层对这两种启动方式的限制,因为开发者认为,不同Task之间默认是不能传递数据的,如果一定要传递,那就只能通过Intent来绑定。

IntentFlag启动模式

通过设置Intent的Flag来设置一个Activity的启动模式。

  • Intent.FlAG_ACTIVITY_NEW_TASK

    • 通常在service中启动Activity情景,由于service并不存在Activity栈,所以使用该Flag来创建一个新的栈,并创建新的Acitivity实例
  • FLAG_ACTIVITY_SINGLE_TOP

    • 与指定的android:launchMode=”singleTop” 效果类似
  • FLAG_ACTIVITY_CLEAR_TOP

    • 与指定的android:launchMode=”singleTask”效果类似
  • FLAG_ACTIVITY_NO_HISTORY

    • 使用这种模式启动Activity,当该Activity启动其他Activity后,该Activity就消失了

清空任务栈

在AndroidManifest.xml的 中使用以下几种属性,可用来清理任务栈

  • clearTaskOnLaunch

    • androdi:clearTaskOnLaunch=”true”,在每次返回该Activity时,都将该Activity之上的所有Activity都清除。
  • finishOnTaskLaunch

    • 当离开这个Activity所处的Task,那么用户再返回时,该Activity就会被finish掉
  • AlwaysRetainTaskState

    • 这个Activity所在的Task,将不会接受任何清理命令,一直保持的当前的Task状态

IntentFilter匹配规则

启动activity分为两种,显示和隐式。

隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果信息不匹配则无法启动目标Activity。IntentFilter中的过滤信息有action、category、data.

  • action匹配规则

    • action是一个字符串,系统预定了一些action,同时我们也可以在应用中自定义 ,action的匹配规则是Intent中的action必须能够和过滤规则中的action匹配,一个规则中可以有多个action,只要有一个匹配,则就匹配成功,这里说的匹配是指action的字符串完全一样,另外,action区分大小写
  • category的匹配规则

    • category是一个字符串,系统预定义了一些category,同时我们也可以在应用中定义自己的category。
      category的匹配规则和action不同,它要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个相同。
  • data的匹配规则

    • data的匹配规则和action类似,如果过滤规则中定义了data,那么Intent中也要定义可匹配的data.

    • data由两部分组成,mimeType和URI。mimeType指媒体类型。

      • Scheme: URI的模式,如http、file、content
      • Host: URI的主机名
      • Port: URI中端口号
      • Path、pathPattern和pathPrefix: 这三个参数表述路径信息,其中path表示完整路径信息;pathPattern也表示完整的路径信息,但是它可以包含通配符 “*” 表示0个或多个任意字符;pathPrefix表示路径的前缀信息。

        <intent-filter>
            <action android:name="com.xiaowu.test01.third" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*" />
        </intent-filter>`
        
posted @ 2017-04-12 14:30  jxiaow  阅读(76)  评论(0编辑  收藏  举报