Показывать DialogFragment даже при изменении контекста

У меня есть приложение, в котором сообщение отправляется и его отчет получен через некоторое BroadcastReceiverвремя . Этот отчет должен быть показан пользователю через диалоговое окно, для которого я используюDialogFragment, как показано ниже.

myReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if(firstTime)
            firstTime = false; 

        boolean anyError = false;
        switch (getResultCode()) {
            case Activity.RESULT_OK:
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
            case SmsManager.RESULT_ERROR_NO_SERVICE:
            case SmsManager.RESULT_ERROR_NULL_PDU:
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                anyError = true;
                break;
        }

        sent.add(anyError);
        CustomAlertDialogFragment customAlertDialogFragment = CustomAlertDialogFragment.newInstance("Title",logMessage);
        customAlertDialogFragment.show(getActivity().getSupportFragmentManager(),"TAG");
        sent.clear();
    }
};

Код для CustomDialogниже.

public class CustomAlertDialogFragment extends DialogFragment {

    public static CustomAlertDialogFragment newInstance(String title, String content) {
        CustomAlertDialogFragment customAlertDialogFragment = new CustomAlertDialogFragment();
        Bundle args = new Bundle();
        args.putString("title",title);
        args.putString("content", content);
        customAlertDialogFragment.setArguments(args);
        return customAlertDialogFragment;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        String title = getArguments().getString("title");
        String content = getArguments().getString("content");
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        // title bar string
        builder.setTitle(title);
        builder.setPositiveButton(R.string.ok, null);

        builder.setMessage(content);
        AlertDialog errorDialog = builder.create();
        // return the Dialog object
        return errorDialog;
    }
}

Если пользователь переходит к любому другому Fragmentили Activityтем временем, диалоговое окно не отображается. Он должен броситьNullPointerException, если его не получает контекст, но его нет. Какой может быть возможная альтернатива или решение для этого. Я сослался на другие вопросы SO, где участники попросили использовать уведомление вместо этого, но мое требование-диалог. Пожалуйста помочь.

1 ответ

  1. DialogueБросает исключение с именем window leakedI guess. В вашем случае, я думаю, вы можете подумать об использовании Applicationкласса.

    В любом случае, вы можете зарегистрировать BroadcastReceiverв своем Applicationклассе для вашего случая, который будет получать трансляцию и покажет диалог по требованию.

    Для повторного запуска Contextвы можете использовать getApplicationContext().

    public class MyApplication extends Application {
    
        // Declare the BroadcastReceiver in your Application class
        BroadcastReceiver myReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if(firstTime)
                    firstTime = false; 
    
                boolean anyError = false;
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        anyError = true;
                        break;
                }
    
                sent.add(anyError);
                CustomAlertDialogFragment customAlertDialogFragment = CustomAlertDialogFragment.newInstance("Title",logMessage);
                customAlertDialogFragment.show(getApplicationContext().getSupportFragmentManager(), "TAG");
                sent.clear();
            }
        };
    
        @Override
        public void onResume() {
            super.onCreate();
            // Register the receiver here 
        }
    
        @Override
        public void onPause() {
            super.onCreate();
            // Un-register the receiver here 
        }
    }
    

    Чтобы зарегистрировать Applicationкласс в манифесте, необходимо определить имя

    <application
        android_name="Yourpackage.MyApplication"
        android_allowBackup="false"
        android_icon="@mipmap/ic_launcher"
        android_label="@string/app_name"
        android_logo="@drawable/your_logo"
        android_supportsRtl="true"
        android_theme="@style/AppTheme"
        tools_replace="android:icon">
    
        <!-- Your activities -->
    </application>