dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)的作用???

Leafact 2015-04-02 11:28:47
我写了个demo

AlertDialog dialog = new AlertDialog.Builder(MainActivity.this)
.setTitle("title")
.setMessage("message")
.setPositiveButton("test",new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("positive");
}
})
.setNegativeButton("tttt", new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("negative");
}
}).create();
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
dialog.show();


dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
写这个需要添加一个权限,不然会报错?
但是不我不写这一样,和写这一样弹出的dialog确是一样的?
那么问题来了, dialog.getWindow().setType的意义何在呢?
...全文
7331 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
_BigBen 2016-04-20
  • 打赏
  • 举报
回复
权限是:android.permission.SYSTEM_ALERT_WINDOW
Leafact 2015-05-21
  • 打赏
  • 举报
回复
引用 6 楼 yexianghu 的回复:
android SDK中的描述 public static final int TYPE_SYSTEM_ALERT Added in API level 1 Window type: system window, such as low power alert. These windows are always on top of application windows. In multiuser systems shows only on the owning user's window. 加了这个type的window将始终显示在其他应用程序的window之上,也就是说这个window始终处于最上层,对用户始终可见(但是锁屏情况下是否还能显示在最上层没有试过,不太确定)
嗯,这个我试过,用Alert这个必须手动关闭,点其他地方是关闭不了的, 包括点home键,至于权限,感觉可能是上面的(未验证)
Leafact 2015-05-21
  • 打赏
  • 举报
回复
引用 5 楼 aaa111 的回复:
[quote=引用 4 楼 leafact 的回复:] [quote=引用 3 楼 jeky198306 的回复:] 这个是系统级别的,不属于应用层
主要是我实习就是在搞系统的。所以好奇,网上也找不到区别,而且 TYPE_SYSTEM_DIALOG也需要一个权限,但是我不知道是啥。只有找到一个SYSTEM_ALERT_WINDOW的权限,这是 TYPE_SYSTEM_ALERT的权限[/quote] hi~ 我现在也是搞系统的。 TYPE_SYSTEM_DIALOG 这个属性只有系统应用才能使用,对应的权限应该是(未验证): <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" /> 我搜了一下源码,在整个源码中大概也只使用了10多次样子。 其中两个可以看到这种dialog的地方:1. 在拨号盘输入MMI码;2.开机状态拨出SIM卡。 表现的情况就是这中dialog弹出来以后,点击Home键 dialog不会消失。点击空白处和返回键dialog会消失。[/quote] 说的很有道理,不过我现在失业了,哈哈
yexianghu 2015-05-20
  • 打赏
  • 举报
回复
android SDK中的描述 public static final int TYPE_SYSTEM_ALERT Added in API level 1 Window type: system window, such as low power alert. These windows are always on top of application windows. In multiuser systems shows only on the owning user's window. 加了这个type的window将始终显示在其他应用程序的window之上,也就是说这个window始终处于最上层,对用户始终可见(但是锁屏情况下是否还能显示在最上层没有试过,不太确定)
十橙 2015-05-20
  • 打赏
  • 举报
回复
引用 4 楼 leafact 的回复:
[quote=引用 3 楼 jeky198306 的回复:] 这个是系统级别的,不属于应用层
主要是我实习就是在搞系统的。所以好奇,网上也找不到区别,而且 TYPE_SYSTEM_DIALOG也需要一个权限,但是我不知道是啥。只有找到一个SYSTEM_ALERT_WINDOW的权限,这是 TYPE_SYSTEM_ALERT的权限[/quote] hi~ 我现在也是搞系统的。 TYPE_SYSTEM_DIALOG 这个属性只有系统应用才能使用,对应的权限应该是(未验证): <uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" /> 我搜了一下源码,在整个源码中大概也只使用了10多次样子。 其中两个可以看到这种dialog的地方:1. 在拨号盘输入MMI码;2.开机状态拨出SIM卡。 表现的情况就是这中dialog弹出来以后,点击Home键 dialog不会消失。点击空白处和返回键dialog会消失。
Leafact 2015-04-03
  • 打赏
  • 举报
回复
引用 3 楼 jeky198306 的回复:
这个是系统级别的,不属于应用层
主要是我实习就是在搞系统的。所以好奇,网上也找不到区别,而且 TYPE_SYSTEM_DIALOG也需要一个权限,但是我不知道是啥。只有找到一个SYSTEM_ALERT_WINDOW的权限,这是 TYPE_SYSTEM_ALERT的权限
灰火 2015-04-02
  • 打赏
  • 举报
回复
有主页键吗?按一下应该能看到效果了 SYSTEM_ALERT的显示优先级很高的
jeky_zhang2013 2015-04-02
  • 打赏
  • 举报
回复
这个是系统级别的,不属于应用层
Leafact 2015-04-02
  • 打赏
  • 举报
