方便搜索就使用英文标题吧,有这个需求,结果网上一搜,大牛们纷纷告诫”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中调用该方法
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的情况下显示出对话框了.
更新代码:
/**
* @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);
.如图所示: