当前位置: 首页 > 知识库问答 >
问题:

自定义锁屏应用中的Android锁问题

皇甫逸清
2023-03-14

我构建了一个自定义的锁屏应用程序,它使用广播接收器和服务来监听用户何时打开或关闭屏幕,并从那里启动我的活动。该活动应该完全取代锁屏。为了做到这一点,我的应用程序应该禁用android股票锁,以便我的应用程序可以作为新的锁屏。

相反,一旦应用程序第一次安装,服务第一次启动,应用程序似乎就开始工作了。当用户第一次关闭手机屏幕时,当他们再次打开手机屏幕时,他们会看到我的应用程序在上面运行,并且可以用我的应用程序解锁手机。但是,一旦进入android操作系统,如果用户下次关闭屏幕并重新打开它时按下home按钮,而不是被带回到我的应用程序,他们就会被带到stock unlock屏幕,我的应用程序在其下方打开,而它应该在顶部。

这是我的代码:

我的服务:

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {

        super.onCreate();
        Log.d("MyService","Service STARTED");
        final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        final BroadcastReceiver mReceiver = new ScreenReceiver();
        registerReceiver(mReceiver, filter);
    }
}

我的广播接收器:

public class ScreenReceiver extends BroadcastReceiver {

public static ArrayList<String> runningApplications = new ArrayList<String>();
private Context ctext;
public static boolean screenIsLocked;
public static KeyguardManager keyguardManager;
public static KeyguardLock lock;

@Override
public void onReceive(final Context context, final Intent intent) {
    ctext = context;
    keyguardManager = (KeyguardManager)ctext.getSystemService(Activity.KEYGUARD_SERVICE);
    lock = keyguardManager.newKeyguardLock(Context.KEYGUARD_SERVICE);
    lock.disableKeyguard();


    if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
        screenIsLocked = true;
        Log.d("ScreenReceiver", "False");

        Intent intenti = new Intent();
        intenti.setClass(context, starterActivity.class);
        intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intenti);


    } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
        screenIsLocked = false;
        Log.d("ScreenReceiver", "True");

                    Intent intenti = new Intent();
                    intenti.setClass(context, starterActivity.class);
                    intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    context.startActivity(intenti);
    }
}

我启动的活动基本上是空的,只有一个解锁按钮,按下时调用完成();

共有2个答案

诸葛阳成
2023-03-14

我试着编译你的代码,却得到了和你说的一样的错误。我试图修改它,使其工作,最终得到了问题!!!

public class ScreenReceiver extends BroadcastReceiver {

    public static ArrayList<String> runningApplications = new ArrayList<String>();
    private Context ctext;
    public static boolean screenIsLocked;
    public static KeyguardManager keyguardManager;
    public static KeyguardLock lock;

    @Override
    public void onReceive(final Context context, final Intent intent) {
        ctext = context;
        keyguardManager = (KeyguardManager)ctext.getSystemService(Activity.KEYGUARD_SERVICE);
        lock = keyguardManager.newKeyguardLock(Context.KEYGUARD_SERVICE);
        lock.disableKeyguard();


        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            screenIsLocked = true;
            Log.d("ScreenReceiver", "False");

            Intent intenti = new Intent();
            intenti.setClass(context, starterActivity.class);
            intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intenti);


        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            screenIsLocked = false;
            Log.d("ScreenReceiver", "True");

                        Intent intenti = new Intent();
                        intenti.setClass(context, starterActivity.class);
                        intenti.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                        intenti.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        context.startActivity(intenti);
        }
    }

与此改变广播接收机类我是能够克服的问题

试试看,如果有什么问题就告诉我。

编辑:我认为问题可能在于finish()方法。。。。Android会在需要内存时转储应用程序。。。我认为finish()可能有助于android破坏应用程序(这可能就是你的问题随机出现的原因)

董元徽
2023-03-14

键盘保护相关逻辑的行为可能因设备而异。这是因为锁屏通常由设备制造商定制(即非库存),其中一些尊重您使用的键盘保护逻辑,一些则不尊重。

此外,afaik控制键盘保护的新方法是使用窗口标志:

