我构建了一个自定义的锁屏应用程序,它使用广播接收器和服务来监听用户何时打开或关闭屏幕,并从那里启动我的活动。该活动应该完全取代锁屏。为了做到这一点,我的应用程序应该禁用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);
}
}
我启动的活动基本上是空的,只有一个解锁按钮,按下时调用完成();
。
我试着编译你的代码,却得到了和你说的一样的错误。我试图修改它,使其工作,最终得到了问题!!!
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破坏应用程序(这可能就是你的问题随机出现的原因)
键盘保护相关逻辑的行为可能因设备而异。这是因为锁屏通常由设备制造商定制(即非库存),其中一些尊重您使用的键盘保护逻辑,一些则不尊重。
此外,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