【问题标题】:Android Lollipop behavior changeAndroid Lollipop 行为更改
【发布时间】:2016-06-15 06:05:58
【问题描述】:

根据 Android Lollipop 的变化,参考:

StackOverflow Question

Cheese factory blog

我希望当我从我的应用程序启动其他应用程序的活动时,它应该在新任务中打开,即使行为是默认的(启动模式是标准的)。因此,我制作了 2 个测试应用程序来验证相同的行为。但令人惊讶的是,如果没有指定启动模式,另一个应用程序总是在我的应用程序任务中打开。我已经在小米红米 Note 3 (5.1.1)、Marshmallow 模拟器 (x86) 上对此进行了测试,两者的行为是相同的。我很感激这方面的一些帮助,以及来自 Android 开发者网站的参考链接。

一些代码:

Launching app : 
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
startActivity(intent);
break;

App to be launched : 
<activity android:name="com.android.sample.launchdemo.ActivityB">
         <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
</activity>

在启动应用程序时单击按钮,就会触发 Intent 并且活动 B 成功打开,但在相同的任务中。提前感谢您的任何帮助/建议。

【问题讨论】:

  • @Yvette 你是对的,但不幸的是,删除启动模式不会改变行为。我已经更新了问题中的代码 sn-p。

标签: android android-5.0-lollipop launchmode


【解决方案1】:

查看文档后,我的感觉是标准模式的工作方式与 Android 5.0 (Lollipop) 之前的工作方式相同。奶酪工厂的博客文章是唯一指定该操作的文章,甚至根据我自己的经验,标准启动模式已经在发送它的同一任务中打开了一个活动(除非通过了意图标志)。如果我错了,有人纠正我,但 Android 文档中没有指定标准模式会打开一个新任务。来自 Android 文档:

“标准”(默认模式):系统在启动它的任务中创建一个新的活动实例,并将意图路由到它。 Activity可以被实例化多次,每个实例可以属于不同的任务,一个任务可以有多个实例。 See full documentation

对于您正在寻找的内容,在启动 Intent 时,保证新任务的唯一方法是使用标志 FLAG_ACTIVITY_NEW_TASK。您可以通过调用intent.setFlag(Intent.FLAG_ACTIVITY_NEW_TASK)intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 来设置它(后者用于将标志链接在一起,因为该方法将返回意图)。

在进行更多研究后,Android 5.0 Lollipop 中似乎做出的唯一更改(与此相关)是最近的应用程序屏幕可以显示活动的多个实例。

在以前的版本中,最近的屏幕只能为用户最近与之交互的每个应用显示一个任务。现在,您的应用可以根据需要为文档的其他并发活动打开更多任务。此功能可让用户在最近的屏幕上快速切换单个活动和文档,从而促进多任务处理,并在所有应用程序之间提供一致的切换体验。此类并发任务的示例可能包括 Web 浏览器应用中的打开选项卡、生产力应用中的文档、游戏中的并发匹配或消息传递应用中的聊天。

对我来说,这似乎是唯一相关的变化,并且帖子(cheesefactory 和 SO)设置了 documentLaunchMode 为每个活动创建新任务(考虑到 cheesefactory 有一个“画廊”应用程序,这很可能是这种情况) .关于concurrent documentsdocumentLaunchMode 的文档。 documentLaunchMode 和标志 FLAG_ACTIVITY_NEW_TASK 可以配置为做类似的事情 documentLaunchMode 是首选。

【讨论】:

  • 我也有同样的感觉,但是这两个链接是矛盾的,这造成了一些混乱。另外,据我记得,我曾在某处的开发者网站上看到过这种新行为,但再也找不到了。它似乎以某种方式丢失了。
  • @gauravjain 我还发现了这种行为的其他实例,但从未在开发人员网站上找到,也许该功能已实现然后被删除?我会继续研究这个,看看我是否能找到解决方案
  • @gauravjain 我已更新我的答案以包含更多研究并接受此答案,因为它是最接近解决方案的答案。很抱歉没有找到更好的。
【解决方案2】:

我在下面找到了文档。

https://developer.android.com/guide/components/activities/recents.html

=> 当用户使用他们的浏览器并点击共享 > Gmail 时。出现 Gmail 应用程序的撰写屏幕。此时点击“最近”按钮会显示 Chrome 和 Gmail 作为单独的任务运行。在较低版本的 Android 中,所有活动都显示为单个任务,使后退按钮成为唯一的导航方式。图 2 显示了 Android 5.0 及更高版本与较低版本平台的“最近”屏幕的外观。左侧屏幕上的图像适用于 Android 5.0 及更高版本,右侧的图像显示了它在较低版本的 Android 中的显示方式。

并参考以下链接。 Lollipop: making my activity stay in the task that launched the share intent

=> 默认情况下,myfirstapp.MainActivity 的launchMode 是“标准”并且未设置任何意图标志。 但是通过 Album 的 share action 启动 myfirstapp.MainActivity 后,intent flag 包含 FLAG_ACTIVITY_MULTIPLE_TASK、FLAG_ACTIVITY_NEW_DOCUMENT。

当一个activity通过share启动时,一个在它的Toolbar中包含share的activity只是将Intent设置为它的ShareActionProvider,然后ShareActionProvider用这个Intent启动一个activity——在这个例子中是myfirstapp.MainActivity。

所以我认为,从 Lollipop 开始,系统仅在通过共享操作启动 Activity 时才从另一个应用程序的启动模式为“标准”的 Activity 开始新任务。

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多