Android 如何从后台服务显示状态通知或弹出对话框?

Android 如何从后台服务显示状态通知或弹出对话框?,android,service,Android,Service,我已经创建了bootup服务,它在我的应用程序中侦听传入的消息。服务在后台持续运行,但应用程序关闭,用户脱机。当用户脱机且有新消息时,我必须在状态栏或弹出对话框上显示通知(在此情况下,服务不绑定到任何活动)。我面临以下问题: 创建通知时,我没有获得上下文和活动 当我从服务类中显示对话框时,我得到了异常,如“无法在未调用Looper.prepare()的线程内创建处理程序”。 我是安卓服务的新手,不知道该怎么解决这个问题。 有人能指导我怎么做吗?是否有任何链接可以指导我这样做?我被这个问题绊倒了。

我已经创建了bootup
服务
,它在我的应用程序中侦听传入的消息。服务在后台持续运行,但应用程序关闭,用户脱机。当用户脱机且有新消息时,我必须在状态栏或弹出对话框上显示通知(在此情况下,服务不绑定到任何活动)。我面临以下问题:

  • 创建通知时,我没有获得上下文和活动
  • 当我从服务类中显示对话框时,我得到了异常,如
    “无法在未调用Looper.prepare()的线程内创建处理程序”。
  • 我是安卓服务的新手,不知道该怎么解决这个问题。 有人能指导我怎么做吗?是否有任何链接可以指导我这样做?我被这个问题绊倒了。非常感谢你的帮助。谢谢。

    您可以发送通知,并指定用户启动时应运行的活动: 您可以开始另一项活动:
    除了警长的回答,你还必须使用以下主题

    android:theme=“@android:style/theme.Dialog”


    对于AndroidManifest.xml中的该活动。然后您将获得一个对话框。:)

    只有当该对话框是系统警报对话框时,我们才能从服务中显示该对话框。因此,将
    TYPE\u SYSTEM\u ALERT
    窗口布局参数设置为Dialog,如下所示:

    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
    
    但是,它需要
    系统\u警报\u窗口权限
    。所以,别忘了在清单文件中添加这个权限

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    
    
    
    编辑: 显示对话框的更好选项是按以下方式之一启动活动

  • 使用对话主题启动活动(android:Theme=“@android:style/Theme.Dialog”)-(或)
  • 启动半透明活动并在其中显示对话框
  • 注意:您应该将Intent.FLAG\u ACTIVITY\u NEW\u任务添加到Intent中


    快乐编码…:)

    要从服务中添加一个警报对话框,这很好

    final AlertDialog dialog = dialogBuilder.create();
                final Window dialogWindow = dialog.getWindow();
                final WindowManager.LayoutParams dialogWindowAttributes = dialogWindow.getAttributes();
    
                // Set fixed width (280dp) and WRAP_CONTENT height
                final WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
                lp.copyFrom(dialogWindowAttributes);
                lp.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 280, getResources().getDisplayMetrics());
                lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
                dialogWindow.setAttributes(lp);
    
                // Set to TYPE_SYSTEM_ALERT so that the Service can display it
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    dialogWindow.setType(WindowManager.LayoutParams.TYPE_TOAST);
                }
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    dialogWindow.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
                }
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
                {
                    dialogWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                }
                dialog.show();
    
    final AlertDialog=dialogBuilder.create();
    final Window dialogWindow=dialog.getWindow();
    final WindowManager.LayoutParams dialogWindowAttributes=dialogWindow.getAttributes();
    //设置固定宽度(280dp)和包裹内容高度
    final WindowManager.LayoutParams lp=新建WindowManager.LayoutParams();
    lp.copyFrom(dialogWindowAttributes);
    lp.width=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,280,getResources().getDisplayMetrics());
    lp.height=WindowManager.LayoutParams.WRAP\u内容;
    dialogWindow.setAttributes(lp);
    //设置为“类型\系统\警报”,以便服务可以显示它
    if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.M){
    dialogWindow.setType(WindowManager.LayoutParams.TYPE_TOAST);
    }
    if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.O){
    dialogWindow.setType(WindowManager.LayoutParams.TYPE\u APPLICATION\u OVERLAY);
    }
    if(Build.VERSION.SDK_INT

    但是使用TYPE_SYSTEM_ALERT可能会触发Google对使用危险权限的应用的删除策略。确保你有一个有效的理由,以防谷歌需要。

    请参阅本帖中的Commonware回复-非常感谢谢里夫。。我可以在通知的同时播放铃声吗?如何实现此目标?@SherifelKhatib如何使用按钮单击事件关闭此弹出式活动???@Sam_k使用
    OnClickListener中的
    finish()
    。顺便说一句,我真的不知道这个答案是什么:p
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    
    final AlertDialog dialog = dialogBuilder.create();
                final Window dialogWindow = dialog.getWindow();
                final WindowManager.LayoutParams dialogWindowAttributes = dialogWindow.getAttributes();
    
                // Set fixed width (280dp) and WRAP_CONTENT height
                final WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
                lp.copyFrom(dialogWindowAttributes);
                lp.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 280, getResources().getDisplayMetrics());
                lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
                dialogWindow.setAttributes(lp);
    
                // Set to TYPE_SYSTEM_ALERT so that the Service can display it
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    dialogWindow.setType(WindowManager.LayoutParams.TYPE_TOAST);
                }
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    dialogWindow.setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
                }
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
                {
                    dialogWindow.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
                }
                dialog.show();