如何在任何时间以任何方式显示对话框 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 库。

终于,我找到了解决办法。我使用 AlarmManagerBroadcastReceiver,我删除了递归方法 checkUpdate 并设置了一个警报每小时重复一次,并执行操作 getConfigFromFirebase(this):

  1. 创建带有警报动作的广播接收器:

    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();
        }
    }
    
  2. 在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);
        }
    }
    
  3. 最后,实现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);
            }
        }
    

必要时使用创建和取消警报方法。