【问题标题】:Activity does not show in the recents android最近的android中没有显示活动
【发布时间】:2016-11-24 09:09:41
【问题描述】:

场景 - 我没有在后台运行我的应用程序。我为 ACTION_USER_PRESENT 实现了一个接收器。在此接收器中,我启动了一个活动,其清单设置为:

<activity android:name=".activity.MyActivityB"
        android:excludeFromRecents="true"
        android:noHistory="true"
        android:screenOrientation="portrait"/>

这是因为其中有一个横幅,我将积分归功于用户,我不希望用户能够一次又一次地为同一个横幅启动它。

从这个活动中,我在某个按钮按下时启动另一个活动。这个新的 Activity MyNewActivity 是这样启动的:

 Intent intent = new Intent(MyActivityB.this, MyNewActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                this.startActivity(intent);
                Intent closeintent = new Intent("MAIN_ACTIVITY_CLOSE");
                closeintent.putExtra("action", "close");
              LocalBroadcastManager.getInstance(this).sendBroadcast(closeintent);
                MyActivityB.this.finish();

现在,如果我长按主页按钮或最近的按钮,我的新活动应该会出现在最近的活动中。

但问题是,当我按下主页时,MyNewActivity 没有显示在最近。

MyNewActivity 在 Manifest 中是这样定义的:

 <activity
        android:name=".activity.MyNewActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait" />

我做错了什么,为什么 MyNewActivity 没有出现在最近。

【问题讨论】:

    标签: android broadcastreceiver android-recents


    【解决方案1】:

    根据文档android:excludeFromRecents

    此活动启动的任务应从最近使用的应用程序列表(概览屏幕)中排除。也就是说,当这个activity是一个新任务的根activity时,这个属性决定了这个task是否不应该出现在最近的应用列表中。

    默认情况下,应用程序的所有活动都具有相同的亲和性。具有相同亲和力的活动在概念上属于同一任务。因此,在这种情况下,MyActivityBMyNewActivity 都属于同一个任务。 android:excludeFromRecents 确保任务未在最近的应用程序中列出。

    这就是原因,当 android:excludeFromRecentsMyActivityB 设置为 true 时,MyNewActivity 从历史记录中消失。

    解决方案:

    使用android:taskAffinity 为这两个活动指定不同的任务。如果该任务根本不应该显示在历史记录中,请使用 android:excludeFromRecents 代替 MyActivityB

    <activity android:name=".activity.MyActivityB"
            android:taskAffinity=".MyActivityB"
            android:excludeFromRecents="true"
            android:noHistory="true"
            android:screenOrientation="portrait"/>
    
     <activity
            android:name=".activity.MyNewActivity"
            android:taskAffinity=".MyNewActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" />
    

    【讨论】:

    • 如果我给他们两个都赋予了任务亲和性,那么 MyNewActivity 会启动并显示在最近,但如果我的应用程序当时在后台并带有主要活动,那么我的应用程序的两个实例会显示在最近
    • 为所有活动(“.MainActivity”)赋予相同的任务亲和力值,而为 MyActivityB 赋予不同的值(“.MyActivityB”)
    • 尝试从MyNewActivity中删除android:taskAffinity=".MyNewActivity"
    • 经过大量努力,我发现 android:excludeFromRecents="true" 删除它并像这样开始新活动:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);我在某处读到它会删除当前任务并使新任务成为新任务堆栈的开始。但随后home press上的activity B仍然显示在recents中。
    【解决方案2】:

    从您的清单中删除 android:excludeFromRecents="true"。因为它会从最近删除您的应用程序。

    【讨论】:

    • 只删除这个没有帮助。
    • 删除该行后您是否面临同样的问题
    • 部分答案但不完整
    【解决方案3】:

    是否应排除此活动发起的任务 从最近使用的应用程序列表中,概览屏幕。那 也就是说,当这个活动是一个新任务的根活动时,这个 属性决定任务是否不应该出现在列表中 最近的应用程序。如果该任务应从列表中排除,则设置为“true”; 如果应该包含它,则设置为“false”。默认值为“false”。

    从此android:excludeFromRecents 删除当前任务中的所有活动。在android中,除非您指定,否则应用程序中的所有活动都具有相同的亲和力并且属于相同的任务。在您的情况下,因为新活动与您以前的活动在同一任务中开始,并且android系统也在从最近的列表中删除新活动。因此,您需要在清单中为清单中的每个 Activity 指定 android:taskAffinity,它将解决您的问题。

    详情请咨询android documentation

    修复:使用 android:taskAffinity

    <activity android:name=".activity.MyActivityB"
            android:excludeFromRecents="true"
        android:taskAffinity=".MyActivityB"
            android:noHistory="true"
            android:screenOrientation="portrait"/>
    
     <activity
            android:name=".activity.MyNewActivity"
        android:taskAffinity=".MyNewActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait" />
    

    【讨论】:

    • 如果我给他们两个都赋予了任务亲和性,那么 MyNewActivity 会启动并显示在最近,但如果我的应用程序当时在后台并带有主要活动,那么我的应用程序的两个实例会显示在最近
    • 为所有活动赋予相同的任务亲和力值,而为 MyActivityB 赋予不同的值
    • 如果我不分配给任何其他活动而只分配给 MyActivityB 那么这也意味着其他人具有相同的亲和力(默认)。
    • 是的,默认情况下所有活动都具有相同的亲和力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多