回复
引用 1 楼 kelerwx999 的回复:
有主页键吗?按一下应该能看到效果了 SYSTEM_ALERT的显示优先级很高的
是home键么? 果然啊,TYPE_SYSTEM_ALERT按了home之后dialog还在啊! TYPE_SYSTEM_DIALOG与ALERT有什么区别呢? api文档: public static final int TYPE_SYSTEM_ALERT 添加于 API 级别 1 Window type: system window, such as low power alert. These windows are always on top of application windows. In multiuser systems shows only on the owning user's window. public static final int TYPE_SYSTEM_DIALOG 添加于 API 级别 1 Window type: panel that slides out from the status bar In multiuser systems shows on all users' windows. 能否解释一下?
/** * 为程序创建桌面快捷方式 */ private void addShortcut(){ Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); //快捷方式的名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); shortcut.putExtra("duplicate", false); //不允许重复创建 //指定当前的Activity为快捷方式启动的对象: 如 //com.everest.video.VideoPlayer //注意: ComponentName的第二个参数必须加上点号(.),否则快捷方式无法启动相应程序 ComponentName comp = new ComponentName(this.getPackageName(), "."+this.getLocalClassName()); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp)); //快捷方式的图标 ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(this, R.drawable.icon); shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes); sendBroadcast(shortcut); } /** * 删除程序的快捷方式 */ private void delShortcut(){ Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT"); //快捷方式的名称 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); //指定当前的Activity为快捷方式启动的对象: 如 //com.everest.video.VideoPlayer //注意: ComponentName的第二个参数必须是完整的类名(包名+类名),否则无法删除快捷方式 String appClass = this.getPackageName() + "." +this.getLocalClassName(); ComponentName comp = new ComponentName(this.getPackageName(), appClass); shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp)); sendBroadcast(shortcut); } 全屏显示 this.requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 横竖屏显示 private void changedScreen(){ int request = this.getRequestedOrientation(); if(request == -1){ Toast.makeText(TaskRunActivity.this, "None 1", Toast.LENGTH_SHORT).show(); }else{ if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){ this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); }else if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){ this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } } } 获取手机分辩率 DisplayMetrics dm = new DisplayMetrics(); this.getWindowManager().getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; int height = dm.heightPixels; 图形用户界面 文本框(TextView) 列表(ListView) 卷轴视图(ScrollView) 编辑框(EditText) 按钮(Button) 下载列表(Spinner) 多项选择(CheckBok) 图形用户界面 菜单(Menu) 提示(toast) 对话框(Dialog) 日期(DatePicker) 时间(TimePicker) 单项选择(RadioGroup RadioButton) 图形用户界面 线性布局(LinearLayout) 相对布局(RelativeLayout) 绝对布局(AbsoluteLayout) 表格布局(TableLayout) 数据据存储 系统偏好 文件 网络 数据库 显示网页: 1. Uri uri = Uri.parse("http://www.google.com"); 2. Intent it = new Intent(Intent.ACTION_VIEW,uri); 3. startActivity(it); 显示地图: 1. Uri uri = Uri.parse("geo:38.899533,-77.036476"); 2. Intent it = new Intent(Intent.Action_VIEW,uri); 3. startActivity(it); 路径规划: 1. Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=startLat%20startLng&daddr=endLat%20endLng&hl=en"); 2. Intent it = new Intent(Intent.ACTION_VIEW,URI); 3. startActivity(it); 拨打电话: 调用拨号程序 1. Uri uri = Uri.parse("tel:xxxxxx"); 2. Intent it = new Intent(Intent.ACTION_DIAL, uri); 3. startActivity(it); 1. Uri uri = Uri.parse("tel.xxxxxx"); 2. Intent it =new Intent(Intent.ACTION_CALL,uri); 3. 要使用这个必须在配置文件中加入 发送SMS/MMS 调用发送短信的程序 1. Intent it = new Intent(Intent.ACTION_VIEW); 2. it.putExtra("sms_body", "The SMS text"); 3. it.setType("vnd.android-dir/mms-sms"); 4. startActivity(it); 发送短信 1. Uri uri = Uri.parse("smsto:0800000123"); 2. Intent it = new Intent(Intent.ACTION_SENDTO, uri); 3. it.putExtra("sms_body", "The SMS text"); 4. startActivity(it); 发送彩信 1. Uri uri = Uri.parse("content://media/external/images/media/23"); 2. Intent it = new Intent(Intent.ACTION_SEND); 3. it.putExtra("sms_body", "some text"); 4. it.putExtra(Intent.EXTRA_STREAM, uri); 5. it.setType("image/png"); 6. startActivity(it); 发送Email 1. 2. Uri uri = Uri.parse("mailto:xxx@abc.com"); 3. Intent it = new Intent(Intent.ACTION_SENDTO, uri); 4. startActivity(it); 1. Intent it = new Intent(Intent.ACTION_SEND); 2. it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com"); 3. it.putExtra(Intent.EXTRA_TEXT, "The email body text"); 4. it.setType("text/plain"); 5. startActivity(Intent.createChooser(it, "Choose Email Client")); 1. Intent it=new Intent(Intent.ACTION_SEND); 2. String[] tos={"me@abc.com"}; 3. String[] ccs={"you@abc.com"}; 4. it.putExtra(Intent.EXTRA_EMAIL, tos); 5. it.putExtra(Intent.EXTRA_CC, ccs); 6. it.putExtra(Intent.EXTRA_TEXT, "The email body text"); 7. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 8. it.setType("message/rfc822"); 9. startActivity(Intent.createChooser(it, "Choose Email Client")); 添加附件 1. Intent it = new Intent(Intent.ACTION_SEND); 2. it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); 3. it.putExtra(Intent.EXTRA_STREAM, "[url=]file:///sdcard/mysong.mp3[/url]"); 4. sendIntent.setType("audio/mp3"); 5. startActivity(Intent.createChooser(it, "Choose Email Client")); 播放多媒体 1. 2. Intent it = new Intent(Intent.ACTION_VIEW); 3. Uri uri = Uri.parse("[url=]file:///sdcard/song.mp3[/url]"); 4. it.setDataAndType(uri, "audio/mp3"); 5. startActivity(it); 1. Uri uri = Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1"); 2. Intent it = new Intent(Intent.ACTION_VIEW, uri); 3. startActivity(it); Uninstall 程序 1. Uri uri = Uri.fromParts("package", strPackageName, null); 2. Intent it = new Intent(Intent.ACTION_DELETE, uri); 3. startActivity(it); //调用相册 public static final String MIME_TYPE_IMAGE_JPEG = "image/*"; public static final int ACTIVITY_GET_IMAGE = 0; Intent getImage = new Intent(Intent.ACTION_GET_CONTENT); getImage.addCategory(Intent.CATEGORY_OPENABLE); getImage.setType(MIME_TYPE_IMAGE_JPEG); startActivityForResult(getImage, ACTIVITY_GET_IMAGE); //调用系统相机应用程序,并存储拍下来的照片 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); time = Calendar.getInstance().getTimeInMillis(); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment .getExternalStorageDirectory().getAbsolutePath()+"/tucue", time + ".jpg"))); startActivityForResult(intent, ACTIVITY_GET_CAMERA_IMAGE); uninstall apk Uri uninstallUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri); install apk Uri installUri = Uri.fromParts("package", "xxx", null); returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri); play audio Uri playUri = Uri.parse("[url=]file:///sdcard/download/everything.mp3[/url]"); returnIt = new Intent(Intent.ACTION_VIEW, playUri); //发送附件 Intent it = new Intent(Intent.ACTION_SEND); it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text"); it.putExtra(Intent.EXTRA_STREAM, "[url=]file:///sdcard/eoe.mp3[/url]"); sendIntent.setType("audio/mp3"); startActivity(Intent.createChooser(it, "Choose Email Client")); //搜索应用 Uri uri = Uri.parse("market://search?q=pname:pkg_name"); Intent it = new Intent(Intent.ACTION_VIEW, uri); startActivity(it); //where pkg_name is the full package path for an application //进入联系人页面 Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(People.CONTENT_URI); startActivity(intent); //查看指定联系人 Uri personUri = ContentUris.withAppendedId(People.CONTENT_URI, info.id);//info.id联系人ID Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.setData(personUri); startActivity(intent); 在进行Android开发的过程中,免不了,要开发TCP/UDP通讯的程序,下面这两段代码,分别介绍了TCP/UCP通过的一个实例: 代码一: private void tcpdata() { try { Socket s = new Socket("192.168.0.25", 65500); // outgoing stream redirect to socket OutputStream out = s.getOutputStream(); // 注意第二个参数据为true将会自动flush,否则需要需要手动操作out.flush() PrintWriter output = new PrintWriter(out, true); output.println("Hello IdeasAndroid! 伪IP为:" + SIMCardToIP("13512345006")); InputStream inputStream = s.getInputStream(); DataInputStream input = new DataInputStream(inputStream); byte[] b = new byte[10000]; int length = input.read(b); inputReader = new InputStreamReader(inputStream); String Msg = new String(b, 0, length, "gb2312"); Toast.makeText(TcpTest.this, Msg, 1000).show(); Log.d("Tcp Demo", "message From Server:" + Msg); s.close(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 下面的代码是UDP通讯的过程: public String send(String msg) { StringBuilder sb = new StringBuilder(); InetAddress local = null; try { local = InetAddress.getByName("192.168.0.25"); // 本机测试 } catch (UnknownHostException e) { e.printStackTrace(); } try { dSocket = new DatagramSocket(); // 注意此处要先在配置文件里设置权限,否则会抛权限不足的异常 } catch (SocketException e) { e.printStackTrace(); } int msg_len = msg == null ? 0 : msg.length(); DatagramPacket dPacket = new DatagramPacket(msg.getBytes(), msg_len, local, SERVER_PORT); try { dSocket.send(dPacket); } catch (IOException e) { e.printStackTrace(); } try { dSocket.receive(dPacket); sb.append(new String(dPacket.getData())); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } dSocket.close(); return sb.toString(); }

80,359

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