从解锁屏幕 android 唤醒 phone
Wake phone from unlock screen android
大家好,我想用服务解锁phone。我正在使用警报管理器。
接收器和服务已添加到清单
以及 RECEIVE_BOOT_COMPLETE 和 WAKE_LOCK 的权限
报警接收器
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);
}
}
报警服务
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);
}
}
主要活动
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);
它工作正常,但如果我锁定屏幕,它不会解锁。
您只能使用唤醒锁通过闹钟唤醒屏幕。您无法以编程方式解锁屏幕。这将绕过用户选择的安全性,这是不允许的。
另外,请注意,现在您正在使用带有闹钟的 PendingIntent
启动 Service
,进而启动 Activity
。当设备处于低功耗状态时,这不能保证工作。如果您需要唤醒设备,请将 PendingIntent
用于 BroadcastReceiver
,这反过来需要一个唤醒锁并启动您的 Service
。然后 Service
可以采取适当的行动并释放唤醒锁。系统将确保唤醒锁保持足够长的时间,以便接收方的 onReceive()
方法完成。它不会(也不能)对从警报启动 Service
或 Activity
做同样的事情。
如果您只是想在 phone 锁定时显示 MainActivity,可以在 onCreate() 中设置 Window 标志来实现这一点。
FLAG_SHOW_WHEN_LOCKED 将使您的 activity 在 phone 被锁定时对用户可见,FLAG_DISMISS_KEYGUARD 将解锁 phone 如果用户尚未配置安全 (pin/pattern/face/etc) 键盘锁。
Window window = this.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
大家好,我想用服务解锁phone。我正在使用警报管理器。 接收器和服务已添加到清单 以及 RECEIVE_BOOT_COMPLETE 和 WAKE_LOCK 的权限 报警接收器
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);
}
}
报警服务
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);
}
}
主要活动
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);
它工作正常,但如果我锁定屏幕,它不会解锁。
您只能使用唤醒锁通过闹钟唤醒屏幕。您无法以编程方式解锁屏幕。这将绕过用户选择的安全性,这是不允许的。
另外,请注意,现在您正在使用带有闹钟的 PendingIntent
启动 Service
,进而启动 Activity
。当设备处于低功耗状态时,这不能保证工作。如果您需要唤醒设备,请将 PendingIntent
用于 BroadcastReceiver
,这反过来需要一个唤醒锁并启动您的 Service
。然后 Service
可以采取适当的行动并释放唤醒锁。系统将确保唤醒锁保持足够长的时间,以便接收方的 onReceive()
方法完成。它不会(也不能)对从警报启动 Service
或 Activity
做同样的事情。
如果您只是想在 phone 锁定时显示 MainActivity,可以在 onCreate() 中设置 Window 标志来实现这一点。
FLAG_SHOW_WHEN_LOCKED 将使您的 activity 在 phone 被锁定时对用户可见,FLAG_DISMISS_KEYGUARD 将解锁 phone 如果用户尚未配置安全 (pin/pattern/face/etc) 键盘锁。
Window window = this.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);