實現鎖屏彈窗效果我使用的是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