Android LockScreen (锁屏弹窗)

时间:2023-03-10 01:47:47
Android LockScreen (锁屏弹窗)

在要弹窗的Activity需要进行以下设置,才可以在锁屏状态下弹窗

    @Override
protected void onCreate(Bundle 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); //打开屏幕
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

AndroidManifest.xml文件当中,对该activity的声明需要加上以下属性:

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

在MainActivity:

public class MainActivity extends Activity {
IntentFilter intentFilter;
LocalBroadcastManager localBroadcastManager;
LocalBroadcastReceiver localBroadcastReceiver; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Thread thread =new Thread(
new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(5000);
Log.i("send", "send ok");
Intent intent = new Intent("com.example.stuart.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
} );
thread.start();//模拟5秒自动发送广播 localBroadcastManager =LocalBroadcastManager.getInstance(this);
intentFilter =new IntentFilter();
intentFilter.addAction("com.example.stuart.LOCAL_BROADCAST");
localBroadcastReceiver =new LocalBroadcastReceiver();
localBroadcastManager.registerReceiver(localBroadcastReceiver,intentFilter); } public void check_lock(){ // KeyguardManager km = (KeyguardManager) this.getSystemService(Context.KEYGUARD_SERVICE);
// if (km.isKeyguardLocked()) {
// Intent intent =new Intent("com.example.stuart.LOCAL_BROADCAST");
// intent .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// localBroadcastManager.sendBroadcast(intent);
//
// }
// Thread thread =new Thread(
// new Runnable() {
// @Override
// public void run() {
// try {
// Thread.sleep(5000);
// Intent intent =new Intent("com.example.stuart.LOCAL_BROADCAST");
// localBroadcastManager.sendBroadcast(intent);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//
// }
// }
//
//
//
// );
// thread.start(); }
class LocalBroadcastReceiver extends BroadcastReceiver{ @Override
public void onReceive(Context context, Intent intent) {
Log.d("LOG_TAG", intent.getAction());
KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
if (km.isKeyguardLocked()) {
Intent alarmIntent = new Intent(context, AlarmActivity.class);
alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(alarmIntent);
}
}
}

我们设置的是锁屏下才弹窗的,非锁屏下就不适合弹出这个窗口了(你可以试一下,效果会很怪)。一般是注册一个广播接收器,在接收到指定广播之后判断是否需要弹窗,所以在BroadcastReceiver的接收代码中需要先判断是否为锁屏状态下:

这里用到的是KeyguardManager类,用来管理锁屏的,4.1之后该类的API新增了一个isKeyguardLocked()的方法判断是否锁屏,但在4.1之前,我们只能用inKeyguardRestrictedInputMode()方法,如果为true,即为锁屏状态。需要注意的是,在广播中启动Activity的context可能不是Activity对象,所以需要添加NEW_TASK的标志,否则启动时可能会报错。

再次亮起屏幕

如果该Activity并未退出,但是被手动按了锁屏键,当前面的广播接收器再次去启动它的时候,屏幕并不会被唤起,所以我们需要在activity当中添加唤醒屏幕的代码,这里用的是电源锁。可以添加在onNewIntent(Intent intent),因为它会被调用。也可以添加在其他合适的生命周期方法

PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
if (!pm.isScreenOn()) {
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP |
PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
wl.acquire();
wl.release();
}

权限

<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

参考:http://blog.****.net/maosidiaoxian/article/details/40587935

http://bbs.****.net/topics/390425777