我想覆盖HOME按钮,其行为与Android中的BACK按钮完全相同。我在这个网站上看过类似的问题,但它们不起作用。
我正在构建一个锁屏,并且在屏幕关闭时设法在安全密码上面打开一个活动。这样,一旦用户决定重新打开屏幕,活动就会打开。
这样可行,但BroadcastReceiver
内的Service
速度非常慢。如果我足够快地点击电源按钮,活动就不会立即打开,用户可以在我的活动之前看到安全密码(这会破坏我的应用程序的目的)。
当活动开启时单击后退按钮,然后快速关闭并打开屏幕,活动也会快速打开。但是,如果我单击HOME按钮,则活动需要几秒钟才能再次启动。据我所知,这与每个按钮如何管理堆栈有关。
我已尝试使用singleTask
之类的功能,以便不重新启动活动,而只是将其移至前端。这也不起作用。我剩下要尝试的是模仿后退按钮的行为,但这可能吗?
我的接收者和服务是:
public class UpdateService extends Service {
private boolean screenOn;
@Override
public void onCreate() {
super.onCreate();
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(ScreenReceiver, filter);
}
private final BroadcastReceiver ScreenReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Intent sendToLockScreen = new Intent("android.intent.category.LAUNCHER");
sendToLockScreen.setClassName("com.XXXX", "com.XXXX");
sendToLockScreen.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
screenOn = false;
Log.i("ScreenReceiver", "SCREEN OFF");
startActivity(sendToLockScreen);
} else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
screenOn = true;
Log.i("ScreenReceiver", "SCREEN ON");
}
}
};
在我的锁屏活动下的清单中,我已将launchMode
设置为singleInstance/Task/Top
。我也试过了sendToLockScreen.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
。