java - 从 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。
解决方案
将查询和 id 保存到 ExecuteExerciseActivity 的 onDestroy 中的 SharedPreferences 中,然后在旧的 ExecuteTrainingActivity 中再次提取查询和 id。onBackPressed 触发活动生命周期的 onDestroy 事件。然后在 ExecuteTrainingActivity 的 onResume 中将这些数据拉回来。
推荐阅读
- java - JAVA - 正则表达式模式不匹配。regex101.com 中的匹配项
- angular - 使用 HammerJS 的 Angular Material 工具提示错误解决方法
- java - 如何在 Apache Camel 中的流上使用拆分?
- go - golang中从空接口(动态)到静态类型的类型转换对性能的影响
- c# - 在 C# 和 Unity 中使用 input.getkeydown(KeyCode.Space) 创建游戏对象的副本时遇到问题
- kubernetes - 同一应用程序的多个服务:kubernetes 中的端口
- youtube - 视频所有者已禁用在其他网站上的播放(但不是)
- javascript - 为什么我的 Firestore/Firebase 添加文档功能在生产中工作,而不是本地机器?
- jquery - 如何在某些函数中获取数据表加载时带有逗号分隔值的列列表
- php - 如何在codeigniter中修复网站的url?