我的申请中有多项活动。其中一项活动是启动活动,这是主要的发射器活动。它启动并初始化几个类,这些类被整个应用程序使用并完成。
然后有一个主要活动,用户居住的大部分时间。如果应用程序关闭时会创建通知,那么这些类将被销毁,因此应用程序会出错(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,因为在创建通知时,应用程序正在运行。
必须有更好的方法来处理这个问题。
答案 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