在android中创建自定义LockScreen

时间:2014-02-24 09:20:34

标签: android lockscreen

我正在开发自定义锁屏应用程序在4.0以下但4.0以上正常工作,当我们按下主页按钮应用程序stops.is有任何解决方案,这个没有应用程序将停止按下主页按钮,直到解锁屏幕。(如去更衣室app)

5 个答案:

答案 0 :(得分:12)

开发LockScreen应用程序的另一种方法是使用视图,让我解释一下。

首先,您可以通过禁用KEYGUARD来禁用某些设备的系统锁定屏幕:

((KeyguardManager)getSystemService(Activity.KEYGUARD_SERVICE)).newKeyguardLock("IN").disableKeyguard();

您应该将这行代码放在Service

之后,您可以在每次屏幕关闭时启动活动:

public class AutoStart extends BroadcastReceiver {

    public void onReceive(Context arg0, Intent arg1) {
        if(arg1.getAction().equals("android.intent.action.SCREEN_OFF")) {
            Intent localIntent = new Intent(arg0, LockScreen.class);
            localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            localIntent.addFlags(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
            arg0.startActivity(localIntent);
        }
    }
}

如果你阅读了WindowManager.LayoutParams.TYPE_SYSTEM_ERROR的文档,它解释了一种内部系统错误窗口,它们可以显示在所有内容之上。在多用户系统中,仅在拥有用户的窗口中显示。

所以现在你在所有事情上都有一个活动,但按下HOME按钮将退出活动。

这是视图出现的地方。您可以从布局资源中提升视图,并将其作为WindowManager添加到TYPE_SYSTEM_ERROR,因此将在所有内容之上。由于您可以控制何时删除此查看,因此最好的地方位于onDestroy的{​​{1}},因为按下Activity按钮只会暂停您的活动,视图仍然可见。

HOME

为避免显示通知栏,我添加了标志public WindowManager winManager; public RelativeLayout wrapperView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WindowManager.LayoutParams localLayoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.TYPE_SYSTEM_ERROR, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); this.winManager = ((WindowManager)getApplicationContext().getSystemService(WINDOW_SERVICE)); this.wrapperView = new RelativeLayout(getBaseContext()); getWindow().setAttributes(localLayoutParams); View.inflate(this, R.layout.lock_screen, this.wrapperView); this.winManager.addView(this.wrapperView, localLayoutParams); } public void onDestroy() { this.winManager.removeView(this.wrapperView); this.wrapperView.removeAllViews(); super.onDestroy(); } 以使用所有指针事件。

不要忘记将这两行添加到您的清单中:

FLAG_NOT_FOCUSABLE | FLAG_NOT_TOUCH_MODAL | FLAG_LAYOUT_IN_SCREEN

从这里你只需添加锁屏应用程序的逻辑,让用户使用他的智能手机:)

答案 1 :(得分:0)

自定义启动器基本上是一个应用程序(你可以使它的行为像网格,列表,实现你自己的拖放等)然后,你只需要将这些行添加到主活动的intent过滤器,这个完成后,在安装应用程序并按主页按钮后,您的应用程序将显示在可用主屏幕列表中。

<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />

我无法找到更换锁定屏幕的方法,并且在手机上禁用锁定屏幕并使用自定义启动器中的活动等黑客实际上并未取代锁定屏幕^^

答案 2 :(得分:0)

您可以使用以下方法在Android中禁用Home键:

@Override
public void onAttachedToWindow() {
    this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);
    super.onAttachedToWindow();
}

答案 3 :(得分:0)

我正在使用三星Galaxy S4 5.0进行开发,对我有用的只是将getWindow().setFlags(..)更改为getWindow().addFlags(..)

答案 4 :(得分:0)

我认为首先你应该问自己是否真的想要劫持主键。有时你可能想要它。但我认为将应用程序放置在Android锁定屏幕上,让主键正常运行并让底层Android锁定屏幕处理密码保护设备是您在很多情况下实际需要的(除非您想要更改默认情况下这样做。) 最重要的是,让应用程序显示在Android锁定屏幕上非常接近于编写自己的自定义锁定屏幕。由于您不必自己管理密码,因此非常容易。更不用说它更安全,更可靠,因为你没有劫持主键 我这样做了,效果很好。您可以在此处查看详细信息:

show web site on Android lock screen

问题是关于在锁定屏幕上显示一个网站,因为这是我感兴趣的,但答案更一般,它适用于任何应用程序。 您可以在此处看到Google Play上的应用,其编写方式如下:

https://play.google.com/store/apps/details?id=com.a50webs.intelnav.worldtime