前两天尝试使用『悦跑圈』app跑步,发现一个蛮有意思的功能。手机锁屏之后,再点亮手机,手机锁屏界面变成了悦跑圈的界面,并且实时显示跑步的里程、速度等信息。觉得这个功能还蛮实用的,于是想试着实现一下。搜索了一些资料,具体实现过程如下:
1. 首先,锁屏界面是一个单独的界面,新建一个Activity作为锁屏界面。对这个Activity需要有几个设置。
1)背景透明,解锁滑动时背后的内容能够显示出来
2)取代系统的锁屏界面
3)不响应返回键,手机已解锁之后进入app此界面不会展示
4)右滑解锁
Activity代码如下,
public class ScreenLockActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //屏蔽系统的锁屏界面,将此activity设置为锁屏界面 this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); setContentView(R.layout.activity_screen_lock); setRightSlide(); } //右滑解锁 private void setRightSlide(){ SlidrConfig config = new SlidrConfig.Builder() .position(SlidrPosition.LEFT) .sensitivity(1f) .scrimColor(Color.BLACK) .scrimStartAlpha(0.8f) .scrimEndAlpha(0f) .velocityThreshold(2400) .distanceThreshold(0.5f) .build(); Slidr.attach(this, config); } @Override protected void onUserLeaveHint() { //用户手动点击Home键或者手动切换app时,此方法会被调用,在这里销毁掉此界面。 this.finish(); super.onUserLeaveHint(); } @Override public void onBackPressed() { // super.onBackPressed(); 屏蔽返回按钮 } }其中的右滑解锁,其实就是销毁掉activity,右滑销毁功能来自一个第三方库: Slidr 可以实现滑动返回功能,用起来也很方便。
背景透明在activity的Theme里设置,具体就不贴代码了。
2. 需要监听手机锁屏,当监听到手机锁屏时才创建锁屏界面,可以用一个Service来监听锁屏。service部分代码如下:
@Override public void onCreate() { super.onCreate(); screenLockReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { Intent lockScreen = new Intent(ScreenLockService.this, ScreenLockActivity.class); lockScreen.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(lockScreen); } } }; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(screenLockReceiver, filter); }在service里监听锁屏广播,当锁屏时开启锁屏界面。