当前位置: 首页 > 知识库问答 >
问题:

通知启动应用程序或将活动带到前台

沈子实
2023-03-14

我在我们的应用程序中有多个活动。其中一个活动是启动活动,这是主要的启动器活动。它启动并初始化几个类,这些类被整个应用程序使用并完成。

然后是用户大部分时间驻留的主要活动。如果应用程序关闭,则在创建通知时,这些类将被销毁,因此应用程序将给出错误(nullpointerexception)。

我们需要做的是如果应用程序关闭,则启动启动器活动,否则将主要活动放在前面。

我在这里尝试了多种解决方案。

  • 解决方案1
  • 解决方案2
  • 解决方案3

这些解决方案都不起作用。任何帮助都是值得感谢的。

更新1:

我想,如果我们通过检查应用程序是否正在运行来选择挂起的意图应该是什么呢。

public boolean isApplicationRunning(Context context) {
    ActivityManager activityManager = (ActivityManager) context
            .getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

    for (RunningTaskInfo task : tasks) {
        if (context.getPackageName().equalsIgnoreCase(task.baseActivity.getPackageName()))
            return true;
    }

    return false;
}

这修复了我们在多个活动中遇到的问题。但这给出了另一个问题,如果用户在主活动中并且收到通知,那么用户关闭应用程序但没有单击通知怎么办。稍后,当用户单击通知应用程序时,将再次给出nullpointerest xcept,因为在创建通知时应用程序正在运行。

一定有更好的方法来处理这个问题。

共有1个答案

陆涵畅
2023-03-14

没有人能回答我的问题。所以,我被迫使用一个有点脏的解决方案。

所以我们还需要一个类NotificationActivity

当从后端服务器收到新通知时。我们将发送悬而未决的通知活动。

NotificationCompt.Builder = bla bla bla.
Intent intent = new Intent(context, NotificationActivity.class);
intent.setFlags(FLAG_ACTIVITY_CREATE_NEW_TASK);

PendingIntent pIntent = PendingIntent.startIntent(0, intent, 0, someflags);

在通知活动中:

public class NotificationActivity extends Activity {

     @Override
     protected void onCreate(Bundle savedInstances) {
         Intent intent = null;

         try {
             // Call any method from class which is need by Main activity
             someclass.somemethod();

             // If we are here then it means app is running.
             intent = new Intent(context, MainActivity.class);

             // Flag it to bring it to front
             intent.setFlags(FLAG_ACTIVITY_BRING_TO_FRONT);
         } catch (NullPointerException e ) {

             // If we are here then it means that app is closed and 
             // someclass is garbage collected.
             intent = new Intent(context, StartAppActivity.class);

             // Flag it to create new task
             intent.setFlags(FLAG_ACTIVITY_CREATE_NEW_TASK);
         }

         // Start intent, and finish this activity
         startActivity(intent);
         finish();
     }
}

这解决了我上面提到的所有问题。不知道它是否会产生新问题。如果您使用此方法,请使用成本低的方法。此活动将在您完成后立即被垃圾收集。好吧!我撒谎,在最近的将来。

如果你有多个通知说谎,这可能会产生问题,但android允许你将所有通知放在一个挂起的帐篷中,这样问题就永远不会出现。

如果你能告诉我或者等到它被测试: D

 类似资料:
  • 我想创建一个通知,当它点击时,会将我的应用程序带到前台,但不会更改(重新加载或导航出)显示的最后一个活动。 我试过: 但在新的Android4.3中,应用程序被推到了前台,但它也启动了一个新的实例,我不想要这个。 我希望我的应用程序将从上次显示的活动继续。 如何做到这一点?

  • 我是appium的新手,目前正在尝试创建一些简单的测试。我的问题是我根本无法启动正在测试的应用程序,它唯一有效的时间是使用appium-dotnet-驱动程序解决方案中包含的演示应用程序通过github提供 https://github.com/appium/appium-dotnet-driver 我已经在我的Nexus 5和几个模拟器上尝试了2个不同的应用程序,但没有任何效果(请参阅下面的附加

  • 我正在使用此代码,无法在我的移动设备上启动应用程序 TLDR: 原始错误:活动名称'。用于启动应用程序的SplashActivity不存在或无法启动!确保它存在并且是可启动的活动 下面是我的错误日志 log4j:WARN找不到记录器(org.apache.http.client.protocol.RequestAddCookies)的追加器。log4j:警告请正确初始化log4j系统。log4j:

  • 我正在我的应用程序中实施谷歌云消息服务(GCM)。我使用gcmIntent服务创建了一个挂起的意图并打开了一个不是启动活动的活动。当应用程序打开时,它工作正常。但当应用程序关闭时,它会打开启动活动而不是所需的活动。我尝试了我能找到的所有解决方案,但都不起作用。我挣扎了一个多星期。任何帮助都将不胜感激。 我的代码 我得到下面的堆栈跟踪

  • 我想在用户收到应用程序上的通知时自动启动应用程序。启动程序图标上不会有点击操作。

  • 我想知道是否有办法知道一个应用程序(可以在后台关闭或打开)是否已经启动,只需单击: 通知(在通知中心)? 还是跳板上的应用程序图标? 谢谢