在android.intent.action.USER\u上将任务置于最前面

在android.intent.action.USER\u上将任务置于最前面,android,android-activity,task,Android,Android Activity,Task,背景 我有一个包含多个活动的任务(即应用程序) 问题 如何将任务置于前端,而不重新排序该任务的活动堆栈 用户场景 当设备启动时(即在收到android.intent.action.BOOT_完成广播后),我的应用程序启动,调用此任务1,并显示活动A(下面的代码)。当用户与任务1交互时,他/她打开堆栈上的活动B(活动B当前显示在屏幕上)。接下来,用户轻触home键并打开其他任务,称之为task 2,然后锁定屏幕。用户解锁屏幕,android.intent.action.user_当前意图被广播并由

背景
我有一个包含多个活动的任务(即应用程序)

问题
如何将任务置于前端,而不重新排序该任务的活动堆栈

用户场景
当设备启动时(即在收到android.intent.action.BOOT_完成广播后),我的应用程序启动,调用此任务1,并显示活动A(下面的代码)。当用户与任务1交互时,他/她打开堆栈上的活动B(活动B当前显示在屏幕上)。接下来,用户轻触home键并打开其他任务,称之为task 2,然后锁定屏幕。用户解锁屏幕,android.intent.action.user_当前意图被广播并由我的应用程序接收(参见下面的清单片段)。My按预期在我的IntentReceiver类中执行startActivity()调用,但它不只是将任务置于前台,而是创建了一个新任务,称之为task 3

我尝试过的更改
如果我将Intent.FLAG\u ACTIVITY\u NEW\u任务修改或更改为任何其他Intent,则会收到以下错误消息:

从活动上下文外部调用startActivity()需要 标志\u活动\u新建\u任务标志。这真的是你想要的吗

…所以看起来我必须使用Intent.FLAG\u ACTIVITY\u NEW\u TASK

如果我将主活动的lauchMode更改为“singleTask”,则正确的任务将被带到前台(即不创建新任务),但活动堆栈将被重新排序,以便活动_A位于堆栈顶部

在这一点上,我不知道如何将现有任务带到前台,而不重新排序活动堆栈,同时侦听android.intent.action.USER\u当前的意图,如有任何帮助,将不胜感激

顺便说一句,该应用程序正在公司拥有的安卓设备上交付给一组员工,而不是普通公众

代码片段
要启动应用程序,我在清单文件中设置了一个广播接收器

<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>

下面是一个对我有用的略显粗糙的实现:

  • 创建一个简单的BringToFront活动,该活动只需在其
    onCreate()
    上执行
    finish()

  • 在您的BroadcastReceiver中,如果操作是用户在场,则启动上面的BringToFront活动,而不是您的活动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);
    }
    
    @覆盖
    公共void onReceive(上下文、意图){
    
    类好的,我可以通过在我的主活动(activity_a)中添加一个静态全局变量来实现这一点。在onCreate中,我设置isRunning=true,onDestory=false。然后在我的IntenternetReceiver类中,我检查isRunning以确定要启动的活动:

                :
        if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
            if (GlobalVariables.isRunning) {
                activityClass = BringToFront.class;
            } else {
                activityClass = activity_A.class;
            }
        } else if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            activityClass = activity_A.class;
        }
                :
    

    这几乎可以在以下情况下工作:(1)应用程序正在运行;(2)用户退出应用程序(主活动调用finish());(3)用户锁定屏幕;(4)用户解锁屏幕。在这种情况下,应用程序接收Intent.ACTION\u user\u PRESENT(请参阅logcat中的my Log.i语句)因此,它会按预期启动和退出BringToFront.class活动,但由于应用程序之前已退出,堆栈中不存在其他活动,用户将返回主屏幕(或之前显示的任何应用程序)。我如何知道应用程序是否正在运行,以便我可以启动活动课程?您节省了我的时间。Joe在过去两天一直在搜索。这是一个很好的解决方法。@Joe为Pre Honeycom做了什么?@celoftis您记得在退出时注销您的广播接收器吗?
    @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);
    }
    
                :
        if (intent.getAction().equals(Intent.ACTION_USER_PRESENT)) {
            if (GlobalVariables.isRunning) {
                activityClass = BringToFront.class;
            } else {
                activityClass = activity_A.class;
            }
        } else if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            activityClass = activity_A.class;
        }
                :