gpt4 book ai didi

android - 在 android.intent.action.USER_PRESENT 上将任务置于最前面

转载 作者:太空宇宙 更新时间:2023-11-03 13:02:47 24 4
gpt4 key购买 nike

背景
我有一个包含多项 Activity 的任务(即应用程序)。

问题
如何在不为该任务的 Activity 堆栈重新排序的情况下将任务置于最前面?

用户场景
当设备启动时(即在收到 android.intent.action.BOOT_COMPLETED 广播后)我的应用程序启动,调用此任务 1,并显示 Activity A(下面的代码)。当用户与任务 1 交互时,他/她在堆栈上打开 Activity B( Activity B 现在当前显示在屏幕上)。接下来用户点击主页键并打开一些其他任务,称之为任务 2,然后锁定屏幕。用户解锁屏幕,android.intent.action.USER_PRESENT Intent 被广播并由我的应用程序接收(参见下面的 list fragment )。我按预期在我的 IntentReceiver 类中执行了 startActivity() 调用,但它并没有将任务带到前台,而是创建了一个新任务,将其称为任务 3。

我尝试过的改变
如果我将 Intent.FLAG_ACTIVITY_NEW_TASK 修改或更改为任何其他 Intent ,则会收到此错误消息:

Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

...所以看起来我必须使用 Intent.FLAG_ACTIVITY_NEW_TASK。

如果我将主要 Activity 的 lauchMode 更改为“singleTask”,正确的任务将被带到前台(即没有创建新任务),但 Activity 堆栈会重新排序,以便 activity_A 位于堆栈顶部。

在这一点上,我不知道如何在监听 android.intent.action.USER_PRESENT Intent 时将现有任务带到前台而不重新排序 Activity 堆栈,我们将不胜感激。

顺便说一句,此应用程序正在公司拥有的 Android 设备上交付给一群员工,而不是公众。

代码 fragment
为了启动应用程序,我在我的 list 文件中设置了一个广播接收器。

<application
:
<activity
android:label="@string/app_name"
android:launchMode="singleTop"
android:name=".activities.activity_A" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
:
<receiver
android:enabled="true"
android:name=".utilities.IntentReceiver"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />

<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

在我的 IntentReceiver 类中,我开始我的主要 Activity ...

public class IntentReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, activity_A.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}

最佳答案

这里有一个对我有用的有点 hackish 的实现:

  • 创建一个简单的 BringToFront Activity ,该 Activity 仅在其 onCreate()finish() 自身:

    public class BringToFront extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    finish();
    }

    }
  • 在您的 BroadcastReceiver 中,如果操作是 USER_PRESENT,则启动上面的 BringToFront Activity 而不是您的 activity_A:

    @Override
    public void onReceive(Context context, Intent intent) {
    Class<? extends Activity> activityClass = activity_A.class;

    if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
    activityClass = BringToFront.class;
    }

    Intent i = new Intent(context, activityClass);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
    }

之所以可行,是因为 BringToFront Activity 与您的 activity_A 具有相同的 taskAffinity 并且启动它会使系统将现有任务带到前台。 BringToFront Activity 然后立即退出,将任务中的最后一个 Activity (场景中的 activity_B)带到最前面。

值得注意的是,在 API 级别 11 (Honeycomb) 上,moveTaskToFront() 方法被添加到系统的 ActivityManager 中。服务可能是实现您想要的目标的更好方式。

关于android - 在 android.intent.action.USER_PRESENT 上将任务置于最前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com