自定义锁定屏幕应用程序中的android锁定问题

Pet*_*ter 5 android

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

相反,一旦首次安装应用程序,首先启动的服务似乎正在运行.当用户首次关闭手机屏幕时,当他们将手机重新打开时,会看到我的应用程序在顶部运行,并且可以使用我的应用程序解锁手机.但是一旦进入Android操作系统,如果用户按下主页按钮,下次他们关闭屏幕并重新打开而不是被带回我的应用程序,他们会被带到股票解锁屏幕,我的应用程序打开它下面,什么时候它应该在顶部.

这是我的代码:

我的服务:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的广播接收器:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

jai*_*vis 2

我尝试编译您的代码并得到您所说的相同错误。我尝试修改它使其工作,终于出现问题了!

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

通过对广播接收器类的更改,我能够克服这个问题

尝试一下,如果有任何问题请告诉我。

编辑:我认为问题可能出在finish()方法上......Android在需要内存时转储应用程序......我认为finish()可能会帮助android垃圾化应用程序(这可能是你的问题随机发生的原因)