Android Lollipop 行为改变

Android Lollipop behavior change

根据 Android Lollipop 的变化,参考:

Cheese factory blog

我希望当我从我的应用程序启动其他应用程序的 activity 时,它应该在新任务中打开,即使行为是默认的(启动模式是标准的)。因此,我制作了 2 个测试应用程序来验证相同的行为。但令人惊讶的是,如果没有指定启动模式,另一个应用程序总是在我的应用程序任务中打开。我已经在 Xiaomi Redmi Note 3 (5.1.1)、Marshmallow 模拟器 (x86) 上对此进行了测试,两者的行为相同。我很感激这方面的一些帮助,还有 link 供参考 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>

在启动应用程序时单击按钮,意图被触发并且 activity B 成功打开,但在 相同的任务中 。提前感谢任何 help/suggestions.

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

"standard" (the default mode): The system creates a new instance of the activity in the task from which it was started and routes the intent to it. The activity can be instantiated multiple times, each instance can belong to different tasks, and one task can have multiple instances. See full documentation

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

经过更多研究后,Android 5.0 Lollipop 中唯一(与此相关)的变化是最近的应用程序屏幕可以显示 activity 的多个实例。

In previous releases, the recents screen could only display only one task for each app that the user interacted with most recently. Now your app can open more tasks as needed for additional concurrent activities for documents. This feature facilitates multitasking by letting users quickly switch between individual activities and documents from the recents screen, with a consistent switching experience across all apps. Examples of such concurrent tasks might include open tabs in a web browser app, documents in a productivity app, concurrent matches in a game, or chats in a messaging app.

对我来说,这似乎是唯一相关的变化,post(cheesefactory 和 SO)已经 documentLaunchMode 设置为每个 activity 创建新任务(这很可能是考虑到奶酪工厂的案例有一个 "Gallery" 应用程序)。 concurrent documents and documentLaunchMode 上的文档。 documentLaunchMode 和标志 FLAG_ACTIVITY_NEW_TASK 可以配置为做类似的事情 documentLaunchMode 是首选。

我找到了下面的文档。

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

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

并参考以下link。

=> 默认情况下,myfirstapp.MainActivity 的启动模式为 "standard",并且未设置任何意图标志。 但是通过相册分享操作启动myfirstapp.MainActivity后,intent flag包含FLAG_ACTIVITY_MULTIPLE_TASK,FLAG_ACTIVITY_NEW_DOCUMENT。

当通过共享启动 activity 时,在其工具栏中包含共享的 activity 只是将 Intent 设置为其 ShareActionProvider,然后 ShareActionProvider 启动具有此 Intent 的 activity -在这种情况下,myfirstapp.MainActivity.

所以我认为从 Lollipop 开始,只有当 activity 通过共享操作启动时,系统才会从另一个应用程序开始 activity 的新任务,该应用程序的 launchMode 是 "standard" .