android从服务开始活动


150

Android:

public class LocationService extends Service {

@Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        startActivity(new Intent(this, activity.class));
    }
}

我从 Activity

Activity如果条件满足启动

startService(new Intent(WozzonActivity.this, LocationService.class));

从我LocationService上面提到的无法启动Activity,如何获取当前正在Activity服务类中运行的上下文?

Answers:


343

从Service类内部:

Intent dialogIntent = new Intent(this, MyActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);

17
仅需要FLAG_ACTIVITY_NEW_TASK,因为只有活动可以在没有活动的情况下开始活动。因为服务具有自己的上下文,所以可以使用'this'代替getBaseContext和getApplication。
Sojurn 2013年

1
如何以编程方式从最近的屏幕列表中删除该活动?
Prashanth Debbadwar

2
如果服务在后台运行,则无法使用。有什么解决办法吗?
里克·罗伊德·阿班

4
请从后台服务打开的应用程序帮助我,我已经使用Firebase(FCM)服务。我想从“我的应用程序”中打开“我的呼叫UI”屏幕,请为此提供帮助
Dipanki Jadav

2
当应用程序在后台运行时,我已经在服务中编写了您的代码,我发现该服务可在小米mi a2上运行,但不能在小米redmi note 7上运行。
Amjad Omari

18

我遇到了同样的问题,并想让您知道以上内容都不适合我。对我有用的是:

 Intent dialogIntent = new Intent(this, myActivity.class);
 dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 this.startActivity(dialogIntent);

在一个子类中,我必须将其存储在一个单独的文件中:

public static Service myService;

myService = this;

new SubService(myService);

Intent dialogIntent = new Intent(myService, myActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
myService.startActivity(dialogIntent);

所有其他答案给了我一个答案nullpointerexception


5
您将服务存储在静态字段中,这可能会导致内存泄漏
Murmel

1
startActivity与this.startActivity相同!您从服务创建与正常startActivity相等的无用实例,为什么?
阿米尔·侯赛因·加塞米

8

值得一提的另一件事是:当我们的任务在后台时,上面的答案就可以了,但如果我们的任务(由服务+一些活动组成)在前台(即我们的一项活动可见),则我可以使之起作用的唯一方法给用户)是这样的:

    Intent intent = new Intent(storedActivity, MyActivity.class);
    intent.setAction(Intent.ACTION_VIEW);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    storedActivity.startActivity(intent);

我不知道ACTION_VIEW或FLAG_ACTIVITY_NEW_TASK在这里是否有实际用途。成功的关键是

storedActivity.startActivity(intent);

当然还有FLAG_ACTIVITY_REORDER_TO_FRONT,用于不再次实例化活动。祝你好运!


1
这是行不通的。这一切给了我一个错误“从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是您想要的吗?”
塞林2012年

2
这是因为第二次调用setFlags会覆盖第一个。此解决方案应使用addFlags或单个调用来设置传递Intent.FLAG_ACTIVITY_NEW_TASK && Intent.FLAG_ACTIVITY_REORDER_TO_FRONT的标志。
Fergusmac

8
您不想将标志与&&;组合在一起 您想使用| (按位表示的单个小节或)
乔恩·瓦特

Intent intent = new Intent(storedActivity,MyActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); storedActivity.startActivity(intent);
Prakhar1001年

1

一个不能使用ContextService; 能够得到(包装)Context一样:

Intent intent = new Intent(getApplicationContext(), SomeActivity.class);

我认为这仅适用于FLAG_ACTIVITY_NEW_TASK国旗
Cerlin,

0

交替,

您可以使用自己的Application类,并在需要的地方(尤其是非活动性)进行调用。

public class App extends Application {

    protected static Context context = null;

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

    public static Context getContext() {
        return context;
    }

}

并注册您的应用程序类:

<application android:name="yourpackage.App" ...

然后致电:

App.getContext();

2
请注意使用上下文的静态实例,它可能会导致
多次记忆

1
@crgarridos不。这是Application上下文,其本质是Singleton,不会导致内存泄漏
GV_FiQst

1
我将线更改context = getApplicationContext();context = this;
GV_FiQst '18

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.