通知恢复任务而不是特定的活动?

我有一个前台服务,只要用户login到应用程序,就可以保持连接与服务器打开。 这样,即使应用程序已由用户按Home键发送到后台,连接仍保持活动状态,并可直接从服务器接收消息。

应用程序有许多活动,其中任何活动可能是活动的,当它被发送到后台。

我想让用户点击通知来恢复当前活动。 我知道如何恢复一个特定的活动,但想知道是否有一种方法来恢复用户的最后一个活动? 当然,我可以跟踪最后一个,然后从Notificationcallback中调用它,但是认为在任务级别可能有一种方法?

感谢您提供的任何build议。

你需要的只是一个简单的活动,什么都不做。 这里是一个例子:

public class NotificationActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Now finish, which will drop the user in to the activity that was at the top // of the task stack finish(); } } 

设置你的通知来开始这个活动。 确保在清单中,此活动的任务关联性与应用程序中其他活动的任务关联性相同(默认情况下,如果未明确设置android:taskAffinity )。

当用户select此通知时,如果您的应用程序正在运行,那么NotificationActivity将在应用程序任务的最顶层活动之上启动并且该任务将被带到前台。 当NotificationActivity完成时,它将简单地将用户返回到应用程序中的最顶层活动(即,用户在进入后台时将其留在任何地方)。

如果您的应用程序尚未运行,这将不起作用。 但是,您有两个选项来处理这个问题:

  1. 确保应用程序未运行时通知栏中不存在通知。

  2. 在NotificationActivity的onCreate()方法中,检查您的应用程序是否正在运行,以及它是否正在运行调用startActivity()并启动您的应用程序。 如果您这样做,请务必在启动应用程序时设置标志Intent.FLAG_ACTIVITY_NEW_TASK ,以便任务的根活动不是NotificationActivity。

工作得很好,谢谢大卫! 以下类检查应用程序是否已经运行,如果没有,则在完成之前启动它(如David在选项2中所build议的那样)。

 public class NotificationActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // If this activity is the root activity of the task, the app is not running if (isTaskRoot()) { // Start the app before finishing Intent startAppIntent = new Intent(getApplicationContext(), MainActivity.class); startAppIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(startAppIntent); } finish(); } } 

有一个更简单的解决scheme,不需要额外的活动。 详情请看这个post 。 基本上,通知以与在应用程序处于后台时单击启动器图标时相同的方式启动(可能存在的)任务。

我的解决scheme,模拟启动器的行为(将任务提到前台):

 Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.setClassName(MyApplication.class.getPackage().getName(), MainActivity.class.getName()); 
 Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); 

这工作,毫无疑问,但问题是当你的意图设置为ACTION_MAIN。 那么你将无法设置任何捆绑的意图。 我的意思是,您的原始数据不会从目标活动接收,因为ACTION_MAIN不能包含任何额外的数据。

除此之外,您可以将活动设置为singleTask并正常调用您的意图,而不设置ACTION_MAIN并从目标活动的onNewIntent()方法接收意图。

但是请注意,如果你打电话,super.onNewIntent(intent); 那么该活动的第二个实例将被创build。 只是不要叫超级方法。