Android获取系统隐藏服务实现锁屏
实现原理:当按锁屏键时,会发出一个广播,当界面接收到一个广播就可以实现锁频。我们可以调用IDevicePolicyManager服务中的lockNow方法来发送一个广播实现锁屏。
IDevicePolicyManager是被系统隐藏掉的,需要通过反射还获取此服务。
步骤:
1.创建MyAdmin的广播接收者继承DeviceAdminReceiver
2.通过反射,获取IDevicePolicyManager服务 ,IDevicePolicyManager通过AIDL来获取出来。
3.注册广播接收者为admin设备
4.获取服务中的方法
效果图:
注册MyAdmin广播接收者:
<receiver android:name=".MyAdmin">
<meta-data android:name="android.app.device_admin"
android:resource="@xml/my_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
my_admin.xml:
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<watch-login />
<reset-password />
<force-lock />
<wipe-data />
</uses-policies>
</device-admin>
反射获取服务、注册权限、实现锁屏:
public class LockActivity extends Activity {
IDevicePolicyManager mService;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
//锁屏
public void lock(View view){
try {
//通过反射获取到sdk隐藏的服务
Method method = Class.forName("android.os.ServiceManager")
.getMethod("getService", String.class);
IBinder binder = (IBinder) method.invoke(null,//激活服务
new Object[] { Context.DEVICE_POLICY_SERVICE });
mService = IDevicePolicyManager.Stub.asInte易做图ce(binder);
//定义组件的名字
ComponentName mAdminName = new ComponentName(this, MyAdmin.class);
//注册权限
if (mService != null) {
//判断自定义的广播接受者 是不是被注册成deviceadmin的权限
if (!mService.isAdminActive(mAdminName)) {
Intent intent = new Intent(
DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,
mAdminName);
startActivity(intent);
}
//调用服务实现锁屏
mService.lockNow();
//设置解锁密码
mService.resetPassword("123", 0);
}
&nb
补充:移动开发 , Android ,