Android Activity
来源:互联网 发布:神界原罪2低配优化 编辑:程序博客网 时间:2024/06/01 18:02
参考:
Activity:https://developer.android.com/guide/components/activities.html
任务和返回栈:https://developer.android.com/guide/components/tasks-and-back-stack.html
Activity
是 Android
系统中使用最频繁的组件,刚入门 Android
就需要使用它。Activity
包含了许多隐藏的知识,需要深入了解才能更好的使用它
主要内容
Activity
浅析(Android Activity - 1
)- 生命周期
- 退出情况分析(
Android Activity - 2
) - 任务与返回栈
- 启动模式
BaseActivity.java
(Android Activity - 3
)- 清理返回栈
- 屏幕方向
BaseActivity.java
BaseActivity.java
完整的 BaseActivity.java
如下:
public class BaseActivity extends AppCompatActivity { private static final String TAG = "BaseActivity"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); taskInfo(); Log.d(TAG, "onCreate: " + getLocalClassName()); } @Override protected void onRestart() { super.onRestart(); Log.d(TAG, "onRestart: " + getLocalClassName()); } @Override protected void onStart() { super.onStart(); Log.d(TAG, "onStart: " + getLocalClassName()); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume: " + getLocalClassName()); } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause: " + getLocalClassName()); } @Override protected void onStop() { super.onStop(); Log.d(TAG, "onStop: " + getLocalClassName()); } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy: " + getLocalClassName()); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Log.d(TAG, "onActivityResult: " + getLocalClassName()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); Log.d(TAG, "onNewIntent: " + getLocalClassName()); } private void taskInfo() { ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); List<ActivityManager.AppTask> appTaskList = manager.getAppTasks(); PackageManager packageManager = getPackageManager(); for (int i = 0; i < appTaskList.size(); i++) { ActivityManager.AppTask appTask = appTaskList.get(i); ActivityManager.RecentTaskInfo info = appTask.getTaskInfo(); if (getTaskId() == info.id) { String str = String.format(Locale.CHINA, "taskId = %d numActivities = %d isTaskRoot = %b isTaskTop = %b", getTaskId(), info.numActivities, isTaskRoot(), info.topActivity.getShortClassName().equals(getComponentName().getShortClassName())); Log.d(TAG, "taskInfo: " + str); } } try { ActivityInfo activityInfo = packageManager.getActivityInfo(getComponentName(), PackageManager.MATCH_ALL); StringBuilder sb = new StringBuilder(); String str = "taskAffinity = " + activityInfo.taskAffinity + " launchMode = "; sb.append(str); switch (activityInfo.launchMode) { case 0: sb.append("standard"); break; case 1: sb.append("singleTop"); break; case 2: sb.append("singleTask"); break; case 3: sb.append("singleInstance"); break; } Log.d(TAG, "taskInfo: " + sb.toString()); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } }}
清理返回栈
默认情况下,如果用户长时间离开任务,则系统会清除任务所有 Activity
,仅保留栈底Activity
(到底多长时间?)。所以当用户再次返回到任务时,仅恢复栈底 Activity
通过在清单文件中设置 <activity>
的属性,可以改变这种行为
有效的属性有 3
个:
alwaysRetainTaskState
clearTaskOnLaunch
finishOnTaskLaunch
alwaysRetainTaskState
系统是否始终保持 Activity
所在任务的状态 — true
表示保持,false
表示允许系统在特定情况下将任务重置到其初始状态。 默认值为 false
。该属性只对任务的根 Activity
(the root activity
) 有意义;对于所有其他 Activity
,均忽略该属性
正常情况下,当用户从主屏幕重新选择某个任务时,系统会在特定情况下清除该任务(从根 Activity
之上的堆栈中移除所有 Activity
)。 系统通常会在用户一段时间(如 30
分钟)内未访问任务时执行此操作。
不过,如果该属性的值是 true
,则无论用户如何到达任务,将始终返回到最后状态的任务。 例如,在网络浏览器这类存在大量用户不愿失去的状态(如多个打开的标签)的应用中,该属性会很有用。
clearTaskOnLaunch
这个属性作用和 alwaysRetainTaskState
相反,无论什么时候再次返回任务,都会结束所有任务,仅保留栈底 Activity
是否每当从主屏幕重新启动任务时都从中移除根 Activity
之外的所有 Activity
— true
表示始终将任务清除到只剩其根 Activity
;false
表示不做清除。 默认值为 false
。该属性只对启动新任务的 Activity
(根 Activity
)有意义;对于任务中的所有其他 Activity
,均忽略该属性。
当值为 true
时,每次用户再次启动任务时,无论用户最后在任务中正在执行哪个 Activity
,也无论用户是使用返回还是主屏幕按钮离开,都会将用户转至任务的根 Activity
。 当值为 false
时,可在某些情况下清除任务中的 Activity
(请参阅 alwaysRetainTaskState
属性),但并非一律可以。
例如,假定有人从主屏幕启动了 Activity P
,然后从那里转到 Activity Q
。该用户接着按了主屏幕按钮,然后返回到 Activity P
。正常情况下,用户将看到 Activity Q
,因为那是其最后在 P
的任务中执行的 Activity
。 不过,如果 P
将此标志设置为 true
,则当用户按下主屏幕将任务转入后台时,其上的所有 Activity
(在本例中为 Q
)都会被移除。 因此用户返回任务时只会看到 P
。
如果该属性和 allowTaskReparenting
的值均为 true
,则如上所述,任何可以更改父项的 Activity
都将转移到与其有亲和关系的任务;其余 Activity
随即被移除。
finishOnTaskLaunch
每当用户再次启动其任务(在主屏幕上选择任务)时,是否应关闭(完成)现有 Activity
实例 —true
表示应关闭,false
表示不应关闭。 默认值为 false
如果该属性和 allowTaskReparenting
均为 true
,则优先使用该属性。 Activity
的亲和关系会被忽略。 系统不是更改 Activity
的父项,而是将其销毁。
屏幕方向
参考:android:screenOrientation
属性 android:screenOrientation
可以固定 Activity
的显示方向
如果需要固定显示 Activity
运行方向为纵向(显示的高度大于宽度),设置为 portrait
:
android:screenOrientation="portrait"
或者固定显示方向为横向(显示的宽度大于高度),设置为 landscape
:
android:screenOrientation="landscape"
- Android Activity---启动Activity
- Android Activity---关闭Activity
- Android Activity---协调Activity
- Android Activity---启动Activity
- Android Activity---关闭Activity
- Android Activity---协调Activity
- Android Activity
- android activity
- Android Activity
- Android Activity
- android activity
- Android Activity
- android activity
- android activity
- android activity
- Android Activity
- android activity
- android activity
- [Leetcode]69. Sqrt(x)解析@Python
- 【git】git初学习
- SpringMVC中的多文件上传
- 回溯法-bfs--迷宫问题的最短路径
- linux环境变量 export命令详解
- Android Activity
- 【JVM】Java-JVM-OutOfMemoryError实战
- CentOS 6.5_x64安装Oracle 11g R2
- Java多线程基础
- C++ Streams
- mysql导入大量数据时报MySQL server has gone away错误的解决办法
- ArrayList源码学习
- 【Data_Structure笔记7】排序算法之【链式基数排序】
- SpringBoot01