代码之家  ›  专栏  ›  技术社区  ›  Geordie Wicks

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

  •  1
  • Geordie Wicks  · 技术社区  · 8 年前

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

    My flow:Activity(A)设置循环报警,以在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: 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");
    

    然后通知会出现在电话上,但我一单击它,活动A就会调用其onDestroy()方法,我不知道为什么。

    这并不重要,因为我可以稍后使用savedInstance等重新创建它(即活动B在离开时通过另一个意图返回到活动A), 但我不知道为什么它会在那一刻被摧毁。正如你所看到的,我目前没有使用任何标志,但我已经尝试了很多,而且似乎没有改变行为。

    不确定这是否重要,但活动B只是用户滑过的Seekbar的集合,然后将其值保存到文本文件中,并返回到活动a

    活动A在清单中的外观:

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

    活动B的外观:

    <activity android:name="com.radicalninja.logger.EMA"
                  android:screenOrientation="portrait"/>
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Geordie Wicks    8 年前

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

    基本上,我对我的应用程序做了一些更改,并且忘记了更新通知中的TaskStackBuilder部分,因此我错误地构建了父堆栈。

    这导致每次都调用调用activities onDestroy()方法。