`
gogoalong
  • 浏览: 49676 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

[Android基础]SingleTask和TaskAffinity

阅读更多

需求:第三方应用拉起本应用,返回时返回到第三方应用,且本应用没有被Kill掉。

最近研究微信调起自己客户端的事情,对于SingleTask和TaskAffinity的理解又多了一些理解。


以前对于Android的四种LaunchMode有一些了解,其中比较有意思的就是SingleTask和SingleInstance 。(四种LaunchMode的了解可以参见这篇文章,对于Activity栈的讲述很详细)。这两种LaunchMode的理解都跟Task有很大关系。

一个Task可以理解成一个Activtiy栈,可以装载一个或者多个Activity,回退和打开的顺序逻辑和基本的数据结构栈是一致的。下面的这段话非常关键:那就是,一个Application如果有N个Activity,这些Activity分布在M个Task中,那么Application的回退栈会遵循这样的原则,首先从当前Acitivty在的Task回退,直到这个Task中再无记录;那么会寻找下一个Task再次回退直到没有Activity(这个Task是怎么寻找的呢,其实Task在Appliction的总栈中也是有记载的,总是TasK中最近使用的Activity相关)。


下面是我对这两种比较难的LaunchMode的理解。

一 . SingleTask这个LaunchMode建议和TaskAffinity一起使用,这样才能发挥这种加载模式的特殊逻辑效果。当一个应用程序加载一个singleTask模式的Activity时,首先该Activity会检查是否存在与它的taskAffinity相同的Task。
1、如果存在,那么检查是否实例化,如果已经实例化,那么销毁在该Activity以上的Activity并调用onNewIntent。如果没有实例化,那么该Activity实例化并入栈。
2、如果不存在,那么就重新创建Task,并入栈。



二. 1、当一个应用程序加载一个singleInstance模式的Activity时,如果该Activity没有被实例化,那么就重新创建一个Task,并入栈,如果已经被实例化,那么就调用该Activity的onNewIntent;
2、singleInstance的Activity所在的Task不允许存在其他Activity,任何从该Activity加载的其它Actiivty(假设为Activity2)都会被放入其它的Task中,如果存在与Activity2相同affinity的Task,则在该Task内创建Activity2。如果不存在,则重新生成新的Task并入栈。

以上这些学习都是因为最近在做一个微信调起客户端的事情。如果自己的客户端处于运行状态,按下Home键后台挂起。此时如果使用微信调起自己的客户端某个页面,不做任何处理的情况下,按下回退或者当前Activity.finish(),页面都会停留在自己的客户端(因为自己的Application回退栈不为空),这明显不符合逻辑的。产品的要求是,回退必须回到微信客户端,而且要保证不杀死自己的Application.我的处理方案就是,设置当前被调起Activity的属性为:

LaunchMode=""SingleTask" taskAffinity="com.tencent.mm"(com.tencent.mm是借助于工具找到的微信包名),就是把自己的Activity放到微信默认的Task栈里面,这样回退时就会遵循“Task只要有Activity一定从本Task剩余Activity回退"的原则,不会回到自己的客户端;而且也不会影响自己客户端本来的Activity和Task逻辑。
分享到:
评论

相关推荐

    Android中Activity四种启动模式和taskAffinity属性详解-Rong

    为了管理Activity的生命周期和用户界面的流程,Android系统提供了一系列的机制和属性,其中包括四种不同的Activity启动模式以及taskAffinity属性。这些启动模式和属性共同作用于Activity所属的任务栈(Task)和后退...

    Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags()

    1. **不修改启动代码,仅修改 AndroidManifest.xml 中的配置**:为 AsecondActivity 设置 `android:launchMode="singleTask"` 和 `android:taskAffinity="com.xjp"`,这将使 AsecondActivity 创建在名为 `com.xjp` ...

    android 艺术开发探索 读书笔记(1-3章)

    - 是Android中实现IPC的基础技术之一。 - 它作为客户端和服务端之间通信的媒介,允许不同进程中的对象进行交互。 - 在实现 `Service` 和 `AIDL` 时经常用到。 3. **多进程实现**: - 可以为四大组件指定 `...

    android xml属性总结

    `android:taskAffinity` 影响Activity在任务管理中的关联程度,通常用于保持同一应用内Activity的紧密联系。 #### 19. `android:theme` 定义Activity的主题样式,可以独立于整个应用的主题,实现更个性化的设计...

    android 面试总结.doc

    Android面试总结涵盖了Android基础知识的重点,特别是四大组件:Activity、Service、BroadcastReceiver以及ContentProvider。这里主要探讨Activity和Service的相关知识点。 1. Activity Activity是Android应用程序...

    android启动优化的操作,通过启动器task来进行启动优化

    本文将深入探讨通过启动器Task进行Android启动优化的设计思路和技术实现。首先,我们需要理解什么是启动器Task以及它在Android系统中的作用。 启动器Task(Launcher Task)是Android系统中负责启动应用程序主界面的...

    android 学习心得

    - **`android:launchMode`**:控制Activity的启动模式,主要有四种:`multiple`、`singleTop`、`singleTask` 和 `singleInstance`。 - **`android:multiprocess`**:如果设置为 `true`,则表示此Activity运行在单独...

    Android_XML属性大全

    `android:taskAffinity`** - **功能描述**:定义Activity的任务亲缘性。 - **应用场景**:如果设置为空字符串,则所有同一应用中的Activity共享相同的任务亲缘性。 **20. `android:theme`** - **功能描述**:...

    Android 应用程序模块 应用, 任务, 进程, 和线程--千锋培训

    通过在AndroidManifest.xml中为Activity指定`android:taskAffinity`属性,可以控制Activity的任务归属。默认情况下,所有同属一个应用的Activity具有相同的亲和力,都在同一任务中。 4. **启动模式(Launch Modes)...

    Android密码锁屏的实现,解决Home,Back问题

    android:launchMode="singleTask" android:taskAffinity="" android:theme="@android:style/Theme.NoDisplay"> <action android:name="android.intent.action.MAIN" /> <category android:name="android....

    android activity和task

    - `android:taskAffinity`:用于自定义Activity的Affinity,使其可以归属于非默认Task。 5. Activity的四种加载模式: - 标准模式(Standard):每次启动都会创建新的实例,可以放入任何Task。 - 单实例模式...

    android activity研究

    本文将深入探讨 `Activity` 的基本概念及其配置参数,并对 `Intent`、`TaskAffinity` 和 `Launch Mode` 进行详解。 #### 二、Activity 基础概念 **1. Activity 定义:** - **定义**:`Activity` 可以理解为一个...

    android面试题1

    - **Android:taskAffinity**: 定义了 Activity 所属的任务,如果值为空,则 Activity 会加入到启动它的 Activity 的任务中;如果指定了一个非空字符串,则 Activity 会被放到一个单独的任务中。 #### 3. 通过 ...

    Android activity属性

    #### android:taskAffinity 定义了`Activity`的所属任务,通常同一应用的`Activity`具有相同亲缘关系,但可以通过此属性调整。 #### android:theme 设置了`Activity`的主题,决定了UI的外观风格。若未设置,则继承...

    activity的设置大全

    此属性用于控制`Activity`的启动模式,包括`standard`、`singleTop`、`singleTask`和`singleInstance`四种模式。不同的启动模式会影响`Activity`实例的创建和栈中的行为。 **示例:** ```xml <activity android:...

    android面试集锦

    此外,`android:taskAffinity`属性决定了Activity是否与其他组件属于同一任务堆栈,这在多应用交互场景下尤为关键。 #### Intent数据传输方式 在Android中,可以通过以下两种方式使用`Intent`进行数据传输: 1. *...

    Android模拟Activity进出栈.zip

    2. **Activity启动模式**:Android提供了四种启动模式:标准模式(Standard)、单实例模式(SingleInstance)、单任务模式(SingleTask)和单栈顶模式(SingleTop)。这些模式决定了新启动的Activity如何与当前的...

    android面试常见问题

    通过设置`android:taskAffinity`属性,可以控制Activity是否与其他具有相同affinity的Activity处于同一任务堆栈中。 #### 3. 通过Intent传递二进制数据的方法 - **使用Serializable接口**: 将对象实现Serializable...

    Android面试题.doc

    12. **程序亲和性**:定义了Activity与Task的关系,影响Activity在哪个Task中启动,可通过`android:taskAffinity`属性设置。 13. **不同Activity在同一Task**:可以,通过指定启动模式,如`singleTask`或`...

Global site tag (gtag.js) - Google Analytics