android模仿QQ锁屏状态弹框

来源:互联网 发布:淘宝什么牌子的t恤好 编辑:程序博客网 时间:2024/05/10 19:16

进过查询很多博主的文章来总结一下在锁屏状态下弹出消息对话框的问题

一,首先创建Activity进行Activity设置

public class Messagedialog extends Activity{protected void onCreate(Bundle savedInstanceState) {      super.onCreate(savedInstanceState);     final Window win = getWindow();      win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED              | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD              | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON              | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);      setContentView(R.layout.dilog_xml);// 调用接口来实现显示的数据}

四个标志位顾名思义,分别是锁屏状态下显示,解锁,保持屏幕长亮,打开屏幕,xml文件不需要设置。

二,进行AndroidManifest.xml注册

<activity android:name=".boat.Messagedialog"               android:launchMode="singleInstance"            android:excludeFromRecents="true"            android:taskAffinity=""            android:theme="@android:style/Theme.Wallpaper.NoTitleBar">

其中的属性

android:excludeFromRecents="true"

当应用跳转到启动模式设置为singleInstance的Activity页面时,出现一段黑屏

android:excludeFromRecents="true" 

这个属性的作用恰恰就是让你在长按home键的时候在弹出的应用列表中隐藏你的应用,达到隐藏应用程序进行的目的

三,在广播中激活弹窗

KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);          if (km.inKeyguardRestrictedInputMode()) {                     Intent alarmIntent = new Intent(context, Messagedialog.class);              alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);            context.startActivity(alarmIntent);                     }

在你接收到广播中添加以以上代码,并跳转到了弹窗的Activity中,这里用到的是KeyguardManager类,用来管理锁屏,判断当前是否是锁屏状态,inKeyguardRestrictedInputMode()方法,如果为true,即为锁屏状态。在广播中启动Activity的context可能不是Activity对象,所以需要添加NEW_TASK的标志,否则启动时可能会报错。

四,创建一个列表对话框

String[] array = (String[])weidu.toArray(new String[weidu.size()]); builder1=new AlertDialog.Builder(Messagedialog.this).setTitle("消息提示").setItems(array, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {Messagedialog.this.finish();Intent intent = new Intent(Messagedialog.this,XiaoxiActivity.class);startActivity(intent);}}).setNegativeButton("忽略",new DialogInterface.OnClickListener(){@Overridepublic void onClick(DialogInterface arg0, int arg1) {// TODO Auto-generated method stubMessagedialog.this.finish();}}).show();

将你需要显示的数据放入到列表对话框中进行显示,这有一个问题,我还没有弄明白,就是如何现在消息的时时更新显示,可以参考http://blog.csdn.net/maosidiaoxian/article/details/40587935这位博主大哥的文章大家来研究

五,如何再次唤醒屏幕

@Overrideprotected void onPause() {// TODO Auto-generated method stub//builder1.dismiss(); PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);      if (!pm.isScreenOn()) {          PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |                  PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");          wl.acquire();          wl.release();      }     // getXiaoxidata("1", ID, TcGlobalConstant.Result.yiXiaoxi);super.onPause();}

 将以上方法放到onPause下,就会再次唤醒屏幕,因为当前程序在弹出对话框是处于暂停状态。这个方法也是对电源锁的监听。

六,在AndroidManifest中用到的权限

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

第一条是解锁屏幕需要的,第二条是申请电源锁需要的。

参考资料

http://blog.csdn.net/maosidiaoxian/article/details/40587935
博主的文章


大概就是如图效果,背景有点黑,那是锁屏图片。



0 0