覆盖HOME按钮以模仿BACK按钮或更快地启动Activity

时间:2015-03-15 17:40:28

标签: android performance broadcastreceiver single-instance launchmode

我想覆盖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);

0 个答案:

没有答案