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


ActivityAndroid 系统中使用最频繁的组件,刚入门 Android 就需要使用它。Activity 包含了许多隐藏的知识,需要深入了解才能更好的使用它


主要内容

  1. Activity 浅析(Android Activity - 1
  2. 生命周期
  3. 退出情况分析(Android Activity - 2
  4. 任务与返回栈
  5. 启动模式
  6. BaseActivity.javaAndroid Activity - 3
  7. 清理返回栈
  8. 屏幕方向

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。该属性只对任务的根 Activitythe root activity) 有意义;对于所有其他 Activity,均忽略该属性

正常情况下,当用户从主屏幕重新选择某个任务时,系统会在特定情况下清除该任务(从根 Activity 之上的堆栈中移除所有 Activity)。 系统通常会在用户一段时间(如 30 分钟)内未访问任务时执行此操作。

不过,如果该属性的值是 true,则无论用户如何到达任务,将始终返回到最后状态的任务。 例如,在网络浏览器这类存在大量用户不愿失去的状态(如多个打开的标签)的应用中,该属性会很有用。

clearTaskOnLaunch

这个属性作用和 alwaysRetainTaskState 相反,无论什么时候再次返回任务,都会结束所有任务,仅保留栈底 Activity

是否每当从主屏幕重新启动任务时都从中移除根 Activity 之外的所有 Activitytrue 表示始终将任务清除到只剩其根 Activityfalse表示不做清除。 默认值为 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"