2010-08-11 155 views

回答

67

android.app.Serviceandroid.app.Context的后裔,因此您可以直接使用startActivity。但是,由于您在任何活动之外开始此活动,因此您需要在意图上设置FLAG_ACTIVITY_NEW_TASK标志。

例如:

Intent i = new Intent(); 
i.setClass(this, MyActivity.class); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(i); 

其中this为您服务。

+1

这很好,但每次Activiyt都会像新开始的活动一样开始。这种呼叫只能工作一次。或者我想念什么!? – uzay95 2011-06-20 16:45:39

+0

@MarcinGil你知道这是故意的行为吗?换句话说,你知道谷歌工程师是否设计了服务,以便能够在没有用户交互的情况下打开一个活动,并且该过程总是流畅? – MikeIsrael 2012-05-01 06:44:24

+0

@MikeIsrael我相信是的。试想一下,在后台运行的系统服务无法在来电时显示接受/拒绝活动。既然你是这个服务的开发者,你知道你想要展示什么活动,这一切都取决于你。您可以使用从您的应用程序启动的服务来执行一些操作,例如。在某些触发器上激活应用程序;如通知栏中的更新状态,并点击启动应用程序。 – 2012-05-01 12:04:59

7

我从服务启动活动时出现问题,这是由于缺少FLAG_ACTIVITY_NEW_TASK意向标志。

+0

不知道,但我可以开始活动直接从服务没有任何标志,它工作正常 – 2017-11-20 07:18:51

7

这无疑将解决你的问题

Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_LAUNCHER); 
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
ComponentName cn = new ComponentName(this, TaxiPlexer.class); 
intent.setComponent(cn); 
startActivity(intent); 
+0

你好 我有问题当应用程序从服务(FCM) 关闭时开始活动以上代码仅在应用程序已打开时起作用。 请帮我打开应用程序从后台运行服务 – 2016-10-20 09:59:25

18

即使框架允许你从服务开始的活动,它可能不是一个妥善的解决办法。原因在于服务任务可能是也可能不是用户在服务希望与用户交互时的焦点。中断用户目前正在做的事情被认为是糟糕的设计形式,特别是在应该在后台运行的东西。

因此,您应该考虑使用带通知服务的通知,该通知服务携带PendingIntent以便在用户决定是否需要调查时启动所需的活动。把它想成延迟满足。