Getting 'You need to use a Theme.AppCompat the

2019-06-09 15:25发布

问题:

I'm sending a Broadcast from a service and then receiving it back from inner BroadcastReceiver class. I have to show an AlertDialog based on some logic but while trying to do it, I'm getting this runtime error: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

Here's MyBroadcastReceiver class:

public class MyBroadcastReceiver extends BroadcastReceiver {

        public MyBroadcastReceiver(){
            super();
        }

        @Override public void onReceive(final Context context, Intent intent) {

            if (intent.getAction() != null && intent.getAction().equals(getString(R.string.broadcast_id))) {

            Intent intent1 = new Intent(MyService.this, MainActivity.class);
            intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent1);


                    @Override
                    public void run() {
                        if (someCondition) {

                            android.support.v7.app.AlertDialog.Builder builder1 = new android.support.v7.app.AlertDialog.Builder(getBaseContext());
                            builder1.setView(R.layout.dialog);

                            builder1.setPositiveButton(
                                    "OK",
                                    new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int id) {
                                        Intent notificationIntent = new Intent(getBaseContext(), Notification.class);
                                        notificationIntent.putExtra(Notification.NOTIFICATION, getNotificationGame());
                                        PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), m, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
                                        AlarmManager alarmManager = (AlarmManager) getBaseContext().getSystemService(Context.ALARM_SERVICE);
                                        alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, finalFutureInMillis, pendingIntent);
                                        postMethod(MainActivity.name, MainActivity.uidOfProfilePic, String.valueOf(MainActivity.currentLatDouble), String.valueOf(MainActivity.currentLngDouble), null, s, v, sA, requestID, user.getUid(), nP);
                                            dialog.cancel();
                                        }
                                    });

                            final android.support.v7.app.AlertDialog alert11 = builder1.create();
                            alert11.setCancelable(false);
                            alert11.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                            // error on line below
                            alert11.show();

                            }
                        } 

            } 
        }
    }

I searched the internet for this and came up with this which suggests to create an activity and do the AlertDialog code in it, but as you can see that I'm doing some work when user clicks OK and that code retrieved in the Service and I will be unable to access it from another activity.

Please let me know what should I do now?

回答1:

Hammad, the documentation say that you cannot launch a popup dialog in your implementation of onReceive(). (like the answers say it) https://stackoverflow.com/a/4855397/7542998

The Receivers are thought for receive and initiate new process. I say that because after a fews seconds of data processing the receiver can be blocked by the system, so take always that in mind when you put some logic on it.

However, like say this other answer

(https://stackoverflow.com/a/16332260/7542998) you can try with NotificationManager API.

In both links there are good answers to achieve what you want.

Hope this will help.