Android仿QQ實(shí)現(xiàn)鎖屏消息提醒
今天帶來的是,可以在鎖屏下彈窗顯示消息來提醒用戶。
效果圖:

適用應(yīng)用場景
實(shí)現(xiàn)思路
在收到自己服務(wù)器的推送消息時(shí),發(fā)送一條廣播,在接收到指定廣播之后在廣播的onReceive()中判斷當(dāng)前屏幕是否處于關(guān)閉狀態(tài),如果處于關(guān)閉狀態(tài),則顯示這個(gè)彈窗消息,反之,則不需要顯示。
實(shí)現(xiàn)步驟
*** 模擬推送,在退出APP后的一段時(shí)間發(fā)送消息*//*** 模仿推送,發(fā)消息*/private void sendMessage() {new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}Intent intent = new Intent();intent.setAction("com.zx.lockscreenmsgdemo.LockScreenMsgReceiver");sendBroadcast(intent); //發(fā)送廣播}}).start();}}
*** 監(jiān)聽鎖屏消息的廣播接收器*/public class LockScreenMsgReceiver extends BroadcastReceiver {private static final String TAG = "LockScreenMsgReceiver";@Overridepublic void onReceive(Context context, Intent intent) {Log.i(TAG, "onReceive:收到了鎖屏消息 ");String action = intent.getAction();if (action.equals("com.zx.lockscreenmsgdemo.LockScreenMsgReceiver")) {//管理鎖屏的一個(gè)服務(wù)KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);String text = km.inKeyguardRestrictedInputMode() ? "鎖屏了" : "屏幕亮著的";Log.i(TAG, "text: " + text);if (km.inKeyguardRestrictedInputMode()) {Log.i(TAG, "onReceive:鎖屏了 ");//判斷是否鎖屏Intent alarmIntent = new Intent(context, MessageActivity.class);//在廣播中啟動Activity的context可能不是Activity對象,所以需要添加NEW_TASK的標(biāo)志,否則啟動時(shí)可能會報(bào)錯。alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(alarmIntent); //啟動顯示鎖屏消息的activity}}}}
KeyguardManager類,用來管理鎖屏的,4.1之后該類的API新增了一個(gè)isKeyguardLocked()的方法判斷是否鎖屏,但在4.1之前,我們只能用inKeyguardRestrictedInputMode()方法,如果為true,即為鎖屏狀態(tài)。
在廣播中啟動Activity的context可能不是Activity對象,有可能是Service或者其他BroadcastReceiver,所以需要添加NEW_TASK的標(biāo)志,否則啟動時(shí)會報(bào)錯。
QQ的彈窗一開始我以為是懸浮View,用WindowManager去添加,后來嘗試,查閱資料之后才發(fā)現(xiàn)是一個(gè)Activity,只不過它的背景用的就是你手機(jī)的這個(gè)背景而已。
public class MessageActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.i("tag", "onCreate:啟動了消息內(nèi)容的activity ");//四個(gè)標(biāo)志位顧名思義,分別是鎖屏狀態(tài)下顯示,解鎖,保持屏幕長亮,打開屏幕。這樣當(dāng)Activity啟動的時(shí)候,它會解鎖并亮屏顯示。Window win = getWindow();win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //鎖屏狀態(tài)下顯示| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD //解鎖| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON //保持屏幕長亮| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); //打開屏幕// Drawable wallPaper = WallpaperManager.getInstance( this).getDrawable();// win.setBackgroundDrawable(wallPaper);setContentView(R.layout.activity_message);}}
//先解鎖系統(tǒng)自帶鎖屏服務(wù),放在鎖屏界面里面KeyguardManager keyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);keyguardManager.newKeyguardLock("").disableKeyguard(); //解鎖//點(diǎn)擊進(jìn)入消息對應(yīng)的頁面mContext.startActivity(new Intent(mContext, DetailsActivity.class));finish();
android:name=".activity.MessageActivity"android:excludeFromRecents="true"android:launchMode="singleInstance"android:taskAffinity="" />
https://github.com/zhouxu88/LockScreenMsgDemo
評論
圖片
表情
