更新时间 修改意见
2016-08-02 陈敏

第4节 系统设置改变onConfigurationChanged

当设备的系统设置发生变化时,例如横竖屏切换、语言变化,可以被Activity感知到。

4.1 监听系统设置改变

系统设置发生变化可以通知到Activity,

  1. AndroidManifest.xml文件当中,给对应的Activity标签,添加android:configChanges属性,例如

    <activity android:name=".AlertActivity"<!--指定Activity关注的系统变化类型,这里只表示关注屏幕大小是否变化-screenSize、设备方向是否变化-orientation-->android:configChanges="screenSize|orientation">
    </activity>
  2. 在需要在实现Activity的代码中做出相应的修改:

@Override
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);//从newConfig中获取感兴趣的系统配置变化事件,例如屏幕方向是否变化,系统语言是否变化等等if(Configuration.ORIENTATION_PORTRAIT == newConfig.orientation) {}
}

在manifest中指定关注的是screenSizeorientation,那么当手机从横屏变化成竖屏(或者竖屏变化成横屏)的时候,这个函数就会被调用,就可以在这里添加我们需要的代码。

系统变化的种类很多,除了screenSizeorientation还有:keyboardHidden locale fontScale等等。

4.2 设备旋转

我们可以用两种方法处理设备的旋转,

  1. 让Activity不跟随设备方向的旋转而旋转,它只有竖屏(或只有横屏)的界面。要做到这一点很容易,在AndroidManifest.xml文件中,给这个Activity组件加上android:screenOrientation="portrait"
    (保持竖屏)或者android:screenOrientation="landscape"(保持横屏)的属性就可以了;

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.anddle.anddleplayer"><application
            ......><activity
                android:name=".VideoListActivity"android:screenOrientation="landscape"></activity>......</application>
    </manifest>
  2. 让Activity跟随设备方向的旋转而旋转。
    采用章节3.2中介绍的方法。


/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/

第5节 Activity的Manifest配置

Actiity需要在AndroidManifest.xml文件中进行声明。

5.1 Activity的声明

Activity作为四大组件,代码中每定义一个Activity就需要在AndroidManifest.xml文件中声明它。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.anddle.activitytest"><application
        android:icon="@mipmap/ic_launcher"android:label="@string/app_name"><!--第一个Activity--><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><!--第二个Activity--><activity android:name=".AlertActivity"android:theme="@android:style/Theme.Dialog"></activity></application></manifest>

5.2 Activity标签常用属性

Activity标签还有一些我们常用到的属性。

  1. 这里的intent-filter标签内指定的内容表示:这个Activity可以作为这个应用程序的入口。

    <activity android:name=".MainActivity"><!--指定应用入口--><intent-filter> <action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>
    </activity>

    直观一点,就是说它可以被放在桌面上,供用户通过点击直接进入。假如一个应用有三个这种intent-filter配置的Activity,那么桌面上将有三个图标,供用户点击启动。

  2. 指定Activity的主题。安卓系统为界面元素设计了几种不同的显示风格,叫做主题。关于主题的详细介绍我们将放在以后的章节。

    <activity android:name=".AlertActivity"<!--指定Activity的主题-->android:theme="@android:style/Theme.Dialog">
    </activity>
  3. 指定Activity的启动方式。启动方式在下一小节详细讲述。

    <activity android:name=".AlertActivity"<!--指定Activity的启动模式-->android:launchMode="standard">
    </activity>
  4. 指定Activity是否关注系统配置的变化,如果关注,当这些配置发生变化的时候,将通过Activity的onConfigurationChanged()函数通知到。

    <activity android:name=".AlertActivity"<!--指定Activity关注的系统变化类型,这里只表示关注屏幕大小是否变化-screenSize、设备方向是否变化-orientation-->android:configChanges="screenSize|orientation">
    </activity>
  5. 响应特定的Action,遇到这样的Action就可以启动该Activity,

    <activity android:name=".VideoPlayer"><intent-filter><action android:name="android.intent.action.myaction" /></intent-filter>
    </activity>

    那么,启动该Activity的代码,就可以通过它配置中的Action

    Intent i = new Intent("android.intent.action.myaction");
    startActivity(i);

除了以上列出的一些属性外,Activity的很多特性都可以这样设置。


