Android 5.0 Overview Screen--总览画面

 总览画面--overview screen,通常也指最近画面,最近任务表,或者是最近app,它是一个显示最近使用的activitys和tasks的系统级UI。用户可以通过它进行应用导航,或者是选择一个task 进行 resume,当然也可以将一个task或者是activity从该列表中移除

在Android L 中,一个activity里面会包含多个事件,故一个Activity中会有多个文件(document)以task的形式出现在overview screen中

如下图:Google Drive 中多个 document 组成一个task呈现在 overview screen中




通常来说,你应该允许系统决定你的task和activity是如何展现在overview screen 中的,而且你也不应该去修改这种行为。

但是你的app却可以确定何时、怎样出现在overview scree中。ActivityManager.AppTask 类能够让用户自己管理task,当然我们也可以在manifest文件中利用 Intent 类的flag 标签来描述一个activity是何时添加和从overview scren 中移除

在 Overview Screen 中添加 Task

使用 Intent 类的 Flag 标签在 overview screen 中添加task能狗提供关于一个document 在overview screen 中打开或者是重新打开的更大控制权

当你使用 <activity>属性,你则可以选择永远在一个新 task 中打开一个document 或者是为该document reuse 一个已经存在的task

使用 Intent flag 添加一个task

当你调用ActivityManager.AppTask类中的 startActivity() 方法时,当前的activity就会创建一个新的document,并给该document 传递一个 Intent 。 如果在给Intent 中添加 addFlags() 方法,并传递 flag:FLAG_ACTIVITY_NEW_DOCUMENT ,系统就会将创建的Activity 作为一个新的task显示在 overview screen中

注意:标签 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 在 Android 5.0 中已经弃用,替换为:FLAG_ACTIVITY_NEW_DOCUMENT

当你创建一个新的document的时候,如果在 Intent 中添加了 FLAG_ACTIVITY_MULTIPLE_TASK 标签,那么系统将会永远新建一个新的task,并把目标Activity设置为该task 的 root,这样就允许同一个 document 在多个task中打开。

具体实例如下:

<span style="font-family:Microsoft YaHei;font-size:14px;">public void createNewDocument(View view) {
      final Intent newDocumentIntent = newDocumentIntent();
      if (useMultipleTasks) {
          newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
      }
      startActivity(newDocumentIntent);
  }

  private Intent newDocumentIntent() {
      boolean useMultipleTasks = mCheckbox.isChecked();
      final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
      newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
      newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
      return newDocumentIntent;
  }

  private static int incrementAndGet() {
      Log.d(TAG, "incrementAndGet(): " + mDocumentCounter);
      return mDocumentCounter++;
  }
}</span>

 注意:被启动的Activity 如果被设置了FLAG_ACTIVITY_NEW_DOCUMENT  标签,那么它必须在mainfest 文件中设置启动属性为: android:launchMode="standard"

当主activity要启动一个新的activity的时候,系统就会搜索当前存在的task中哪个Intent 的 action name 和 Intent data 与主activity 传递过来的 Intent 匹配。关于Intent 是如何解析的,可以参考博客 Android Intent Filter 简析

如果没有找到匹配的task,或者是 主activity 的Intent 中包含FLAG_ACTIVITY_MULTIPLE_TASK 标签,那么系统就会新建一个task,并把该activity作为root activity

如果系统找到了一个匹配的task,则会将该task放到栈顶并传递一个Intent,新的activity 就会获取到这个Intent 并在overview screen 中创建一个新的document  

实例如下:

<span style="font-family:Microsoft YaHei;font-size:14px;">@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_document);
    mDocumentCount = getIntent()
            .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0);
    mDocumentCounterTextView = (TextView) findViewById(
            R.id.hello_new_document_text_view);
    setDocumentCounterText(R.string.hello_new_document_counter);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this activity
    is reused to create a new document.
     */
    setDocumentCounterText(R.string.reusing_document_counter);
}</span>

使用 activit 属性添加task

在一个activity在mainfest文件中添加 属性:android:documentLaunchMode 时,该activity被启动时永远会创建一个新的task。该属性有4个值,用户在应用中打开一个document时会有不同的效果:

intoExisting: activity 会为该document请求一个已经存在的task,这与 设置FLAG_ACTIVITY_NEW_DOCUMENT 且不设置 FLAG_ACTIVITY_MULTIPLE_TASK 有相同的效果

always: activity 会为该document创建一个新的task,即使该document已经被打开了,这与设置 FLAG_ACTIVITY_NEW_DOCUMENT 且设置 FLAG_ACTIVITY_MULTIPLE_TASK 有相同的效果

none:activity 不会为 document 创建新的task,该app被设置为 single task 的模式,它会重新调用用户唤醒的所有activity中的最近的一个

never:activity 不会为document创建一个新的task,设置这个值复写了 FLAG_ACTIVITY_NEW_DOCUMENT 和 FLAG_ACTIVITY_MULTIPLE_TASK 标签。如果其中一个标签被设置,并且overview screen 显示该app为 single task 模式。 则该activity 会重新调用用户最近唤醒的activity

注意: none 或 nerver 使用时,activity必须设置为 launchMode=”standard” ,如果该属性没有设置,documentLaunchMode=”none” 属性就会被使用

移除Tasks

默认情况下,当一个activity 被 finished 的时候,它的document tasks 就会被自动从 overview screen 中移除,然而,你也可以通过设置 <activity>的 android:excludeFromRecents 属性为true 来在overview screen 中移除 task

通过在 标签中设置 android:maxRecents 属性为一个 integer 类型的值,可以设置你的app在overview screen 中可以包含的task的最小值,默认是16,默认最大值是50,内存较低的可能为25.当overview screen中包含的一个app 的task到达最大值的时候,最近最少使用的task就会被移出overview screen

使用 AppTask 类 去移除 tasks

在一个你在overview screen中创建了一个task的activity中。你可以通过调用finishAndRemoveTask() 函数描述何时移除task 并结束所有的activitys 之间的关联

实例如下:

<span style="font-family:Microsoft YaHei;font-size:14px;">public void onRemoveFromRecents(View view) {
    // The document is no longer needed; remove its task.
    finishAndRemoveTask();
}</span>

注意:使用finishAndRemoveTask() 函数的方法复写了 FLAG_ACTIVITY_RETAIN_IN_RECENTS Tag,如下面所述

保留 finished 的 tasks

如果想要在overview screen 中保留一个task,即使它所属的activity 已经 finish 了,可以在要启动该activity的Intent中添加flag:FLAG_ACTIVITY_RETAIN_IN_RECENTS

实例如下:

<span style="font-family:Microsoft YaHei;font-size:14px;">private Intent newDocumentIntent() {
    final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
    newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
      android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
    newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
    return newDocumentIntent;
}</span>

同样的,在mainfest文件的<activity> 标签中设置属性: android:autoRemoveFromRecents 为false也有相同效果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值