您的位置:首页 > 移动开发 > Android开发

Android: Show AlertDialog from Service

2015-03-05 09:50 330 查看
方便搜索就使用英文标题吧,有这个需求,结果网上一搜,大牛们纷纷告诫”Do NOT do that!”,看到没 还是大写NOT,再然后就是一串的编程理念讲一堆.

总体来讲,他们主要说的是要先有一个Activity,Activity才是管理和实现UI的,Service不是.但是总有那么一个情况没有Actvity或者Activtiy并没有启动时,Service检测到某种异常需要立刻告知用户,这种需求就摆在面前了.

在看到Android ─ Service建立Dialog對話框发现问题还是有解的.

Step 1: 添加权限

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>


Step 2: Service中调用该方法

[code]public void showDialog(int title,String message){
    Log.i("service","show dialog function");
    TextView errmsg = (TextView) layout.findViewById(R.id.errmsg);
    Log.i("service", "dialog error msg:"+message);  
    errmsg.setText(Html.fromHtml(message));
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title);
    builder.setMessage(message); 
    builder.setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            dialog.dismiss();
        }
    });
    AlertDialog alert = builder.create();
  alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);//設定提示框為系統提示框
    alert.show();
}


就可以在不添加Activity的情况下显示出对话框了.

更新代码:

[code]    /**
     * @param context Activity/Service all okay.
     * @param title   Title res id.
     * @param message Message res id.
     */
    void showDialog(Context context, int title, int message) {
        // 通过AlertDialog.Builder这个类来实例化我们的一个AlertDialog的对象
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        // 设置Title的图标
        builder.setIcon(android.R.drawable.stat_sys_warning);
        // 设置Title的内容
        builder.setTitle(title);
        // 设置Content来显示一个信息
        builder.setMessage(message);
        // 设置一个PositiveButton
        builder.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int whichButton) {
                        dialog.dismiss();
                    }
                });
        AlertDialog alert = builder.create();
        // 設定提示框為系統提示框
        alert.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        alert.show();
    }


调用例子
showDialog(this, android.R.string.dialog_alert_title, android.R.string.unknownName);
.如图所示:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: