如果活动在后台运行,则无需通过启动器即可从小部件恢复现有活动

Posted

技术标签:

【中文标题】如果活动在后台运行,则无需通过启动器即可从小部件恢复现有活动【英文标题】:Resume existing activity from widget without going through the launcher if activity run in background 【发布时间】:2016-03-22 05:07:54 【问题描述】:

我的应用程序有一个小部件。此应用程序有两个活动:启动器和主活动。

单击此小部件时,它会打开链接的应用程序,但是现在我正在打开启动器,然后我从其启动器活动启动我的主要活动,即使它已经在后台运行。

是否可以在点击时检查主要活动是否已经在后台运行,如果是,则恢复它;还是以其他方式打开启动器?

我现在正在使用代码从小部件打开启动器。

    //LISTENER TO OPEN THE APP ON CLICK
    Intent clickIntent = new Intent(context, SplashScreen.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, clickIntent, 0);
    // Get the layout for the App Widget and attach an on-click listener to the button
    views.setOnClickPendingIntent(R.id.widgetstationlayout, pendingIntent);

【问题讨论】:

试试Resume the Top Activity instead of starting the Launcher Activity 这解决了我的问题,我之前尝试过,但它让我意识到我当时的实现是错误的。谢谢。 【参考方案1】:

要将您的应用程序以任何状态置于前台,请使用以下命令:

Intent intent = getPackageManager().
    getLaunchIntentForPackage("your.package.name");
startActivity(intent);

如果您的应用程序已经在运行,这会将现有任务以它移动到后台时的任何状态带到最前面。如果您的应用未运行,这将从头开始启动您的应用。

这就像您点击了应用程序图标一样。

【讨论】:

感谢您的回答,但是由于原始帖子的第一条评论中提供的链接,我的问题已得到解决:) 太糟糕了。对于您的问题,该答案实际上是一个糟糕的选择。 由于我对 android 上的活动和片段生命周期的行为并不是真正的专家,你能解释一下为什么吗?答案上提供的解决方案似乎是个不错的选择…… 这个答案是一个黑客。这是一种解决方法,因为如果您正确地恢复应用程序(我在这个答案中向您展示的方式),问题就不会首先出现。而且,正如其中一位 cmets 所说,假设您的应用中有 15 个活动,您需要将该代码放入 15 个活动中的每一个中。这只是糟糕的编程。

以上是关于如果活动在后台运行,则无需通过启动器即可从小部件恢复现有活动的主要内容,如果未能解决你的问题,请参考以下文章

当小部件具有配置活动时,无法从小部件启动活动

从小部件启动活动

onActivityResult 从未从小部件启动的活动中调用

如何将活动连接到小部件?

如何从小部件收听已关闭的活动? (onActivityResult只在Activity中)

android 小部件开始一个新的活动