/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/

第6节 Activity启动模式

Activity的启动模式,就是指当用户或者系统启动一个Activity时,将这个Activity如何放到Task中进行管理。

<activity android:name=".AlertActivity"<!--指定Activity的启动模式-->android:launchMode="standard">
</activity>

Activity有四种启动方式:standard、singleTop、singleTask、singleInstance。

6.1 standard模式

这是每个Activity默认的启动模式,如果我们没有在manifest中指定,那么Activity启动就会采用这个模式。这个模式很简单,原则只有一个:当启动这种类型的Activity时,每次创建一个全新的Activity,然后将它放在当前Task栈的栈顶。

进一步举个例子:Activity A上,有一个按钮,点击后,可以再启动一个Activity A。这时我们看到的Task堆栈情况就是,Activity A上又创建了一个Activity A。这两个Activity都是Activity A的实例,是互相独立的Activity,在内存中有各自的一块区域。

6.2 singleTop模式

这个启动模式的原则是:当启动这个类型的Activity时,如果这个Activity有实例在当前Task中存在,并且位于这个Task的栈顶,那么就触发Activity的onNewIntent()方法通知一下,而不用重新创建;

否则,即使这个Task中有这个Activity实例,只要它不在栈顶,就重新创建;


使用场景:一个新闻客户端会接收新闻推送,在statusbar上显示已经收到10条推送了。当我们点击第一条的时候,启动一个显示新闻内容的Activity-ContentActivity,当我们点击statusbar上的第二条新闻时,再次启动ContentActivity。如果ContentActivity是standard模式,可以想见,在之前的新闻内容上,又回弹出一个Activity,10条推送点击十次,就会有10个Activity叠在一起。

麻烦的是返回时得按10次,而且会占用很多系统资源。

如果将ContentActivity指定为singleTop,那么点击后面9条推送时,ContentActivity只会通过onNewIntent()知道有新的调用请求,不必重新创建9个Activity实例过份消耗资源。

6.3 singleTask模式

这个启动模式的原则是:当启动这个类型的Activity时,先查看这个Activity是否有实例在系统当前的Task中存在。

6.3.1 前台Task中存在

如果它在位于前台的task中存在,并且位于这个Task的栈顶,那么就调用onNewIntent()通知一下,而不用重新创建--这一点与singleTop模式类似;

如果存在,但是不在Task的栈顶,就将这个Activity上面别的Activity全部弹出、销毁,把这个Activity的实例放到最上面,再用onNewIntent()通知它一次。

6.3.2 后台Task中存在

如果它在位于后台的task中存在,就把后台task放到前台来,然后把它上面存在的别的Activity弹出、销毁。


使用场景:应用的主Activity A,可以启动Activity B, Activity B又能启动Activity C,C又能启动D,设计者希望从D能够直接返回到主Activity A。

对于这种希望在任意层级的Activity下,快速返回到主界面的应用,就可以把主Activity A设置成singleTask模式。

6.4 singleInstance模式

这个启动模式的原则是:当启动这个类型的Activity时,如果该Activity之前并不存在,就会重新创建一个Task,并把该Activity放入其中。假如这个Activity要启动别的Activity-C(一个standard的Activity),那么就会将Activity-C放在之前那个Task中。

如果该Activity已经存在,就把该Activity所在的task切换到前台来。
总之,一个task中有且只有一个这种类型的Activity。


使用场景:对于那种需要提供给第三方调用的Activity,例如微信的分享、转发,就可以把这种Activity设置成singgleInstance。这样在系统范围内保证只有一个这样的Activity存在。


/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。
/*******************************************************************/

第7节 ADB工具调试Activity

为了帮助我们深入学习Activity,这里介绍通过ADB工具获取系统中现有Activity信息的方法。

7.1 打印系统Activity信息

用命令行工具进入adb所在的目录,
输入adb shell dumpsys activity activities,会输出类似如下的内容:

