Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在用户单击主页按钮后将应用程序置于最前面_Android - Fatal编程技术网

Android 在用户单击主页按钮后将应用程序置于最前面

Android 在用户单击主页按钮后将应用程序置于最前面,android,Android,我的应用程序处于运行模式[前台],用户单击主页按钮,将应用程序置于后台[并仍在运行]。我的应用程序中有报警功能,可以启动。我想要的是,当我的闹钟响起时,我想让我的后台运行的应用程序处于前台,从它上次运行的状态开始 <application android:name="com.abc.android.state.management.MainEPGApp" android:icon="@drawable/icon"

我的应用程序处于运行模式[前台],用户单击主页按钮,将应用程序置于后台[并仍在运行]。我的应用程序中有报警功能,可以启动。我想要的是,当我的闹钟响起时,我想让我的后台运行的应用程序处于前台,从它上次运行的状态开始

    <application
            android:name="com.abc.android.state.management.MainEPGApp"
            android:icon="@drawable/icon"
            android:label="@string/app_name"
            android:largeHeap="true"
            android:logo="@drawable/app_logo" >
            <activity
                android:name=".SplashScreen"
                android:label="@string/app_name"
                android:launchMode="singleTop"
                android:screenOrientation="nosensor"
                android:theme="@style/Theme.Sherlock" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        <activity
                    android:name=".Starter"
                    android:configChanges="orientation|screenSize"
                    android:screenOrientation="behind"
                    android:launchMode="singleTop"
                    android:uiOptions="none"
                    android:windowSoftInputMode="adjustPan" />
</application>

对于警报,您需要查看启动警报

此服务将比您的应用程序更具弹性,您的应用程序可能在后台被终止,并且可以在警报响起时触发一个警报,将您的应用程序带到前台(或者在应用程序被终止时重新启动应用程序)

Intent intent = new Intent(context, MyRootActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
对于
MyRootActivity
,您应该使用起始或root活动

这将使现有任务进入前台,而不实际创建新活动。如果应用程序未运行,它将创建一个
MyRootActivity
实例并启动它

编辑

我在Intent中添加了
Intent.FLAG\u ACTIVITY\u SINGLE\u TOP
,让它真正起作用

第二次编辑

还有另一种方法可以做到这一点。当用户从可用应用程序列表中选择应用程序时,您可以模拟应用程序的“启动”,就像Android启动应用程序一样。如果用户启动了一个已经在运行的应用程序,Android只会将现有任务带到前台(这是您想要的)。这样做:

Intent intent = new Intent(context, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // You need this if starting
                                                //  the activity from a service
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);

对我有效的组合是使用:

Intent bringToForegroundIntent = new Intent(context, RootActivity.class);
bringToForegroundIntent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(bringToForegroundIntent);

如果无论何时从启动程序图标启动活动,都要检查设备上的日志,这就是启动应用程序或将其移回前台(例如用户单击“主页”按钮)的意图。

您可以使用以下代码将应用程序带到前台:

private void bringApplicationToFront()
    {

        Log.d(TAG, "====Bringging Application to Front====");

        Intent notificationIntent = new Intent(this, MainActivity.class);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
        try 
        {
            pendingIntent.send();
        }
        catch (CanceledException e) 
        {
            e.printStackTrace();
        }
    }

我找到了一种将应用程序推向前台的新方法, 它模仿点击图标来启动应用程序

    PackageManager packageManager = context.getPackageManager();
    Intent intent = packageManager.getLaunchIntentForPackage(pkName);
    if (intent != null)
    {
            //模拟点击桌面图标的启动参数
            intent.setPackage(null);
         // intent.setSourceBounds(new Rect(804,378, 1068, 657));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
           context.startActivity(intent);

    }

这对我来说是可行的,但谁能告诉我为什么在我的测试中包必须为null呢?要模拟启动器的行为,关键是:

intent.setPackage(空)

之后

Intent-Intent=packageManager.getLaunchIntentForPackage(pkName)

这个线程中的其他方法在我的情况下不起作用


多亏了嘉庆的回答,我发布了这个答案,因为我没有评论的权利。我也不知道这背后的逻辑,我想这与任务负责人有关。任何人都知道,很高兴知道。

使用ActivityManager类,您可以将正在运行的任务带到前台

void bringToFront(){

 ActivityManager activtyManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
 List<ActivityManager.RunningTaskInfo> runningTaskInfos = activtyManager.getRunningTasks(3);
 for (ActivityManager.RunningTaskInfo runningTaskInfo : runningTaskInfos)
            {
              if (this.getPackageName().equals(runningTaskInfo.topActivity.getPackageName()))
                {
                     activtyManager.moveTaskToFront(runningTaskInfo.id, ActivityManager.MOVE_TASK_WITH_HOME);
                     return;
                 }
             }
}
void bringToFront(){
ActivityManager ActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_服务);
List runningTaskInfos=ActivityManager.getRunningTasks(3);
对于(ActivityManager.RunningTaskInfo RunningTaskInfo:runningTaskInfos)
{
if(this.getPackageName().equals(runningTaskInfo.topActivity.getPackageName()))
{
ActivityManager.moveTaskToFront(运行TaskInfo.id,ActivityManager.MOVE_TASK_WITH_HOME);
返回;
}
}
}

Alarm功能是使用AlarmManager和PendingEvent通过应用程序启动的,该应用程序不包括任何Android服务。是的,它在intent中起作用。addFlags(intent.FLAG_ACTIVITY_NEW_TASK)做了一个小动作,但我将根活动作为新活动启动,它不会保留它离开的状态。实际上,我正在根活动中处理5个片段。但您的答案是,它开始了新的根活动,第一个片段已初始化。无论如何,这是我必须解决的另一个问题,但到目前为止,以上的答案对我有效。谢谢你的舱单。如果您在后台有一个根活动仍处于活动状态(即:未完成)的现有任务,它不应该创建任何新活动,只需将该任务放到前台即可。嗯……不<代码>意图。当Android将后台任务带到前台时,会设置将活动带到前台的标志。你可以设置它,如果你想,但它不做任何事情。另外,
launchMode=“singleInstance”
仅用于主屏幕的更换。请注意,如果您的根活动现在启动另一个活动,则该活动将不会启动到同一任务中,而是将启动到新任务中。如果这是你的应用程序的活动之一,你将造成大量混乱,因为你现在有两个任务,它们在最近的列表中都有相同的名称和图标。如果其他人看到这一点,只想提到David的“第二次编辑”中的解决方案对我来说效果很好。@FerranMaylinch请看Android 4.4之前的版本中有一个问题,如果您从活动
上下文
调用
startActivity()
,它将无法工作。这仅在应用程序有一个活动时才起作用。如果应用程序有多个活动,而用户不在根活动中,此代码将不会使应用程序以与OP相同的状态进入前台,这是OP的要求。@David Wasser。不,我的启动器活动是启动屏幕,我将主要活动带到前面,它工作正常。您的解决方案不起作用,因此我将代码放在这里。实际上,流程是这样的:我的主要活动中有一个广播接收器,当它接收广播时,如果我的主要活动在后台,那么我希望主要活动出现在前台。我的解决方案应该有效,但我不知道为什么不行。也许你可以提出一个新问题,我们可以看看为什么它不起作用。通常,如果您不确切知道用户所处的
活动
,那么您的解决方案将不起作用。只有当您确切地知道用户处于
main活动中时,它才起作用。你的答案不是一个好的通用解决方案,尽管它可能在特定情况下有效。没有pa