如何在任何时间以任何方式显示对话框 activity
How to show a dialog at any time, in any activity
我想经常检查我的应用程序是否有新版本,如果有,向用户显示一条消息。我使用 Firebase,将远程配置的版本与应用程序的当前版本进行连接和比较。这不是问题,我的问题是如何在任何时间、任何 activity 中显示对话框。
我有一个 BaseActivity,其中我有连接 firebase 并在它回答时显示消息的方法。此外,我有一个每小时执行此更新检查的方法:
private void checkUpdate() {
handlerCheckUpdate.postDelayed(() -> {
getConfigFromFirebase(this);
checkUpdate();
}, 3600000);
}
最后我有 Activity1 和 Activity2 扩展了 BaseActivity。在我的 Activity1 中,我启动递归 checkUpdate 方法。
问题是,如果用户当前在 Activity2 中,当消息显示时,它是在 Activity1 中执行的,而不是在 Activity2 中执行的。
执行此操作的最佳解决方案是什么?
非常感谢!
您需要在您的应用程序中创建一个对话框 class 并将上下文传递给它。
class App : Application() {
fun showAlert(context: Context) {
val builder = AlertDialog.Builder(context)
builder.setTitle(getString(R.string.your_title))
builder.setMessage(getString(R.string.your_message))
builder.setPositiveButton("OK") { dialog, _ ->
dialog.dismiss()
}
val dialog: AlertDialog = builder.create()
dialog.setCancelable(false) // make it true if you want to cancel
dialog.setCanceledOnTouchOutside(false)
dialog.show()
}
}
并且您需要在应用程序标签下的清单文件中添加这一行
<application
android:name=".App"
android:allowBackup="false"
......>
通过传递上下文从您的任何 activity 调用该函数:
App().showAlert(YourActivity.this)
您可以使用 Android LiveData check it here
这个想法是——你在你的每个活动(或基地Activity)中添加一个观察者。在观察者中,您可以添加用于启动对话框的逻辑。当您准备好在后台进行更新检查时,您会通知 LiveData。当前处于恢复状态的 Activity 将处理更新并显示对话框。
class BaseActivity : AppCompatActivity() {
...
fun onCreate() {
//provide your liveData from app object
application.getVersionUpdateLiveData().(this, Observer {
//start your dialog here
})
}
}
确保您使用最新的 androidx 库。
终于,我找到了解决办法。我使用 AlarmManager 和 BroadcastReceiver,我删除了递归方法 checkUpdate 并设置了一个警报每小时重复一次,并执行操作 getConfigFromFirebase(this):
创建带有警报动作的广播接收器:
public class CheckUpdateAppAlarmReceiver extends BroadcastReceiver {
public static CheckUpdateReceiverListener checkUpdateReceiverListener;
public static Boolean dialogShown = false;
@Override
public void onReceive(Context context, Intent intent) {
//Alarm!!
if (checkUpdateReceiverListener != null) {
checkUpdateReceiverListener.onCheckUpdateListenerChanged();
}
}
public interface CheckUpdateReceiverListener {
void onCheckUpdateListenerChanged();
}
}
在BaseActivity中,添加创建和取消闹钟方法:
public void createAlarmCheckUpdate() {
try {
long firstAlarmTime = new Date().getTime();
Intent intentAlarmCheckUpdate = new Intent(this, CheckUpdateAppAlarmReceiver.class);
AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 2000,
intentAlarmCheckUpdate,
PendingIntent.FLAG_UPDATE_CURRENT);
alarmMgr.setInexactRepeating(AlarmManager.RTC, firstAlarmTime,
AlarmManager.INTERVAL_HOUR, alarmIntent);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void cancelAlarmCheckUpdate(Context context) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, CheckUpdateAppAlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 2000, intent, PendingIntent.FLAG_NO_CREATE);
if (pendingIntent != null) {
alarmManager.cancel(pendingIntent);
}
}
最后,实现BaseActivity中的broadcastReceiver,并覆盖其方法
public class BaseActivity extends AppCompatActivity implements CheckUpdateAppAlarmReceiver.CheckUpdateReceiverListener {
...
@Override
protected void onResume() {
super.onResume();
CheckUpdateAppAlarmReceiver.checkUpdateReceiverListener = this;
}
...
@Override
public void onCheckUpdateListenerChanged() {
if (this instanceof Activity1 || this instanceof Activity2) {
getConfigFromFirebase(this);
}
}
必要时使用创建和取消警报方法。
我想经常检查我的应用程序是否有新版本,如果有,向用户显示一条消息。我使用 Firebase,将远程配置的版本与应用程序的当前版本进行连接和比较。这不是问题,我的问题是如何在任何时间、任何 activity 中显示对话框。
我有一个 BaseActivity,其中我有连接 firebase 并在它回答时显示消息的方法。此外,我有一个每小时执行此更新检查的方法:
private void checkUpdate() {
handlerCheckUpdate.postDelayed(() -> {
getConfigFromFirebase(this);
checkUpdate();
}, 3600000);
}
最后我有 Activity1 和 Activity2 扩展了 BaseActivity。在我的 Activity1 中,我启动递归 checkUpdate 方法。
问题是,如果用户当前在 Activity2 中,当消息显示时,它是在 Activity1 中执行的,而不是在 Activity2 中执行的。 执行此操作的最佳解决方案是什么?
非常感谢!
您需要在您的应用程序中创建一个对话框 class 并将上下文传递给它。
class App : Application() {
fun showAlert(context: Context) {
val builder = AlertDialog.Builder(context)
builder.setTitle(getString(R.string.your_title))
builder.setMessage(getString(R.string.your_message))
builder.setPositiveButton("OK") { dialog, _ ->
dialog.dismiss()
}
val dialog: AlertDialog = builder.create()
dialog.setCancelable(false) // make it true if you want to cancel
dialog.setCanceledOnTouchOutside(false)
dialog.show()
}
}
并且您需要在应用程序标签下的清单文件中添加这一行
<application
android:name=".App"
android:allowBackup="false"
......>
通过传递上下文从您的任何 activity 调用该函数:
App().showAlert(YourActivity.this)
您可以使用 Android LiveData check it here 这个想法是——你在你的每个活动(或基地Activity)中添加一个观察者。在观察者中,您可以添加用于启动对话框的逻辑。当您准备好在后台进行更新检查时,您会通知 LiveData。当前处于恢复状态的 Activity 将处理更新并显示对话框。
class BaseActivity : AppCompatActivity() {
...
fun onCreate() {
//provide your liveData from app object
application.getVersionUpdateLiveData().(this, Observer {
//start your dialog here
})
}
}
确保您使用最新的 androidx 库。
终于,我找到了解决办法。我使用 AlarmManager 和 BroadcastReceiver,我删除了递归方法 checkUpdate 并设置了一个警报每小时重复一次,并执行操作 getConfigFromFirebase(this):
创建带有警报动作的广播接收器:
public class CheckUpdateAppAlarmReceiver extends BroadcastReceiver { public static CheckUpdateReceiverListener checkUpdateReceiverListener; public static Boolean dialogShown = false; @Override public void onReceive(Context context, Intent intent) { //Alarm!! if (checkUpdateReceiverListener != null) { checkUpdateReceiverListener.onCheckUpdateListenerChanged(); } } public interface CheckUpdateReceiverListener { void onCheckUpdateListenerChanged(); } }
在BaseActivity中,添加创建和取消闹钟方法:
public void createAlarmCheckUpdate() { try { long firstAlarmTime = new Date().getTime(); Intent intentAlarmCheckUpdate = new Intent(this, CheckUpdateAppAlarmReceiver.class); AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 2000, intentAlarmCheckUpdate, PendingIntent.FLAG_UPDATE_CURRENT); alarmMgr.setInexactRepeating(AlarmManager.RTC, firstAlarmTime, AlarmManager.INTERVAL_HOUR, alarmIntent); } catch (Exception e) { e.printStackTrace(); } } public static void cancelAlarmCheckUpdate(Context context) { AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(context, CheckUpdateAppAlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 2000, intent, PendingIntent.FLAG_NO_CREATE); if (pendingIntent != null) { alarmManager.cancel(pendingIntent); } }
最后,实现BaseActivity中的broadcastReceiver,并覆盖其方法
public class BaseActivity extends AppCompatActivity implements CheckUpdateAppAlarmReceiver.CheckUpdateReceiverListener { ... @Override protected void onResume() { super.onResume(); CheckUpdateAppAlarmReceiver.checkUpdateReceiverListener = this; } ... @Override public void onCheckUpdateListenerChanged() { if (this instanceof Activity1 || this instanceof Activity2) { getConfigFromFirebase(this); } }
必要时使用创建和取消警报方法。