首页 > 解决方案 > 从 Notification 启动 Activity 并在 BackPressed 上传递数据

问题描述

我在应用程序上有 3 个活动:

MainMenuActivity -> ExecuteTrainingActivity -> ExecuteExerciseActivity。

从 MainMenuActivity 到 ExecuteTrainingActivity,我传递了一个 idExecution 和一个 idExercise 用于 ExecuteTrainingActivity 查询并加载初始数据。

ExecuteTrainingActivity onCreate:

@Override
protected void onCreate(Bundle savedInstanceState) {
//...
    initialize();
    setupRecyclerView(exercises);
}

private void initialize() {
    Bundle extras = getIntent().getExtras();

    if (extras != null) {
        if (extras.containsKey("id_execution")) {
            idExecution = extras.getLong("id_execution");
            idExercise = extras.getLong("id_exercise");

            execution = queryExecution(idExecution);
        } else {
            insertExecution();
        }
    }
}

在第三个活动 ExecuteExerciseActivity 中,我有一个 TimerFragment,当 TimerCountdown 达到 0 时,它会打开一个通知弹出窗口,单击它会打开一个新的 ExecuteExerciseActivity。

在这个 TimerFragment 上,我将相同的 ID 作为 Extras 传递,所以我可以在新的 ExecuteExerciseActivity 中获取它们:

public class TimerFragment extends Fragment {

//...
private void showNotification(){
    Intent intent = new Intent(getActivity(), ExecuteExerciseActivity.class);
    intent.putExtra("id_execution", idExecution);
    intent.putExtra("id_exercise", idExercise);
    intent.putExtra("position", position);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(getActivity());
    stackBuilder.addNextIntentWithParentStack(intent);

    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

    /*=== CHECK IF NOTIFICATION CHANNEL IS ACTIVE ===*/
    boolean ok = isNotificationChannelEnabled(getActivity(), Constants.CHANNEL_ID);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(requireNonNull(getActivity()), Constants.CHANNEL_ID)
            .setSmallIcon(R.drawable.d77)
            .setContentTitle("Teste Notificação")
            .setContentText("Ababa")
            .setPriority(NotificationCompat.PRIORITY_HIGH)

            .setContentIntent(pendingIntent)
            .setAutoCancel(true);

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(getActivity());

    notificationManager.notify(0, mBuilder.build());
}

从这个新的新 ExecuteExerciseActivity,我想让系统保持相同的活动导航流程,但是当我从新的 ExecuteExerciseActivity 回压到 ExecuteTrainingActivity 时,我无法传递 ExecuteTrainingActivity 查询和加载的 ID。

有没有办法在BackPress上传递参数?最好的方法是覆盖 onBackPress 创建一个新的意图并开始一个新的 Activity 吗?

**我的清单正确使用了 parentActivityName。

标签: javaandroid

解决方案


将查询和 id 保存到 ExecuteExerciseActivity 的 onDestroy 中的 SharedPreferences 中,然后在旧的 ExecuteTrainingActivity 中再次提取查询和 id。onBackPressed 触发活动生命周期的 onDestroy 事件。然后在 ExecuteTrainingActivity 的 onResume 中将这些数据拉回来。


推荐阅读