关键代码如下(主界面Activity)
package com.sds.android.ttpod.lockScreen;import android.app.Activity;
import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;public class LockSetting extends Activity {
private final String LOCK_SCREEN_ON_OFF = "lock_screen_on_off"; private CheckBox mSetOnOff; private boolean mIsLockScreenOn; private SharedPreferences lockScreenSetting;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main);
//设置SharedPreferences变量
lockScreenSetting=this.getSharedPreferences(LOCK_SCREEN_ON_OFF, 0);
Log.d("sharePreference", lockScreenSetting.getBoolean("isLockScreen", false)+"");
//读取上一次保存的值
mIsLockScreenOn = lockScreenSetting.getBoolean("isLockScreen", false);
//如果为True,启动Service
if(mIsLockScreenOn){
final PackageManager pm = getPackageManager();
final ComponentName lockScreenService = new ComponentName(LockSetting.this, MyLockScreenService.class);
//使服务组件可用
pm.setComponentEnabledSetting(lockScreenService, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,0);
startService(new Intent(LockSetting.this, MyLockScreenService.class));
Log.d("setting true","must start service");
}
//设置控件为上一次保存的值
mSetOnOff = (CheckBox) findViewById(R.id.set_onoff);
mSetOnOff.setChecked(mIsLockScreenOn);
//状态改变时操作
mSetOnOff.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
//更新新的sharePreference值
lockScreenSetting.edit().putBoolean("isLockScreen", isChecked).commit();
Log.d("sharePreference", lockScreenSetting.getBoolean("isLockScreen", false)+"");
if (buttonView.isChecked()) {
mSetOnOff.setText("Set ttpod LockScreen ON. [Now is on]");
// final PackageManager pm = getPackageManager();
// final ComponentName lockScreenService = new ComponentName(LockSetting.this, MyLockScreenService.class);
// //使服务组件可用
// pm.setComponentEnabledSetting(lockScreenService, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,0);
//启动服务监听(锁屏控制消息)
startService(new Intent(LockSetting.this, MyLockScreenService.class));
EnableSystemKeyguard(false); } else {
// final PackageManager pm = getPackageManager();
// final ComponentName lockScreenService = new ComponentName(LockSetting.this, MyLockScreenService.class);
// //使服务组件不可用
// pm.setComponentEnabledSetting(lockScreenService, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,0);
//停止服务监听
stopService(new Intent(LockSetting.this, MyLockScreenService.class));
mSetOnOff.setText("Set ttpod LockScreen ON. [Now is off]");
EnableSystemKeyguard(true);
Log.d("test message", "StopService,the right choice is gointo the system lockScreen");
}
} }); //EnableSystemKeyguard(false);
} /**/
@Override
protected void onStart() {
super.onStart();
} @Override
protected void onStop() { super.onStop();
//获取设置控件退出时的当前值
mIsLockScreenOn = mSetOnOff.isChecked(); if (mIsLockScreenOn)
// keep on disabling the system Keyguard
EnableSystemKeyguard(false);
else {
//停止服务
stopService(new Intent(this, MyLockScreenService.class));
// final PackageManager pm = getPackageManager();
// final ComponentName lockScreenService = new ComponentName(LockSetting.this, MyLockScreenService.class);
// //使服务组件不可用
// pm.setComponentEnabledSetting(lockScreenService, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,0);
//恢复原始键盘
EnableSystemKeyguard(true);
} System.out.println("the outInformation exits in LockSetting Actinvty's Method OnStop"); //保存退出时的设置值
lockScreenSetting.edit().putBoolean("isLockScreen", mIsLockScreenOn).commit();
} private void EnableSystemKeyguard(boolean bEnable) {
//声明键盘管理器
KeyguardManager mKeyguardManager = null;
//声明键盘锁
KeyguardLock mKeyguardLock = null;
//获取键盘系统服务对象
mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
////初始化键盘锁,可以锁定或解开键盘锁
mKeyguardLock = mKeyguardManager.newKeyguardLock("");
if (bEnable)
//解开键盘锁定
mKeyguardLock.reenableKeyguard(); else {
// 禁用显示键盘锁定
mKeyguardLock.disableKeyguard();
}
}
}
package com.sds.android.ttpod.lockScreen;import android.app.Activity;
import android.app.KeyguardManager;
import android.app.KeyguardManager.KeyguardLock;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;public class LockSetting extends Activity {
private final String LOCK_SCREEN_ON_OFF = "lock_screen_on_off"; private CheckBox mSetOnOff; private boolean mIsLockScreenOn; private SharedPreferences lockScreenSetting;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.main);
//设置SharedPreferences变量
lockScreenSetting=this.getSharedPreferences(LOCK_SCREEN_ON_OFF, 0);
Log.d("sharePreference", lockScreenSetting.getBoolean("isLockScreen", false)+"");
//读取上一次保存的值
mIsLockScreenOn = lockScreenSetting.getBoolean("isLockScreen", false);
//如果为True,启动Service
if(mIsLockScreenOn){
final PackageManager pm = getPackageManager();
final ComponentName lockScreenService = new ComponentName(LockSetting.this, MyLockScreenService.class);
//使服务组件可用
pm.setComponentEnabledSetting(lockScreenService, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,0);
startService(new Intent(LockSetting.this, MyLockScreenService.class));
Log.d("setting true","must start service");
}
//设置控件为上一次保存的值
mSetOnOff = (CheckBox) findViewById(R.id.set_onoff);
mSetOnOff.setChecked(mIsLockScreenOn);
//状态改变时操作
mSetOnOff.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
//更新新的sharePreference值
lockScreenSetting.edit().putBoolean("isLockScreen", isChecked).commit();
Log.d("sharePreference", lockScreenSetting.getBoolean("isLockScreen", false)+"");
if (buttonView.isChecked()) {
mSetOnOff.setText("Set ttpod LockScreen ON. [Now is on]");
// final PackageManager pm = getPackageManager();
// final ComponentName lockScreenService = new ComponentName(LockSetting.this, MyLockScreenService.class);
// //使服务组件可用
// pm.setComponentEnabledSetting(lockScreenService, PackageManager.COMPONENT_ENABLED_STATE_ENABLED,0);
//启动服务监听(锁屏控制消息)
startService(new Intent(LockSetting.this, MyLockScreenService.class));
EnableSystemKeyguard(false); } else {
// final PackageManager pm = getPackageManager();
// final ComponentName lockScreenService = new ComponentName(LockSetting.this, MyLockScreenService.class);
// //使服务组件不可用
// pm.setComponentEnabledSetting(lockScreenService, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,0);
//停止服务监听
stopService(new Intent(LockSetting.this, MyLockScreenService.class));
mSetOnOff.setText("Set ttpod LockScreen ON. [Now is off]");
EnableSystemKeyguard(true);
Log.d("test message", "StopService,the right choice is gointo the system lockScreen");
}
} }); //EnableSystemKeyguard(false);
} /**/
@Override
protected void onStart() {
super.onStart();
} @Override
protected void onStop() { super.onStop();
//获取设置控件退出时的当前值
mIsLockScreenOn = mSetOnOff.isChecked(); if (mIsLockScreenOn)
// keep on disabling the system Keyguard
EnableSystemKeyguard(false);
else {
//停止服务
stopService(new Intent(this, MyLockScreenService.class));
// final PackageManager pm = getPackageManager();
// final ComponentName lockScreenService = new ComponentName(LockSetting.this, MyLockScreenService.class);
// //使服务组件不可用
// pm.setComponentEnabledSetting(lockScreenService, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,0);
//恢复原始键盘
EnableSystemKeyguard(true);
} System.out.println("the outInformation exits in LockSetting Actinvty's Method OnStop"); //保存退出时的设置值
lockScreenSetting.edit().putBoolean("isLockScreen", mIsLockScreenOn).commit();
} private void EnableSystemKeyguard(boolean bEnable) {
//声明键盘管理器
KeyguardManager mKeyguardManager = null;
//声明键盘锁
KeyguardLock mKeyguardLock = null;
//获取键盘系统服务对象
mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
////初始化键盘锁,可以锁定或解开键盘锁
mKeyguardLock = mKeyguardManager.newKeyguardLock("");
if (bEnable)
//解开键盘锁定
mKeyguardLock.reenableKeyguard(); else {
// 禁用显示键盘锁定
mKeyguardLock.disableKeyguard();
}
}
}
package com.sds.android.ttpod.lockScreen;import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;public class MyLockScreenService extends Service {
private final String ACT_SCREEN_OFF = "android.intent.action.SCREEN_OFF"; @Override
public IBinder onBind(Intent intent) { Log.d("", "***********onBind MyLockScreenService");
return null;
} @Override
public void onCreate() { super.onCreate();
// 注册广播监听
registerReceiver();
} public void onStart() { // 注册广播监听
registerReceiver();
} @Override
public void onDestroy() { super.onDestroy();
unregisterReceiver(mScreenBCR); Log.d("", "destroy service,unregister Receiver!"); } public void registerReceiver() { // register Broadcast
Log.d("", "***********onCreate registerReceiver");
IntentFilter intentFilter = new IntentFilter(ACT_SCREEN_OFF);
registerReceiver(mScreenBCR, intentFilter);
} // 定义一个广播接收器
private BroadcastReceiver mScreenBCR = new BroadcastReceiver() { @Override
public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACT_SCREEN_OFF)) {
try { Log.d("", "our custom lockScreen action"); // 进行自己定义的LockScreen
Intent i = new Intent();
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setClass(context, LockView.class);
context.startActivity(i); } catch (Exception e) {
// 处理异常
Log.e("", "***********onReceive Error=" + e);
} } } };}
我的逻辑其实很清晰,勾选了之后,启动service监听广播,如果发现有锁屏广播,则进入自己定制的锁屏界面。如果取消了勾选之后,则按锁屏按钮之后,则要恢复到原来的系统默认锁屏界面。
呵呵,谢谢了,service里面的onCreate和onStart周期函数里面都注册了同一个广播接收器,这个不重复的,onCreate函数只是在首次启动的时候会生效,而onStart会在每次启动service的时候会执行,所以不影响,关于这个键盘锁这个代码我有些不是很清楚,(我之前也认为是键盘锁的问题,试了试,不过没成功,我在主界面Activity LockSetting中onCheckedChanged事件中的一个else分支中(默认是要进入系统锁屏界面的,加入了一句话EnableSystemKeyguard(true)打开键盘锁)兄弟,你帮我解释一下这个代码呗(或者看看我这个代码有啥问题)://声明键盘管理器
KeyguardManager mKeyguardManager = null;//声明键盘锁
KeyguardLock mKeyguardLock = null;
//获取键盘系统服务对象
mKeyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);////初始化键盘锁,可以锁定或解开键盘锁
mKeyguardLock = mKeyguardManager.newKeyguardLock("");
if (bEnable)
mKeyguardLock.reenableKeyguard(); //解开键盘锁定(这个解释我不大确定,你帮我看看,这个具体是啥意思呢,是不是有这句话,就代表可以进入系统锁屏界面了)else {
// 禁用显示键盘锁定
mKeyguardLock.disableKeyguard(); //(还有这句话呢)
}
}
1. 关于锁屏需要以下权限:
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
2. 锁屏涉及到同步问题,对disableKeyguard和reenableKeyguard的操作需要同步,需要将这两个操作放到一个synchronized方法中去操作。
如果会用svn的话去这个地址下载有关锁屏的项目好好研究下:http://mylockforandroid.googlecode.com/svn,这事一个很好的例子,希望对你有用~