startActivity(Intent) 每次都在破坏 activity,为什么?
startActivity(Intent) is destroying activity every time, why?
正如标题所说,通常只有在 phone 需要释放内存时才会调用 onDestroy()。
我的流程:Activity(A)在A的onCreate方法中设置了一个周期性的Alarm向用户发送通知:
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;
}
报警接收者得到这个,发送一个通知,如果通知被选中,它开始activity B:
EMAAlarmReceiver:
OnReceive{
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");
然后通知出现在 phone 上,但是当我点击它时,Activity A 调用了它的 onDestroy() 方法,我不知道为什么。
这并不重要,因为我可以使用 savedInstance 等稍后重新创建它(即离开时通过另一个 Intent Activity B returns 到 Activity A),
但我不确定为什么它会在那个时候被摧毁。如您所见,我目前没有使用任何标志,但我已经尝试了很多标志,而且它似乎并没有改变行为。
不确定这是否重要,但是 Activity B 只是用户滑过的一个 collection SeekBars,然后将它们的值保存到一个文本文件中,returns 到Activity一个
Activity A 在清单中的样子:
<activity
android:name="com.anysoftkeyboard.ui.settings.setup.FinishInstallScreen"
android:screenOrientation="portrait">
activity B 看起来如何:
<activity android:name="com.radicalninja.logger.EMA"
android:screenOrientation="portrait"/>
好吧,对于任何可能随机遇到这个问题的人来说,这是我自己的愚蠢造成的。
基本上我对我的应用程序做了一些更改,并且忘记更新通知的 TaskStackBuilder 部分,所以我错误地构建了 Parent Stack。
这导致调用活动 onDestroy() 方法每次都被调用。
正如标题所说,通常只有在 phone 需要释放内存时才会调用 onDestroy()。
我的流程:Activity(A)在A的onCreate方法中设置了一个周期性的Alarm向用户发送通知:
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;
}
报警接收者得到这个,发送一个通知,如果通知被选中,它开始activity B:
EMAAlarmReceiver: OnReceive{
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");
然后通知出现在 phone 上,但是当我点击它时,Activity A 调用了它的 onDestroy() 方法,我不知道为什么。
这并不重要,因为我可以使用 savedInstance 等稍后重新创建它(即离开时通过另一个 Intent Activity B returns 到 Activity A), 但我不确定为什么它会在那个时候被摧毁。如您所见,我目前没有使用任何标志,但我已经尝试了很多标志,而且它似乎并没有改变行为。
不确定这是否重要,但是 Activity B 只是用户滑过的一个 collection SeekBars,然后将它们的值保存到一个文本文件中,returns 到Activity一个
Activity A 在清单中的样子:
<activity
android:name="com.anysoftkeyboard.ui.settings.setup.FinishInstallScreen"
android:screenOrientation="portrait">
activity B 看起来如何:
<activity android:name="com.radicalninja.logger.EMA"
android:screenOrientation="portrait"/>
好吧,对于任何可能随机遇到这个问题的人来说,这是我自己的愚蠢造成的。
基本上我对我的应用程序做了一些更改,并且忘记更新通知的 TaskStackBuilder 部分,所以我错误地构建了 Parent Stack。
这导致调用活动 onDestroy() 方法每次都被调用。