Android如何在service中弹出对话框

最近又听人聊到Android能不能在service中弹出对话框的问题,于是总结一下
答案是肯定的,系统可以在低电量的时候弹出电量不足的提示,那么我们也可以按同样的方法做到
下面介绍在service中弹出对话框的两种方法:

1.将dialog的Type设置为TYPE_SYSTEM_ALERT

写一个service代码如下:

public class DialogService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        showDialog();

        return super.onStartCommand(intent, flags, startId);

    }

    private void showDialog() {

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                AlertDialog dialog = new AlertDialog.Builder(getApplicationContext()).setTitle("title")
                        .setMessage("这是一个由service弹出的对话框")
                        .setCancelable(false)
                        .setPositiveButton("button confirm", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                            }
                        })
                        .create();
                dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                dialog.show();
            }
        }, 3 * 1000);

    }

}

为了方便测试,我们让dialog延迟3s出现,运行代码之后发现抛出了异常
android.view.WindowManager BadTokenException:Unabletoaddwindowandroid.view.ViewRootImpl B a d T o k e n E x c e p t i o n : U n a b l e t o a d d w i n d o w a n d r o i d . v i e w . V i e w R o o t I m p l W@3ca3d69d – permission denied for this window type
原因是缺少相关权限,于是在AndroidMainfest.xml中添加权限,再次运行观察结果,如期弹出了dialog,如下面几种截图,可以发现在开启service之后,不管当前处于应用内还是应用外,甚至在其他应用内,都弹出了dialog。
效果示例图片1
效果示例图片2
效果示例图片3

2.将Activity设置成dialog主题弹出

将activity设置成dialog主题需要再AndroidManifest.xml中加上android:theme=”@android:style/Theme.Dialog”
相关代码如下:

    private void showDialog2() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent intent = new Intent(getApplicationContext(), DialogActivity.class);
                startActivity(intent);
            }
        }, 3 * 1000);
    }

运行出错
android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

需要将activity的启动模式设置为Intent.FLAG_ACTIVITY_NEW_TASK,重新设置之后运行如下:
效果示例图片3
值得注意的是,这种方式在弹出对话框的时候,会先跳转到我们的应用,然后再弹出对话框。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android应用中弹全局对话框,你可以使用系统提供的WindowManager来实现。下面是一个简单的示例代码: ```java public class GlobalDialog { private WindowManager windowManager; private Context context; private View dialogView; public GlobalDialog(Context context) { this.context = context; } public void showDialog() { // 初始化对话框布局 dialogView = LayoutInflater.from(context).inflate(R.layout.dialog_layout, null); // 设置对话框的宽高 WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.height = WindowManager.LayoutParams.MATCH_PARENT; layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; // 设置窗口类型为全局对话框 layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; // 获取WindowManager实例 windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); // 将对话框添加到WindowManager中 windowManager.addView(dialogView, layoutParams); } public void dismissDialog() { if (windowManager != null && dialogView != null) { windowManager.removeView(dialogView); windowManager = null; dialogView = null; } } } ``` 在上述代码中,我们创建了一个`GlobalDialog`类来管理全局对话框。通过调用`showDialog()`方法,我们可以在应用中弹全局对话框,而调用`dismissDialog()`方法则可以关闭对话框。 在布局文件`dialog_layout.xml`中,你可以自定义对话框的样式和内容。 请注意,要使用全局对话框,你的应用必须拥有`SYSTEM_ALERT_WINDOW`权限。你可以在AndroidManifest.xml文件中添加以下权限声明: ```xml <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> ``` 同时,从Android 6.0(API级别23)开始,你还需要在运行时请求该权限。 希望这个例子对你有所帮助!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值