實現鎖屏彈窗效果

實現鎖屏彈窗效果我使用的是Activity,通過監聽鎖屏廣播,然後在接收到廣播的時候彈窗Activity。


Activity有點特備就是需要設置他的幾個屬性:

1、首先這個Activity必須在onCreate裏邊設置下

	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);

2、在清單文件中給Activity添加幾個屬性:

<activity 
	    android:name="com.example.demo.WindowActivity"
	    android:launchMode="singleInstance"
	    android:excludeFromRecents="true"
	    android:taskAffinity=""
	    android:theme="@android:style/Theme.Wallpaper.NoTitleBar"></activity>


3、重寫Activity的onNewIntent()方法,該方法是在Activity設置啓動模式不爲stanted,SingleTop的時候,如果Activity已經存在的話就會回調的。

在這個裏邊來進行解鎖的,如果沒有設置密碼,或者手勢的話可以直接解鎖。

	@Override
	protected void onNewIntent(Intent intent) {
		// TODO Auto-generated method stub
		super.onNewIntent(intent);
		PowerManager powerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
		if(!powerManager.isScreenOn()){
			PowerManager.WakeLock lock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
					|PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
			lock.acquire();
			lock.release();
		}
	}

然後就是監聽廣播了,但是要注意一點,android系統有些廣播是不能被靜態註冊的,其中也就包括鎖屏,解鎖等等的。

不能靜態註冊的廣播:

android.intent.action.SCREEN_ON

android.intent.action.SCREEN_OFF

android.intent.action.BATTERY_CHANGED

android.intent.action.CONFIGURATION_CHANGED

android.intent.action.TIME_TICK


所以只能通過動態註冊,如果你希望你的應用程序一直可以監聽鎖屏等廣播,那麼就用一個粘性的service吧,讓他監聽開機啓動然後啓動Service,然後監聽鎖屏。


下邊是完整的代碼:

package com.example.demo;

import com.example.demo.ScreenService.MyBind;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.util.Log;
import android.view.ViewDebug.FlagToString;

public class ScreenListener {
    private Context mContext;
    private ScreenBroadcastReceiver receiver;
    private ScreenStateListener mScreenStateListener;

    public ScreenListener(Context context) {
        mContext = context;
        receiver = new ScreenBroadcastReceiver();
    }

    public void register(ScreenStateListener screenStateListener) {
        if (screenStateListener != null) {
            mScreenStateListener = screenStateListener;
        }
        if (receiver != null) {
            IntentFilter filter = new IntentFilter();
            filter.addAction(Intent.ACTION_SCREEN_OFF);
            filter.addAction(Intent.ACTION_SCREEN_ON);
            filter.addAction(Intent.ACTION_USER_PRESENT);
            mContext.registerReceiver(receiver, filter);
        }
    }

    public void unregister() {
        if (receiver != null) {
            mContext.unregisterReceiver(receiver);
        }
    }


    public class ScreenBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                String action = intent.getAction();
                if(Intent.ACTION_BOOT_COMPLETED.equals(action)){
                	  Log.e("zhang", "ScreenBroadcastReceiver --> ACTION_BOOT_COMPLETED");
                	  startService(context);
                }
                else if (Intent.ACTION_SCREEN_ON.equals(action)) {
                    if (mScreenStateListener != null) {
                        Log.e("zhang", "ScreenBroadcastReceiver --> ACTION_SCREEN_ON");
                        mScreenStateListener.onScreenOn();
                    }
                } else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                    if (mScreenStateListener != null) {
                        Log.e("zhang", "ScreenBroadcastReceiver --> ACTION_SCREEN_OFF");
                        mScreenStateListener.onScreenOff();
                    }
                } else if (Intent.ACTION_USER_PRESENT.equals(action)) {
                    if (mScreenStateListener != null) {
                        Log.e("zhang", "ScreenBroadcastReceiver --> ACTION_USER_PRESENT");
                        mScreenStateListener.onUserPresent();
                    }
                }
            }
        }
    }
    private ScreenService screenService;
    public void startService(final Context context){
    	Intent intent = new Intent(context, ScreenService.class);
    	context.bindService(intent, new ServiceConnection() {
			
			@Override
			public void onServiceDisconnected(ComponentName name) {
				
			}
			
			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				if(service.isBinderAlive()){
					screenService = ((MyBind)service).getService();
				}
			}
		}, Context.BIND_AUTO_CREATE);
    	context.startService(intent);
    }
    public interface ScreenStateListener {
        void onScreenOn();

        void onScreenOff();

        void onUserPresent();
    }
}


package com.example.demo;

import com.duoku.platform.DkPlatform;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;

public class WindowActivity extends Activity {
	private Button mBtn_sure,mBtn_cancel;
	@Override
	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);
		
		win.setContentView(R.layout.activity_window);
		mBtn_sure = (Button)findViewById(R.id.btn_sure);
		mBtn_cancel = (Button)findViewById(R.id.btn_cancel);
		
		mBtn_cancel.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		
		mBtn_sure.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				DkPlatform.enterDownloadCenter(WindowActivity.this);
				finish();
			}
		});
	}
	
	@Override
	protected void onNewIntent(Intent intent) {
		// TODO Auto-generated method stub
		super.onNewIntent(intent);
		PowerManager powerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
		if(!powerManager.isScreenOn()){
			PowerManager.WakeLock lock = powerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
					|PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
			lock.acquire();
			lock.release();
		}
	}
}

package com.example.demo;

import com.example.demo.ScreenListener.ScreenStateListener;

import android.annotation.SuppressLint;
import android.app.KeyguardManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;

public class ScreenService extends Service{
	private ScreenService screenService;
	@Override
	public IBinder onBind(Intent intent) {
		return new MyBind();
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		return Service.START_REDELIVER_INTENT;
	}
	
	@Override
	public void onCreate() {
		super.onCreate();
		initRegisterListener(this);
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
		if(screenListener != null){
			screenListener.unregister();
		}
	}
	
	
	
	public class MyBind extends Binder{
		public ScreenService getService(){
			if(screenService == null){
				screenService = new ScreenService();
			}
			
			return screenService;
		}
	}
	
	private ScreenListener screenListener;
	public void initRegisterListener(final Context context) {
		screenListener = new ScreenListener(context);
		screenListener.register(new ScreenStateListener() {
			
			@Override
			public void onUserPresent() {
				Log.e("zhang", "MainActivity --> onUserPresent--> ");
			}
			
			@Override
			public void onScreenOn() {
				Log.e("zhang", "MainActivity --> onScreenOn--> ");
			}
			
			@SuppressLint("NewApi") @Override
			public void onScreenOff() {
				Log.e("zhang", "MainActivity --> onScreenOff--> ");
				KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
				if(keyguardManager.isKeyguardLocked()){
					Intent alarmIntent = new Intent(context, WindowActivity.class);
					alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
					context.startActivity(alarmIntent);
				}
			}
		});
	}

}


複製上邊的代碼,記得改註冊的要註冊,然後找個合適的地方啓動service就可以實現鎖屏彈窗了。

也可以下載代碼看下,文章只爲記錄。

Demo:http://download.csdn.net/detail/u012808234/9739872


發佈了130 篇原創文章 · 獲贊 53 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章