从解锁屏幕android唤醒手机

时间:2015-01-20 14:56:26

标签: android alarmmanager wakelock

Hеllo,我想通过服务解锁手机。我正在使用报警管理器。 接收器和服务已添加到清单中 以及RECEIVE_BOOT_COMPLETE和WAKE_LOCK的权限 AlarmReceiver

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        setAlarms(context);
    }

    public static void setAlarms(Context context) {
        cancelAlarms(context);
        PendingIntent pIntent = createPendingIntent(context);
        Calendar calendar = Calendar.getInstance();
        setAlarm(context, calendar, pIntent);
    }

    @SuppressLint("NewApi")
    private static void setAlarm(Context context, Calendar calendar, PendingIntent pIntent) {
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
        } else {
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
        }
    }

    public static void cancelAlarms(Context context) {
                    PendingIntent pIntent = createPendingIntent(context);
                    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
                    alarmManager.cancel(pIntent);
    }

    private static PendingIntent createPendingIntent(Context context) {
        Intent intent = new Intent(context, AlarmService.class);
        return PendingIntent.getService(context, 777, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }
}

AlarmService

public class AlarmService extends Service {

    public static String TAG = AlarmService.class.getSimpleName();

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Intent alarmIntent = new Intent(getBaseContext(), MainActivity.class);
        alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        alarmIntent.putExtras(intent);
        getApplication().startActivity(alarmIntent);

        //AlarmManagerHelper.setAlarms(this);
        Log.e("SERVICE_WORKING","YEEEES!!!!");

        return super.onStartCommand(intent, flags, startId);
    }

}

MainActivity

Intent myIntent = new Intent(MainActivity.this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, myIntent, 0);
AlarmManager alarmManager=(AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis()+10000, pendingIntent);

它工作正常,但如果我锁定屏幕,它不会解锁它。

2 个答案:

答案 0 :(得分:2)

如果您只是在寻找MainActivity来显示手机何时被锁定,那么可以在onCreate()中设置窗口标志以实现此目的。

FLAG_SHOW_WHEN_LOCKED将使您的活动在手机锁定时对用户可见,如果用户未配置安全(图钉/图案/面部/等)键盘锁,则FLAG_DISMISS_KEYGUARD将解锁​​手机。

    Window window = this.getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

答案 1 :(得分:0)

您只能使用唤醒锁通过闹钟唤醒屏幕。您无法以编程方式解锁屏幕。这将绕过用户选择的安全性,这是不允许的。

另请注意,现在您使用PendingIntent警报启动Service,然后Activity启动PendingIntent。当设备处于低功率状态时,这不能保证工作。如果您需要唤醒设备,请BroadcastReceiver使用Service来获取唤醒锁并启动ServiceonReceive()然后可以采取适当的行动并释放唤醒锁。系统将确保唤醒锁定时间足够长,以便接收器的Service方法完成。它不会(也不能)从警报中启动Activity或{{1}}。