在 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的上下文?

255093 次浏览

从服务类的内部:

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

但是,这不工作,从 Android 10 + 由于电池优化的限制

另一件值得一提的事情是: 当我们的任务在后台时,上面的答案可以正常工作,但是如果我们的任务(由服务 + 一些活动组成)在前台(即我们的一个活动对用户可见) ,我可以使它工作的唯一方法是这样的:

    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,因为它没有再次实例化活动。祝你好运!

我也遇到过同样的问题,我想让你知道,以上这些都不适合我。 对我起作用的是:

 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

如果您需要从您的服务中召回一个在后台的活动,我建议以下链接。FLAG _ ACTIVITY _ NEW _ TASK 不是解决方案。

Https://stackoverflow.com/a/8759867/1127429

换句话说,

您可以使用自己的 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();

不能使用 ServiceContext; 能够得到类似的(包) Context:

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

更新安卓10或更高版本

不再允许从服务(前台或后台)启动活动。

在文档中仍然可以看到一些限制

Https://developer.android.com/guide/components/activities/background-starts

你也可以在你的 服务中使用 < strong > getApplicationContext () 方法来运行 StartActivity () 方法,如下所示:

Intent myIntent = new Intent();
myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplicationContext().startActivity(myIntent);
需要清单中的权限,并从移动设置手动启用来自 android 10 + 的工作。

小米红米4A,Android 7,MIUI 10.2.3。debug版本的应用程序的主要活动无法从服务开始进入前台。logcat中有 MIUILOG- Permission Denied Activity错误。在 release版本中重建这个应用程序修复了这个问题。