startActivity(Intent) 每次都在破坏活动,为啥?

Posted

技术标签:

【中文标题】startActivity(Intent) 每次都在破坏活动,为啥?【英文标题】:startActivity(Intent) is destroying activity every time, why?startActivity(Intent) 每次都在破坏活动,为什么? 【发布时间】:2018-09-15 16:06:18 【问题描述】:

正如标题所说,通常只有在手机需要释放内存时才会调用 onDestroy()。

我的流程:Activity(A) 设置了一个周期性的Alarm,在A的onCreate方法中向用户发送通知:

public void startEMAAlarm()
    Log.d(TAG, "startEMAAlarm: in start ema alarm");

    Calendar cal = Calendar.getInstance();
    long when = cal.getTimeInMillis();

    cal.setTimeInMillis(System.currentTimeMillis());
    cal.set(Calendar.HOUR_OF_DAY, 8);
    cal.set(Calendar.MINUTE, 30);

    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, EMAAlarmReceiver.class);
    startEMAIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1000 * 60 * 20, startEMAIntent);
    Log.d(TAG, "startEMAAlarm: alarm shjould be set");
    alarmStarted = true;



警报接收器得到这个,发送一个通知,如果通知被选中,它启动活动 B:

EMAAlarmReceiver: 接收

Intent resultIntent = new Intent(context, EMA.class);
        //resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, resultIntent, 0);

        NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.cdmh_small, "SNOOZE", snoozePendingIntent).build();

        Notification mBuilder =
                new NotificationCompat.Builder(context, CHANNEL_DI)
                        .setSmallIcon(R.drawable.noti_icon)
                        .setContentTitle("EMA")
                        .setAutoCancel(true)
                        .setContentText("Time for another EMA :)")
                        .setOngoing(true)
                        .setChannelId(CHANNEL_DI)
                        .setSound(uri)
                        .setContentIntent(pendingIntent)
                        .addAction(action)
                        .build();

        mNotificationManager.notify("first",1, mBuilder);
        Log.d(TAG, "onReceive OREO: should be notification built now");

然后通知会出现在手机上,但只要我点击它,Activity A 就会调用它的 onDestroy() 方法,我不知道为什么。

这并不重要,因为我可以使用 savedInstance 等稍后重新创建它(即 Activity B 在离开时通过另一个 Intent 返回到 Activity A), 但我不确定为什么它会在那时被摧毁。如您所见,我目前没有使用任何标志,但我已经尝试了很多标志,但似乎并没有改变行为。

不确定是否重要,但活动 B 只是用户滑过的 SeekBar 的集合,然后将它们的值保存到文本文件中,然后返回到活动 A

活动 A 在 Manifest 中的外观:

<activity
        android:name="com.anysoftkeyboard.ui.settings.setup.FinishInstallScreen"
        android:screenOrientation="portrait">

活动 B 的外观:

<activity android:name="com.radicalninja.logger.EMA"
              android:screenOrientation="portrait"/>

【问题讨论】:

“正如标题所说,通常只有在手机需要释放内存时才会调用 onDestroy()”——除此之外,如果活动完成(例如,用户按下BACK)和默认情况下配置更改。 “只要我点击它,Activity A 就会调用它的 onDestroy() 方法”——也许您在开发人员选项中启用了“不保留活动”设置。或者,也许您在清单中有一个 B 的 launchMode,它正在影响您的任务。 甚至不知道 Dev Option 存在,所以感谢 @CommonsWare 帮助我学习新东西。然而它没有被启用。我已经添加了相关的清单代码。注意我也尝试过 android:launchMode="singleTask",但并没有什么不同。感谢您的帮助。 【参考方案1】:

好吧,对于其他可能随机遇到这个问题的人来说,这是我自己的愚蠢造成的。

基本上我已经对我的应用程序进行了一些更改,并且忘记更新通知的 TaskStackBuilder 部分,所以我错误地构建了父堆栈。

这导致调用活动的 onDestroy() 方法每次都被调用。

【讨论】:

以上是关于startActivity(Intent) 每次都在破坏活动,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Android 系统源码初步阅读之 activity 的 startActivity(intent) 与 非 activity 的 startActivity(...) 的不同

Android 系统源码初步阅读之 activity 的 startActivity(intent) 与 非 activity 的 startActivity(...) 的不同

为啥 context.startActivity(intent) 没有启动活动以及如何在 android 中处理异常?

Android-----Intent中通过startActivity(Intent intent )隐式启动新的Activity

活动在 startActivity(intent) 后没有启动

类型活动中的方法 startactivity(intent,bundle) 不适用于参数 (int,intent)