// inside activity
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
        | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

但这并不能解决问题,设备对此仍有发言权。

例如,根据我的经验,Galaxy Nexus会在键盘护卫上方显示你的活动窗口,但不会关闭它(你会认为谷歌品牌的设备应该尊重这个标志,嗯),因此,如果你在活动中点击后退按钮——你会得到标准的锁屏——而HTC One X似乎能正确处理解除部分:你的活动窗口将导致标准锁屏按预期解除。

我没有办法强迫所有设备正常工作。Android API并不是为了让你能够创建自定义锁屏(至少目前不是这样)。看看店里的那些——它们都有同样的问题,就是不够稳定。

正如Dianne Hackborn在谷歌集团的回答中所说,你在这方面所能做的任何事情都是一种黑客行为,所以期待它会不时爆发。

 类似资料:
  • 我开发了一个自定义的锁屏应用程序。基本上,当屏幕关闭时,应用程序将启动并解锁股票锁定屏幕,然后当屏幕打开时,用户将看到我的自定义锁定屏幕。到目前为止工作得很好,直到最近我发现,有时当我按下主页按钮时,屏幕会快速闪烁一次,当这种情况发生时,它会使我的自定义锁屏失败。当屏幕打开时,股票锁定屏幕将出现,我的自定义锁定屏幕只有在用户解锁股票锁定屏幕后才会显示。有人知道这个问题吗?或者任何建议?提前感谢。

  • 问题内容: 所以,我一直在探索很多类似的问题,跨网站(这个,这个和这个,还有更多)。想要实现自己的自定义锁定屏幕的人(不是在谈论小部件)。到目前为止,用户正在使用两种实现技术。 主屏幕更换 。在这种技术中,建议创建一个主屏幕应用程序,在解锁逻辑之后,将显示默认屏幕。我认为在这种情况下,开发人员必须在可见锁定屏幕时禁用“主页”,“搜索”,“菜单”和“后退”按钮,并实现“屏幕关闭”逻辑。 一个应用程序

  • 所以,我一直在网站上探索许多类似的问题(这个,这个,这个,还有更多)。人们想要实现自己的自定义锁屏(而不是小部件)。到目前为止,用户正在使用两种实现技术。 > 主屏幕替换。在这种技术中,建议创建一个主屏幕应用程序,在其中解锁逻辑后显示默认屏幕。我相信在这种情况下,当锁屏可见时,开发人员必须禁用主页、搜索、菜单和返回按钮,并实现屏幕关闭逻辑。 申请书。在这种技术中,一个普通的应用程序会在解锁逻辑后显

  • 我正在编写一个应用程序来管理或自定义Android设备的解锁屏幕。它的工作原理如下: 用户使用电源按钮锁定屏幕。 用户尝试解锁屏幕,从而再次按下电源按钮 我的活动弹出--屏幕仍然锁定 用户回答问题,如果答案正确,屏幕解锁 我已经为第三步创建了一个活动,并将以下代码添加到其方法中: 这工作正常,完全符合我的期望。我的问题是第四步。我已经搜索并找到了许多解决方案,但没有一个适合我。 如何以编程方式锁定

  • 我试图做一个自定义锁屏应用程序,但我不确定我是否以正确的方式去做。我有一个广播接收器,当屏幕打开时收听,并开始我的锁屏活动。此接收器注册在服务中,该服务也禁用默认锁定屏幕。 问题是,在屏幕打开和锁屏活动显示之间有一点延迟。我该怎么做才能让它马上出现呢? 我的服务代码: 而接收者:

  • 问题内容: 如何创建充当Android手机锁的锁屏应用程序。我确实找到了一个,但是它的代码构造不佳,如果按下物理主键,它会解锁,从而使应用程序变得毫无意义。 我确实遇到了一个论坛,指出在Android 4.x中已删除了一些阻止主页按钮功能的方法 但是,对于锁屏,我有一个很棒的想法,但没有开始的基础。如果有人对此主题有任何了解,我很想听听。 谢谢大家:-) 问题答案: 是的,有可能。 这是来自Git