四大组件-Activity

1.四大组件之Activity

2.四大组件之Service

3.四大组件之ContentProvider

4.四大组件之Broadcast Receiver

1.为啥需要它?

Activity是显示型组件,用来显示APP的内容。一个Activity通常就是一个单独的屏幕,是用户交互的入口,在Android中不能被替代。

2.怎样使用它?

  • 显式调用
Intent intent = new Intent(this,xxx.class);
startActivity(intent);
  1. 显式调用需要明确的指定被启动对象的组件信息,包括包名和类名。
  2. Intent的构造函数内部实现实际上是调用ComponentName的构造。
  3. Intent 有三种重载形式。
Intent(String pkg,String cls)
Intent(Context pkg,String cls)
Intent(Context pkg,Class cls)
  • 隐式调用
  1. 隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity。
  2. IntentFilter中过滤信息有Action、category、data,下面是一个过滤规则的示例:
<intent-filter>        
    <action android:name="com.hyh.a"/>        
    <action android:name="com.hyh.b"/>        
    <category android:name="com.hyh.category.a"/>        
    <category android:name="com.hyh.category.b"/>        
    <category android:name="android.intent.category.DEFAULT"/><!--这个必须有-->        
    <data android:mimeType="text/plain"/>
</intent-filter>
  • 如何隐式启动这个Intent,参考如下:

Intent intent = new Intent();
intent.setAction("com.hyh.b");
Uri uri = Uri.parse("123");
intent.setDataAndType(uri,"text/plain");
intent.addCategory(Intent.CATEGORY_DEFAULT);
startActivity(intent);

  1. 一个Activity中可以有多组IntentFilter,只要匹配其中的一组即能启动该Activity。
  2. 策略中一定要有android.intent.category.DEFAULT这一项。原因:startActivity或者startActivityForResult的时候会默认为Intent加上”android.intent.category.DEFAULT”这个category,所以要在intent-filter中加。
  3. data由两部分组成,mimeType和URI。mimeType指媒体类型,比如image/jpeg、audio/mpeg4-generic、video/*和text/plain等,而URI中包含的数据就比较多了,下面是URI的结构:

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

  1. data的语法如下所示:

<data android:scheme="String"

      android:host="String"

      android:port="String"

      android:path="String"

      android:pathPattern="String"

      android:pathPrefix="String"

      android:mineType="String"/>

 

3.附加知识有哪些?

一.Activity的生命周期

  • 页面间的跳转

上一个页面onPause-->下一个页面onCreate-->onStart-->onResume-->上一个页面onStop.

  • 按返回键或者调用finish方法

下一个页面onPause-->上一个页面onRestart-->onStart-->onResume-->下一个页面onStop-->onDestroy.

  • 竖屏与横屏切换

onCreate()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroy-->onCreate()-->onStart()-->onResume()

  • 正常情况的生命周期

点击运行程序:onCreate()---->onStart()---->onResume().

回到桌面: onPause()--->onStop().

再次回到原Activity时:onRestart()--->onStart()--->onResume().

点击back回退时:onPause()--->onStop()--->onDestroy().

  • 异常情况的生命周期
  1. 异常情况下终止的,系统会调用onSaveInstanceState()来保存当前Activity的状态。这个方法可能在onPause()之前调用,也可能在onPause()之后调用。但是一定会在onStop之前。
  2. 异常情况下终止的,重新启动程序会调用onRestoreInstanceState方法。这个方法会在onStart之后调用。

总结:

onSaveInstanceState(Bundle outState)会在activity有可能被系统回收的情况下,而且是在onStop()之前。

注意是有可能,如果是已经确定会被销毁,比如用户按下了返回键,或者调用了finish()方法销毁activity,则onSaveInstanceState不会被调用:

1、当用户按下HOME键时。

2、从最近应用中选择运行其他的程序时。

3、按下电源按键(关闭屏幕显示)时。

4、从当前activity启动一个新的activity时。

5、屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)。

onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用,如屏幕进行横竖屏切换。

异常情况下启动:onCreate()--->onStart--->onRestoreInstanceState()--->onResume().

异常情况下终止:onPause()--->onSaveInstanceState()(注意:和onPause先后顺序不定)---->onStop()--->onDestory().

  • 系统配置改变

当系统配置发生改变后,Activity也会被重新创建。系统配置中有很多内容,如果当某项内容发生改变后,我们不想系统重新创建Activity,可以给Activity指定configChanges属性。比如不想让Activity在屏幕发生旋转变化的时候重新创建,就可以给configChangs属性添加orientation这个值,如下所示。

android:configChanges="orientation|keyboardHidden|screenSize"

在Activity中重写onConfigurationChanged(Configuration newConfig)

     configChanges的项目和含义

属性值

含义

mcc

SIM卡唯一标识IMSI(国际移动用户标识码)中的国家代码,由三位数字组成,中国为:460 这里标识mcc代码发生了改变

mnc

 

SIM卡唯一标识IMSI(国际移动用户标识码)中的运营商代码,有两位数字组成,中国移动TD系统为00,中国联通为01,电信为03,此项标识mnc发生了改变

locale

设备的本地位置发生了改变,一般指的是切换了系统语言

touchscreen

触摸屏发生了改变

keyboard

键盘类型发生了改变,比如用户使用了外接键盘

keyboardHidden

键盘的可访问性发生了改变,比如用户调出了键盘

navigation

系统导航方式发生了改变

screenLayout

屏幕布局发生了改变,很可能是用户激活了另外一个显示设备

fontScale

系统字体缩放比例发生了改变,比如用户选择了个新的字号

uiMode

用户界面模式发生了改变,比如开启夜间模式-API8新添加

orientation

屏幕方向发生改变,比如旋转了手机屏幕

screenSize

当屏幕尺寸信息发生改变(当编译选项中的minSdkVersion和targeSdkVersion均低于13时不会导致Activity重启)-API13新添加

smallestScreenSize

设备的物理屏幕尺寸发生改变,这个和屏幕方向没关系,比如切换到外部显示设备-API13新添加

layoutDirection

当布局方向发生改变的时候,正常情况下无法修改布局的layoutDirection的属性-API17新添加

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值