1. 程式人生 > >Android下屏保程式的開發--須知

Android下屏保程式的開發--須知


1、註冊一個BroadcastReceiver,用於接收ACTION_SCREEN_OFF事件,當接收到這個事件時,開啟自定義的屏保畫面。
Intent.ACTION_SCREEN_OFF.
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
registerReceiver(mReceiver, filter);


BroadcastReceiver mMasterResetReciever= new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent){
        try{
            Intent i = new Intent();
           

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//解釋
            i.setClass(context, ScreenSaverActivity.class);
            context.startActivity(i);
        }catch(Exception e){
            Log.i("Output:", e.toString());
        }
    }
};




2、完成這一步時,雖然螢幕關閉時,屏保畫面被顯示,但由於接收的是ACTION_SCREEN_OFF事件,所以螢幕已經變黑了,這個時候就需要強制點亮螢幕。

首先,在AndroidManifest.xml中加上permission 許可權:
<uses-permission android:name="android.permission.WAKE_LOCK" />

以下程式碼在ScreenSaverActivity.onCreate中,
//點亮 螢幕
PowerManager pm = (PowerManager)getSystemService(POWER_SERVICE);
mWakeLock = pm.newWakeLock(
    PowerManager.ACQUIRE_CAUSES_WAKEUP |
    PowerManager.SCREEN_DIM_WAKE_LOCK |
    PowerManager.ON_AFTER_RELEASE, "SimpleTimer");


在ScreenSaverActivity.onResume中加入
mWakeLock.acquire();

為了能夠在退出屏保時,能夠讓螢幕可以關閉,我們必須釋放WakeLock.故在ScreenSaverActivity.onPause中加入
mWakeLock.acquire();


3. 完成第二步後,一般情況下大功告成。按鍵就可以返回程式。但有時候需要點選螢幕就返回系統。這個時候會發現,無論怎麼樣點選螢幕,系統都不會有響應,因為 此時螢幕已經 被鎖定。因此,要實現這個功能,在開啟屏保時,需要關閉螢幕的鎖定功能。


首先,在AndroidManifest.xml中加上permission 許可權:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

把以下這段程式碼加入合適的地方。只要啟動屏保時能夠被呼叫到
// 拿到鍵盤守護鎖,解鎖螢幕
KeyguardManager mKeyguardManager = (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
KeyguardLock mKeyguardLock = mKeyguardManager.newKeyguardLock("");
mKeyguardLock.disableKeyguard();//解鎖螢幕,也就是 關閉 螢幕 鎖定 功能

當然也可以通過以下程式碼開啟螢幕鎖定功能。
mKeyguardLock.reenableKeyguard();


+++++++++++++++++++ 具體實現自定義鎖屏控制系統的大致思想 +++++++++++++++++++++

(1)在主介面中設計一個鎖屏控制按鈕,決定是否進入 自定義的 鎖屏 控制介面;

(2) 需要設計一個Service,在啟動時,即在 它的 onCreate方法中註冊監聽系統螢幕鎖屏的廣播行為ACTION_SCREEN_OFF: "android.intent.action.SCREEN_OFF";

(3)在上述serice中定義一個廣播接收器:如果監聽到 ACTION_SCREEN_OFF,則進入到自定義的鎖屏控制介面,即啟動自定義實現的Activity;  

---------------
難點實現:
  (1)ACTION_SCREEN_OFF該訊息需要動態註冊,不能在XML檔案中全域性註冊

  (2)收到screen_off訊息後,如何讓自己定義的鎖屏介面在系統鎖屏介面之上

  (3)點亮螢幕時,如何防止啟動自定義鎖屏介面時出現的閃屏現象

  (4)在某些機型某些時候需要點亮兩次螢幕

  (5)解自定義鎖屏時需要先解系統鎖

   (6)如何做到在解系統鎖時在多機型多Rom下的相容

   (7)如何做到在解系統鎖後不對耳機線控等行為或者其他相關行為產生影響

   (8)如何在解系統鎖後,要及時的能恢復系統鎖

    (9)有其他第三方鎖屏系統存在時,如何保證自己的鎖屏在其他所有鎖屏之上。

   (10)如何在鎖屏介面遮蔽相關按鍵,特別是遮蔽Home鍵,特別是4.0系統之上
---------------------------   

 5、小結
        簡單的實現自定義鎖屏,我想大部分人在很短的時間內都能實現,關鍵是要整合到第三應用中要保證其能和大多數機型和Rom能相容,也就是要解決上面寫到的難點問題。


-----------------------------

螢幕變亮 和 變暗 發出的broadcast是這個:
android.intent.action.SCREEN_ON和android.intent.action.SCREEN_OFF

對於SCRESCREEN_ON/SCREEN_OFF,不可以到Manifest裡面註冊,要在程式碼裡面用RegisterReceive()註冊才有效。