正常初始化对话框的写法
一般的Dialog对象初始化都需要依赖于Activity,如下
1 | new AlertDialog.Builder(activity) |
BroadcastReceiver如果是在Activity中注册的,用onReceive(Context context, Intent intent)方法的context参数来初始化Dialog是可以正常弹出对话框的。因为这里的context其实是一个Activity对象,如下所示:
1 | public class MainActivity extends Activity { |
会报错的写法
虽说AlertDialog.Builder(Context context)的参数是Context,但是如果传入的是非Activity的Context,比如说Application,就会报如下所示的错误
1 | android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application |
所以以下的几种写法都会报错
1 | new AlertDialog.Builder(activity.getApplication()) |
BroadcastReceiver如果是在Manifest中声明的,用onReceive(Context context, Intent intent)方法的context参数来初始化Dialog,一样还会报Unable to add window – token null is not for an application错误。所以如下写法也不可行
1 | public class MyBroadcastReceiver extends BroadcastReceiver { |
全局Dialog
但是如果说有些情况下获取不到Activity对象,但是又想弹出Dialog呢?这时候用全局的Dialog是可以实现的。
只需要设置dialog为WindowManager.LayoutParams.TYPE_SYSTEM_ALERT类型
然后添加android.permission.SYSTEM_ALERT_WINDOW权限
1 | Dialog dialog = new AlertDialog.Builder(activity.getApplicationContext()) |