<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android仿QQ實(shí)現(xiàn)鎖屏消息提醒

          共 3957字,需瀏覽 8分鐘

           ·

          2021-10-28 22:24

          今天帶來的是,可以在鎖屏下彈窗顯示消息來提醒用戶。


          效果圖:


          適用應(yīng)用場景


          適用應(yīng)用場景:應(yīng)用沒有完全退出的情況下在后臺運(yùn)行時(shí),如果用戶已經(jīng)關(guān)閉了手機(jī)屏幕,如果我們的APP收到推送消息,則打開手機(jī)屏幕,彈框顯示消息的方式來提醒用戶。

          實(shí)現(xiàn)思路


          在收到自己服務(wù)器的推送消息時(shí),發(fā)送一條廣播,在接收到指定廣播之后在廣播的onReceive()中判斷當(dāng)前屏幕是否處于關(guān)閉狀態(tài),如果處于關(guān)閉狀態(tài),則顯示這個(gè)彈窗消息,反之,則不需要顯示。


          實(shí)現(xiàn)步驟


          1、Service中發(fā)送廣播

          由于寫這個(gè)demo,沒有引入第三方推送,我就用Service來代替,大致就是說,開啟一個(gè)后臺服務(wù),在退出APP后,任然在運(yùn)行,在退出5s后,發(fā)送一條廣播消息,通知廣播接收器有新的消息需要提示用戶。
          ** * 模擬推送,在退出APP后的一段時(shí)間發(fā)送消息 */
          /** * 模仿推送,發(fā)消息 */ private void sendMessage() { new Thread(new Runnable() { @Override public 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(); }}

          2、在廣播中啟動鎖屏彈窗

          我們設(shè)置的是鎖屏下才彈窗的,非鎖屏下就不適合彈出這個(gè)窗口了。注冊一個(gè)廣播接收器,在接收到指定廣播之后判斷是否需要彈窗。
          ** * 監(jiān)聽鎖屏消息的廣播接收器 */public class LockScreenMsgReceiver extends BroadcastReceiver {    private static final String TAG = "LockScreenMsgReceiver";
          @Override public 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)錯。


          3、Activity來顯示彈窗消息

          QQ的彈窗一開始我以為是懸浮View,用WindowManager去添加,后來嘗試,查閱資料之后才發(fā)現(xiàn)是一個(gè)Activity,只不過它的背景用的就是你手機(jī)的這個(gè)背景而已。

          public class MessageActivity extends Activity {
          @Override protected 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ài)下顯示消息就是因?yàn)榇绑w對象的這個(gè)添加標(biāo)志位的這個(gè)方法起了作用。四個(gè)標(biāo)志位的作用,分別是鎖屏狀態(tài)下顯示,解鎖,保持屏幕長亮,打開屏幕。這樣當(dāng)Activity啟動的時(shí)候,它會解鎖并亮屏顯示。保持屏幕長亮這個(gè)標(biāo)志位是可選的。

          設(shè)置了背景為壁紙的背景,所以顯示的是桌面的背景。如果背景設(shè)為默認(rèn)的白色,則導(dǎo)致彈窗后面是一片白色,看起來很丑。如果背景設(shè)置為透明,則彈窗后面會顯示出解鎖后的界面(即使有鎖屏密碼,也是會顯示解鎖后的界面的),一樣很影響視覺效果。

          當(dāng)顯示完消息,點(diǎn)擊消息內(nèi)容的時(shí)候,需要先先解鎖系統(tǒng)自帶鎖屏服務(wù),才能進(jìn)入我們對應(yīng)的消息界面。
          //先解鎖系統(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();

          然后在AndroidManifest.xml文件當(dāng)中,對該activity的聲明需要加上以下屬性:
                      android:name=".activity.MessageActivity"            android:excludeFromRecents="true"            android:launchMode="singleInstance"            android:taskAffinity="" />

          需要的權(quán)限
                        

          源碼地址:

          https://github.com/zhouxu88/LockScreenMsgDemo


          到這里就結(jié)束啦。
          瀏覽 121
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  18禁网站免费看 | 免费观看一级二级网站 | 国产午夜福利 | 中国一级免费色电影 | 中文字幕第18页 |