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

时间:2014-05-18 12:43:30

标签: android notifications google-cloud-messaging

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

然后有一个主要活动,用户居住的大部分时间。如果应用程序关闭时会创建通知,那么这些类将被销毁,因此应用程序会出错(nullpointerexception)。

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

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

这些解决方案都不起作用。任何帮助表示赞赏。

更新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;
}

这解决了我们在多个活动中遇到的问题。但这会产生另一个问题,如果用户处于主要活动并收到通知,那么用户关闭应用程序但不点击通知。稍后当用户点击通知时,应用程序将再次给出nullpointerexception,因为在创建通知时,应用程序正在运行。

必须有更好的方法来处理这个问题。

1 个答案:

答案 0 :(得分:1)

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

所以我们还需要一个课NotificationActivity

从后端服务器收到新通知。我们会将pendingIntent发送到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);

在NotificationActivity中:

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允许您将所有通知放入单个pendingIntent中,这样就不会出现问题。

我无法提出任何其他问题..如果你可以告诉我或等到它被测试:D