$ ./adb shell dumpsys activity activitiesACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):Stack #0:Task id #178* TaskRecord{cce8184 #178 I=com.android.launcher3/.Launcher U=0 sz=1}userId=0 effectiveUid=u0a8 mCallingUid=0 mCallingPackage=nullintent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher3/.Launcher}realActivity=com.android.launcher3/.LauncherautoRemoveRecents=false isPersistable=true numFullscreen=1 taskType=1 mTaskToReturnTo=0rootWasReset=false mNeverRelinquishIdentity=true mReuseTask=false mLockTaskAuth=LOCK_TASK_AUTH_PINNABLEActivities=[ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}]askedCompatMode=false inRecents=true isAvailable=truelastThumbnail=null lastThumbnailFile=/data/system/recent_images/178_task_thumbnail.pngstackId=0hasBeenVisible=true mResizeable=false firstActiveTime=1451983947131 lastActiveTime=1451983947131 (inactive for 2501s)* Hist #0: ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}packageName=com.android.launcher3 processName=com.android.launcher3launchedFromUid=0 launchedFromPackage=null userId=0app=ProcessRecord{f7b8d6d 25040:com.android.launcher3/u0a8}Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.launcher3/.Launcher }frontOfTask=true task=TaskRecord{cce8184 #178 I=com.android.launcher3/.Launcher U=0 sz=1}taskAffinity=nullrealActivity=com.android.launcher3/.LauncherbaseDir=/system/priv-app/Launcher3/Launcher3.apkdataDir=/data/user/0/com.android.launcher3stateNotNeeded=true componentSpecified=false mActivityType=1compat={420dpi} labelRes=0x7f0c0005 icon=0x7f030000 theme=0x7f0e000econfig={1.0 310mcc260mnc zh_CN ldltr sw411dp w411dp h659dp 420dpi nrml port finger qwerty/v/v dpad/v s.6}stackConfigOverride={1.0 ?mcc?mnc ?locale ?layoutDir ?swdp ?wdp ?hdp ?density ?lsize ?long ?orien ?uimode ?night ?touch ?keyb/?/? ?nav/?}taskDescription: iconFilename=null label="null" color=ff212121launchFailed=false launchCount=1 lastLaunchTime=-41m41s66mshaveState=false icicle=nullstate=RESUMED stopped=false delayedResume=false finishing=falsekeysPaused=false inHistory=true visible=true sleeping=false idle=truefullscreen=true noDisplay=false immersive=false launchMode=2frozenBeforeDestroy=false forceNewConfig=falsemActivityType=HOME_ACTIVITY_TYPEwaitingVisible=false nowVisible=true lastVisibleTime=-41m39s31msRunning activities (most recent first):TaskRecord{cce8184 #178 I=com.android.launcher3/.Launcher U=0 sz=1}Run #0: ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}mResumedActivity: ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}mFocusedActivity: ActivityRecord{b820c49 u0 com.android.launcher3/.Launcher t178}mFocusedStack=ActivityStack{c009da2 stackId=0, 1 tasks} mLastFocusedStack=ActivityStack{c009da2 stackId=0, 1 tasks}mSleepTimeout=falsemCurTaskId=178mUserStackInFront={}mActivityContainers={0=ActivtyContainer{0}A}mLockTaskModeState=NONE mLockTaskPackages (userId:packages)=0:[]mLockTaskModeTasks[]

它记录下了当前安卓系统中所有的Task,以及每个Task中包含的Activity信息。

例如这里记录了,

  1. 系统中有一个Task id#178Task;
  2. Task栈中的Activity,从上到下依次是TaskRecord---com.android.launcher3/.Launcher,一个Activity
  3. 并且com.android.launcher3/.Launcher这个Activity是位于前台的Activity

这些信息对程序的调试会有很大的帮助。

7.2 ADB启动Activity

用ADB工具启动已知Activity,

$ ./adb shell am start -n 包名/包名.activity名称

//或者
$ ./adb shell am start -n 包名/.activity名称

这里的包名就形如:com.android.launcher3,例如

$ ./adb shell am start -n com.android.launcher3/com.android.launcher3.Launcher//或者
$ ./adb shell am start -n com.android.launcher3/.Launcher

/*******************************************************************/
* 版权声明
* 本教程只在CSDN和安豆网发布,其他网站出现本教程均属侵权。

*另外,我们还推出了Arduino智能硬件相关的教程,您可以在我们的网店跟我学Arduino编程中购买相关硬件。同时也感谢大家对我们这些码农的支持。

