23

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

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

7 回答 7

66
Intent intent = new Intent(context, MyRootActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);

您应该将您的起始活动或活动用于MyRootActivity.

这会将现有任务带到前台,而无需实际创建新 Activity。如果您的应用程序没有运行,它将创建一个实例MyRootActivity并启动它。

编辑

我添加Intent.FLAG_ACTIVITY_SINGLE_TOP到 Intent 以使其真正起作用!

第二次编辑

还有另一种方法可以做到这一点。您可以模拟应用程序的“启动”,就像当用户从可用应用程序列表中选择它时 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);
于 2012-08-22T14:26:31.230 回答
11

对我有用的组合是使用:

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

如果您在从启动器图标启动活动时检查设备上的日志,则这是通过启动应用程序或将其移回前台(例如,如果用户单击主页按钮)传递的意图。

于 2015-04-23T06:33:42.807 回答
10

您可以使用以下代码将应用程序置于最前面:

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();
        }
    }
于 2015-09-23T10:04:16.527 回答
9

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

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

    }

它对我有用,但是谁能告诉我为什么包必须为空

于 2016-01-07T10:32:32.873 回答
4

根据我的测试,要模仿 Launcher 的行为,关键是:

intent.setPackage(null);

Intent intent = packageManager.getLaunchIntentForPackage(pkName);

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

感谢嘉庆的回答,因为我没有评论的权利,所以我发布了这个答案。我也不知道这背后的逻辑,我猜它与任务所有者有关。任何人都知道,很高兴知道。

于 2017-05-08T09:03:54.880 回答
4

使用 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;
                 }
             }
}
于 2020-04-08T13:45:43.933 回答
1

对于警报,您想看看启动Android 服务

此服务将比您的应用程序更具弹性,后者可能会在后台被终止,并且可以在警报响起时触发将您的应用程序置于最前面(或如果它被终止,则重新启动它)的意图。

于 2012-08-22T14:24:59.313 回答