【问题标题】:Activity called via PendingIntent getting destroyed automatically通过 PendingIntent 调用的 Activity 被自动销毁
【发布时间】:2015-10-02 17:05:08
【问题描述】:

我有一个 Activity,在清单中设置了以下特殊属性

<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?我可以做些什么来保持活动的运行?

【问题讨论】:

    标签: android android-activity android-pendingintent


    【解决方案1】:

    试试这个

    清单中的

    活动

    <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
    }
    

    【讨论】:

    • 感谢您的回答。我已经试过了。不工作。编辑:仍然没有
    • 代码在这里不相关。相信我,我自己不会在任何地方调用finish()
    【解决方案2】:

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

    android:noHistory :: 当用户离开时,是否应该从 Activity 堆栈中删除该 Activity 并完成(调用它的 finish() 方法)它不再出现在屏幕上

    好吧,从技术上讲,我在调用 PendingIntent 时并没有离开屏幕,奇怪的是调用了完成。删除 noHistory 后,它并没有破坏。

    【讨论】:

    • “当用户离开它时”——我敢打赌这意味着当 onPause 被调用时。所以是的,onPause 在 onNewIntent 之前自动调用,这就是我猜的原因
    【解决方案3】:

    试试这个:-

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

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

    【讨论】:

    • 我已经在问题中声明我正在正确地获取 onNewIntent。所以不是多实例问题
    • 是的,但是正如您所说,onDestroy() 正在被调用,这意味着现有实例正在被破坏并正在创建一个新实例,因此我发布了这个答案。
    • 如果您的问题没有解决,请不要在 Intent 中设置标志 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT,因为您已经在 Manifest 文件中设置了 android:excludeFromRecents="true"
    • 测试了很多变量。请参阅我的答案,了解对我有用的方法。还是谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多