通过PendingIntent调用的活动会自动销毁

时间:2015-10-02 17:05:08

标签: android android-activity android-pendingintent

我有活动,并在清单

中设置了以下特殊属性
<activity
        android:name=".LightUp"
        android:excludeFromRecents="true"
        android:launchMode="singleInstance"
        android:noHistory="true"
        android:process=":listener"
        android:taskAffinity="" >
    </activity>

在此活动中,我正在安排 AlarmManager 使用此 PendingIntent 在一段时间后自行调用。 AlarmManager 是必要的,因为当此活动在屏幕上时手机会进入睡眠状态,我不想拿着唤醒锁。

pendingIntent = PendingIntent.getActivity(this, 10,
                new Intent(this, LightUp.class)
                .setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT),
                PendingIntent.FLAG_UPDATE_CURRENT);

因此,当警报管理器触发时,我像往常一样在 onNewIntent()函数中获取新的Intent。这意味着意图正在进行相同的活动。 问题是在 onNewIntent 之后活动被破坏了。即使我在 onNewIntent 中完全没有代码,我也可以从日志中看到无论如何都会调用 onDestroy

所以问题是为什么Destroy被召唤?我该怎么做才能让活动继续运行?

3 个答案:

答案 0 :(得分:0)

试试这个

清单

中的

活动

<activity
  android:name=".LightUp"
  android:launchMode="singleTop"
</activity>

Java代码

Intent notificationintent = new Intent(context, LightUp.class);
notificationintent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pIntent = PendingIntent.getActivity(context, (int) System.currentTimeMillis(), notificationintent, PendingIntent.FLAG_UPDATE_CURRENT);

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  System.out.println("new intent received");
  // do what ever you want to do here
}

答案 1 :(得分:0)

试试这个: -

<activity
    android:launchMode="singleTask" >
</activity>

默认情况下,如果您使用intent调用活动,则即使另一个实例已在运行,也会创建并显示该活动的新实例。为避免这种情况,必须标记活动,不应多次实例化。要实现此目的,您必须将活动的launchMode设置为singleTask

答案 2 :(得分:0)

看起来我找到了罪魁祸首。这是导致问题的 noHistory 属性。 官方文件说

android:noHistory ::当用户是否应该从活动堆栈中删除活动并完成(其finish()方法被调用)导航远离它,它在屏幕上不再可见

嗯,从技术上讲,我在调用PendingIntent时没有离开屏幕,很奇怪,正在调用终点。删除 noHistory 后,它不会破坏。