四大组件之Activity(下)
更新时间 | 修改意见 |
---|---|
2016-08-02 | 陈敏 |
第4节 系统设置改变onConfigurationChanged
当设备的系统设置发生变化时,例如横竖屏切换、语言变化,可以被Activity感知到。
4.1 监听系统设置改变
系统设置发生变化可以通知到Activity,
在
AndroidManifest.xml
文件当中,给对应的Activity标签,添加android:configChanges
属性,例如<activity android:name=".AlertActivity"<!--指定Activity关注的系统变化类型,这里只表示关注屏幕大小是否变化-screenSize、设备方向是否变化-orientation-->android:configChanges="screenSize|orientation"> </activity>
在需要在实现Activity的代码中做出相应的修改:
@Override
public void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);//从newConfig中获取感兴趣的系统配置变化事件,例如屏幕方向是否变化,系统语言是否变化等等if(Configuration.ORIENTATION_PORTRAIT == newConfig.orientation) {}
}
在manifest中指定关注的是screenSize
和orientation
,那么当手机从横屏变化成竖屏(或者竖屏变化成横屏)的时候,这个函数就会被调用,就可以在这里添加我们需要的代码。
系统变化的种类很多,除了screenSize
和orientation
还有:keyboardHidden
locale
fontScale
等等。
4.2 设备旋转
我们可以用两种方法处理设备的旋转,
让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>
让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标签还有一些我们常用到的属性。
这里的
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,那么桌面上将有三个图标,供用户点击启动。
指定Activity的主题。安卓系统为界面元素设计了几种不同的显示风格,叫做主题。关于主题的详细介绍我们将放在以后的章节。
<activity android:name=".AlertActivity"<!--指定Activity的主题-->android:theme="@android:style/Theme.Dialog"> </activity>
指定Activity的启动方式。启动方式在下一小节详细讲述。
<activity android:name=".AlertActivity"<!--指定Activity的启动模式-->android:launchMode="standard"> </activity>
指定Activity是否关注系统配置的变化,如果关注,当这些配置发生变化的时候,将通过Activity的
onConfigurationChanged()
函数通知到。<activity android:name=".AlertActivity"<!--指定Activity关注的系统变化类型,这里只表示关注屏幕大小是否变化-screenSize、设备方向是否变化-orientation-->android:configChanges="screenSize|orientation"> </activity>
响应特定的
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信息。
例如这里记录了,
- 系统中有一个
Task id
为#178
的Task
; Task
栈中的Activity,从上到下依次是TaskRecord---com.android.launcher3/.Launcher
,一个Activity
;- 并且
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(下)相关推荐
- 安卓入门系列-08四大组件之Activity
Activity详解 什么是Activity Android提供的四大组件(activity.service.contentprovider.broadcast receiver)之一.它是一个界面的 ...
- Android实训课程之三 这次课老师先是提到了Android有四大组件:Activity、Service、Broadcast Receiver、Content Provider。然后重点提到Acti
Android实训课程之三 这次课老师先是提到了Android有四大组件:Activity.Service.BroadcastReceiver.ContentProvider.然后重点提到Activi ...
- Android基础再回首——四大组件之Activity、Service俩兄弟
Android基础再回首--四大组件之Activity.Service俩兄弟 偶尔的回首过去,总是有不一样的收获.今天就来回顾下Activity和service吧,不用嫌弃太基础了,打好基础是取得成功 ...
- 第一章 四大组件 之 Activity(一)
文章目录 第一组件 Activity (一)Activity生命周期 1.生命周期五大状态 2.生命周期流程 3.常见场景的生命周期调用方式 4.具体场景生命周期调用方式 (1)横竖屏切换对Activ ...
- 【Android】安卓四大组件之Activity(一)
[Android]安卓四大组件之Activity(一) 前言 Activity是Android学习中的一个重要组件,想要对其进行系统的了解可以分为几块内容,这一大章节的内容是有关于activity之间 ...
- Android四大组件之——Activity的生命周期(图文详解)
转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai 联系方式:JohnTsai.Work@gmail.com [Andro ...
- Android四大组件之Activity(第一篇-简单使用)
Android四大组件之Activity(第一篇-简单使用) 前言 一.Activity是什么? 二.如何使用 1.继承 2.重写onCreate() 总结 文章目录 前言 一.Activity是什么 ...
- 【Android 四大组件之Activity】一文吃透Activity 生命周期
作者:半身风雪 简介:在Android组件中最基本也是最为常见的四大组件: Activity Service服务 Content Provider内容提供者 BroadcastReceiver广播接收 ...
- 安卓四大组件之Activity
1.Activity简介 它是安卓四大组件之一,用于界面的展示,是最贴切用户的一个组件,所以说它的操作 都与用户密切相关,可以通过setContentView来显示制定控件.通常情况下,在一个安卓应用 ...
- 重温Android四大组件(一)—Activity的生命周期
前言 四大组件对于Android开发者是老生常谈的知识了,相信每个Android开发者对四大组件都已经很熟悉了.但是四大组件作为Android应用的基础,作为开发者不仅要熟悉而且要烂熟于心. 这里以& ...
最新文章
- 有谁还用QuickReport吗?
- 小程序 textarea ios兼容解决
- linux mysql启动_MySQL 安装(二)
- C++之运算符重载(上)
- SpringBoot—数据库初始化脚本配置
- 一加手机安装鸿蒙系统,【新机】华为MatePad Pro 2官宣,刘作虎点赞鸿蒙手机
- 配置ssh免密码登录
- 适用于ActiveX v18.6 x86的Codejock Xtreme Suite Pro
- matlab如何绘制函数方程,如何使用MatLab来绘制函数曲线方程图像?
- 机器学习算法工程师面试问题
- Qt制作QQ好友列表
- JMETER-清除cookies
- Linux中对的tac命令
- kotlin作用域函数let run whith apply also 的区别takeIf 的用法
- 使用AWS最便宜的GPU实例 from 动手学深度学习v2 李沐大神
- 保险业首季度保费收入猛增五成
- 经济法基础(2020年)——第三章 支付结算法律制度
- 全球及中国同步电容器行业研究及十四五规划分析报告(2022)
- Understand Tensor Deeply
- 微信支付收银台功能上线了
热门文章
- SpringBoot+Editormd实现markdown文本编辑和图片上传
- vscode美化:主题切换+背景图片设置
- vi编辑器的使用 快捷键
- sm缩写代表什么意思_狗狗各种表情都分别代表着什么意思
- 第6期:大学生应该选择哪种主流编程语言
- 解决局域网文件共享“****无法复制,指定的网络名不可用”
- [Accessibility] ****************** Loading GAX Client Bundle ****************
- 充电速度公式_关于电池充电时间计算公式
- C++实现 利用前序序列和中序序列构建二叉树
- Android多国语言的国家代码