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