如何在后台启动活动并立即关闭它?
Posted
技术标签:
【中文标题】如何在后台启动活动并立即关闭它?【英文标题】:How do I start an activity in the background and close it immediately? 【发布时间】:2021-11-24 07:26:23 【问题描述】:所以我有一个SettingsActivity
,当用户单击MainActivity
中的设置按钮时,它将启动我的SettingsFragment
。对于我的SettingsFragment
,当用户第一次启动屏幕时,它会激活我设置的AlarmManager
。这在用户首次登录时默认为开启。用户确实可以选择关闭通知。
现在,如果用户从不进入设置屏幕,它将永远不会激活AlarmManager
。如何在后台启动SettingsActivity
,它实际上并没有显示SettingsActivity
或SettingsFragment
的用户界面,然后立即关闭SettingsActivity
/SettingsFragment
,这样它就不会永远在后台运行?我只想在用户第一次登录或再次登录时启动它,以便应用程序知道AlarmManager
的状态是打开还是关闭。如果它不知道状态,用户将永远不会收到任何通知,直到用户手动点击设置按钮。
【问题讨论】:
Appstart 为什么不启动AlarmManager? @JohnDoeAlarmManager
的所有代码都在SettingsFragment
中。
@TomDarious 那么为什么你只从 MainActivity 或第一个入口点调用代码
@HussienFahmy 第一个入口点不是SettingsFragment
。它是SplashActivity
,这将决定是转到MainActivity
还是LoginActivity
。我如何能够从与SettingsFragment
无关的单独活动中调用代码?
您说要在用户第一次登录时设置报警管理器,所以将报警管理器的逻辑移到LoginActivity中登录后执行
【参考方案1】:
首先,了解活动生命周期:https://developer.android.com/guide/components/activities/activity-lifecycle
您可以通过调用finish() 随时完成您的活动(例如onResume())。您还可以使用 Timer、Handler 或 Alarm 在不同的时间完成()它。
为了使您的活动透明/不可见,请勿使用任何类型的布局对其进行膨胀。我还建议在您的活动清单中添加以下几行:
android:launchMode="singleInstance"
android:excludeFromRecents="true"
关于在没有任何用户交互的情况下启动此活动的能力...您可能希望从那里使用 Service 和 startActivity() (并可能还完成()它)。
也就是说,根据您的描述,我认为您正在以一种非常复杂的方式进行设计,并且可能会让自己陷入困境。
【讨论】:
【参考方案2】:你应该让你的 SettingActivity 成为你的 SettingActivity。
当你不使用 SQLITE 或其他东西来存储设置时:https://developer.android.com/training/data-storage/shared-preferences
将所有代码放入 SettingFragment 不应该是您的解决方案。你可以这样做:
return this.sharedPreferences.getBoolean(context.getResources().getString(R.string.preference_stateAlarmmanager), false); // returns false if the preference not yet exists
只需阅读您的属性并执行您的代码以启动警报管理器,以防万一
【讨论】:
以上是关于如何在后台启动活动并立即关闭它?的主要内容,如果未能解决你的问题,请参考以下文章
Android:如何在按下按钮时关闭一个活动并在按下另一个按钮时关闭整个后台堆栈? [复制]