*最后再次感谢各位读者对安豆的支持,谢谢:)
/*******************************************************************/

四大组件之Activity(下)相关推荐

  1. 安卓入门系列-08四大组件之Activity

    Activity详解 什么是Activity Android提供的四大组件(activity.service.contentprovider.broadcast receiver)之一.它是一个界面的 ...

  2. Android实训课程之三 这次课老师先是提到了Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider。然后重点提到Acti

    Android实训课程之三 这次课老师先是提到了Android有四大组件:Activity.Service.BroadcastReceiver.ContentProvider.然后重点提到Activi ...

  3. Android基础再回首——四大组件之Activity、Service俩兄弟

    Android基础再回首--四大组件之Activity.Service俩兄弟 偶尔的回首过去,总是有不一样的收获.今天就来回顾下Activity和service吧,不用嫌弃太基础了,打好基础是取得成功 ...

  4. 第一章 四大组件 之 Activity(一)

    文章目录 第一组件 Activity (一)Activity生命周期 1.生命周期五大状态 2.生命周期流程 3.常见场景的生命周期调用方式 4.具体场景生命周期调用方式 (1)横竖屏切换对Activ ...

  5. 【Android】安卓四大组件之Activity(一)

    [Android]安卓四大组件之Activity(一) 前言 Activity是Android学习中的一个重要组件,想要对其进行系统的了解可以分为几块内容,这一大章节的内容是有关于activity之间 ...

  6. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  7. Android四大组件之Activity(第一篇-简单使用)

    Android四大组件之Activity(第一篇-简单使用) 前言 一.Activity是什么? 二.如何使用 1.继承 2.重写onCreate() 总结 文章目录 前言 一.Activity是什么 ...

  8. 【Android 四大组件之Activity】一文吃透Activity 生命周期

    作者:半身风雪 简介:在Android组件中最基本也是最为常见的四大组件: Activity Service服务 Content Provider内容提供者 BroadcastReceiver广播接收 ...

  9. 安卓四大组件之Activity

    1.Activity简介 它是安卓四大组件之一,用于界面的展示,是最贴切用户的一个组件,所以说它的操作 都与用户密切相关,可以通过setContentView来显示制定控件.通常情况下,在一个安卓应用 ...

  10. 重温Android四大组件(一)—Activity的生命周期

    前言 四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了.但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心. 这里以& ...

最新文章

  1. 有谁还用QuickReport吗?
  2. 小程序 textarea ios兼容解决
  3. linux mysql启动_MySQL 安装(二)
  4. C++之运算符重载(上)
  5. SpringBoot—数据库初始化脚本配置
  6. 一加手机安装鸿蒙系统,【新机】华为MatePad Pro 2官宣,刘作虎点赞鸿蒙手机
  7. 配置ssh免密码登录
  8. 适用于ActiveX v18.6 x86的Codejock Xtreme Suite Pro
  9. matlab如何绘制函数方程,如何使用MatLab来绘制函数曲线方程图像?
  10. 机器学习算法工程师面试问题
  11. Qt制作QQ好友列表
  12. JMETER-清除cookies
  13. Linux中对的tac命令
  14. kotlin作用域函数let run whith apply also 的区别takeIf 的用法
  15. 使用AWS最便宜的GPU实例  from 动手学深度学习v2 李沐大神
  16. 保险业首季度保费收入猛增五成
  17. 经济法基础(2020年)——第三章 支付结算法律制度
  18. 全球及中国同步电容器行业研究及十四五规划分析报告(2022)
  19. Understand Tensor Deeply
  20. 微信支付收银台功能上线了

热门文章

  1. SpringBoot+Editormd实现markdown文本编辑和图片上传
  2. vscode美化:主题切换+背景图片设置
  3. vi编辑器的使用   快捷键
  4. sm缩写代表什么意思_狗狗各种表情都分别代表着什么意思
  5. 第6期:大学生应该选择哪种主流编程语言
  6. 解决局域网文件共享“****无法复制,指定的网络名不可用”
  7. [Accessibility] ****************** Loading GAX Client Bundle ****************
  8. 充电速度公式_关于电池充电时间计算公式
  9. C++实现 利用前序序列和中序序列构建二叉树
  10. Android多国语言的国家代码