Android 总结4-四大组件

栏目: Android · 发布时间: 5年前

内容简介:(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop与生命周期密切相关的onSaveInstanceState方法和onRestoreInstanceState方法在什么时候执行?通过阅读源码会发现:横竖屏切换时或者非正常销毁(低优先级)。

(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop

  • (1)一个Activity或多或少会占有系统资源,而在官方的建议中,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。
  • 如果如果Activity(A) 切回桌面或者打开新Activity(B) :onPause() -> onStop();如果Activity(B)采用了透明主题,那么A不会走onStop()
  • (2)按照生命周期图的表示,如果用户在切换Activity的过程中再次切回原Activity,是在onPause方法后直接调用onResume方法的,这样比onPause→onStop→onRestart→onStart→onResume要快得多。

与生命周期密切相关的onSaveInstanceState方法和onRestoreInstanceState方法在什么时候执行?

通过阅读源码会发现:横竖屏切换时或者非正常销毁(低优先级)。

  • onSaveInstanceState 是在onStop()之前

  • onRestoreInstanceState是在onStart之后、onResume之前调用的。

->onPause->onSaveInstanceState->onStop->onCreate->onStart
->onRestoreInstanceState->onResume
  • android:ConfigChanges属性发生改变,Activity 就会重建。除非进行指定了该属性,这也就不会触发onSaveInstanceState,onRestoreInstanceState

2.Fragment生命周期

  • 单个 Activity + Fragment 的启动?
Activity onCreate
Fragment onAttach
Fragment onCreate
Fragment onCreateView
Fragment onViewCreated

Activity onStart
// 下面两个由 super.onStart 触发
Fragment onActivityCreated
Fragment onStart

Activity onResume

Activity onPostResume
// 下面一个由 super.onPostResume 触发
Activity onResumeFragments
// 下面一个由 super.onResumeFragments 触发
Fragment onResume

3.LaunchMode

  • 当使用AppplicationContext启动 standard 模式的Activity 会Crash。需要指定FLAG_ACTIVITY_NEW_TASK,启动一个新的任务栈。(Activity 栈:TaskRecord)
  • standard:默认模式,不断的新建一个新的 Activity 加入到当前栈顶。多实例,入当前栈

  • singleTop: 栈顶复用模式(栈顶单实例)。和默认模式相比,新启动一个 Activity 时,如果当前栈顶就是这个 Activity 的实例,那就不会创建新的 Activity,而是调用该实例的 onNewIntent() 方法。其他情况行为和默认模式一致

  • singleTask:栈内复用模式。所需任务栈中有就复用,并移除其上所有Activity并调用该实例的 onNewIntent() 方法。

    所需任务栈中没有就新创建一个栈,压栈。

    在启动 singleTask 的 Activity时,系统会先检查是否有 Task 的
    affinity 值与该 Activity 的 taskAffinity 相同,如果有,Activity
    就会在这个 Task 中启动,否则就会在新的 Task
    中启动。因此,如果我们想要设置了 singleTask 启动模式的 Activity
    在新的 Task 中启动,就要为它设置一个独立的 taskAffinity
    属性值。如果不是在新的 Task 中启动,它会在已有的 Task
    中查看是否已经存在相应的 Activity 实例,如果存在,
    就会把位于这个 Activity 实例上面的 Activity 全部结束掉,
    即最终这个 Activity 实例会位于该 Task 的栈顶,
    并调用该实例的 onNewIntent() 方法。
    
  • singleInstance:单独的位于一个任务栈中

上述中的所需任务栈:TaskAffinity参数可以标识所需任务栈的名字。默认是应用的包名。TaskAffinity 和 allowTaskReparenting结合使用,想象一下应用A拉起微信,切后台,点开微信,是A拉起的页面

4.IntentFilter

  • 启动Activity 可以分为显示调用和隐式调用。

    • 常规的显示调用不多说,需要明确指定被启动对象的组件信息,包括包名和类名:new Intent()

    • 隐式调用

      通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下。Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。一般是用于在不同应用程序之间.

      一个Activity 可以有多个 ,只要匹配上一个就可以。

      • action

        中可以有多个action;区分大小写

      • category

        intent中如果出现了category,不管有几个,都必须是intent filter中已经定义的category,也就是说intent可以没有category,一旦有,每个都必须和intent filter中定义的任意一个category相同;那为什么我们没在intent filter中加 android.intent.category.DEFAULT 这个category会报错呢?原因是系统在调用startActivity或者startActivityForResult的时候会默认在intent中加上 android.intent.category.DEFAULT 这个category。 系统会默认给个android.intent.category.DEFAULT

      • data

        可以配置scheme;host;port;path等等相当于scheme,夸应用常用scheme

5.广播(动态注册和静态注册区别,有序广播和标准广播)

  • 1.注册方式(动态注册 & 静态注册)
    • android中,我们如果想接收到广播信息,必须自定义我们的广播接收者。要写一个类来继承BroadcastReceiver,并且重写其onReceive()方法,实现接收到特定广播所要做的事情。
    • 动态注册-> 代码层级的registerReceiver
    • 静态注册-> Manifest.xml中静态注册
    • 动态注册不是常驻型广播,也就是说广播跟随activity的生命周期期。静态注册是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行
    • 动态注册的广播 永远要快于 静态注册的广播,不管静态注册的优先级设置的多高,不管动态注册的优先级有多低
// ------- 动态注册 -------
//new出上边定义好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver();

//实例化过滤器并设置要过滤的广播  
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");

//注册广播   
myContext.registerReceiver(smsBroadCastReceiver,intentFilter, 
             "android.permission.RECEIVE_SMS", null);

// --------- 静态注册 ---------
<receiver android:name=".MyBroadCastReceiver">  
            <!-- android:priority属性是设置此接收者的优先级(从-1000到1000) -->
            <intent-filter android:priority="20">
            <actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>  
            </intent-filter>  
</receiver>

<uses-permission android:name="android.permission.RECEIVE_SMS">
</uses-permission>
  • 2.有序广播和标准广播
    • 通过mContext.sendBroadcast(Intent)或mContext.sendBroadcast(Intent, String)发送的是无序广播(后者加了权限);
    • 通过mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)发送的是有序广播。
    • 无序广播:所有的接收者都会接收事件,不可以被拦截,不可以被修改。
    • 有序广播:按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。

以上所述就是小编给大家介绍的《Android 总结4-四大组件》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

测试驱动开发的艺术

测试驱动开发的艺术

Lasse Koskela / 李贝 / 人民邮电出版社 / 20101023 / 59.00元

在传统的软件开发中,开发人员对于代码是否正确心中无底,一切依赖于后期的测试环节。极限编程反其道而行之,主张采用测试驱动开发(TDD)的方法,即通过测试定义所要开发的功能的接口,然后实现功能的开发过程。TDD通过不断地测试推动代码的开发,既简化了代码,又保证了软件质量。 本书采用“手把手”的教学方式,通过大量实例来解释TDD,还专门用几章的篇幅来讲解如何为难于测试的技术编写单元测试。全书内容循......一起来看看 《测试驱动开发的艺术》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试