关键代码如下(主界面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();
}
}
}

解决方案 »

  1.   

    下面是后台的service
    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);
    } } } };}
      

  2.   

    程序锁是吧?开启服务时候,每一秒获取一次当前activity栈顶的第一个activity的包名,也就是当前运行的程序,判断是否是用户勾选的那个。是的话,进入一个自定义界面,自定义界面需要输入密码什么的即可。把逻辑理顺了就可以了,想不明白为什么要用系统那种锁屏,用户体验超差
      

  3.   


    我的逻辑其实很清晰,勾选了之后,启动service监听广播,如果发现有锁屏广播,则进入自己定制的锁屏界面。如果取消了勾选之后,则按锁屏按钮之后,则要恢复到原来的系统默认锁屏界面。
      

  4.   

    嗯嗯,我对锁屏程序不太了解。我想请教一下系统锁屏是系统的luncher(桌面程序或者叫启动器) 自带的吗??你那个自己写的锁屏程序是一个普通的程序吗??或者说锁屏程序其实不是普通程序,而是类似于窗口小部件,动态壁纸或者输入法之类的特殊存在?
      

  5.   

    你的service里面的onCreate和onStar周期函数里面都注册了同一个广播接收器,是不是重复了。另外键盘锁是否在关闭后有没有被打开,这些你都需要检查下。最好打一下log,仔细看log。
      

  6.   


    呵呵,谢谢了,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();  //(还有这句话呢)
    }
    }
      

  7.   

    你好,锁屏我研究得不多,但是到网上查了下资料,总结了下:
    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,这事一个很好的例子,希望对你有用~
      

  8.   

    我在第三方程序去disableKeyguard 第一执行有效,再按电源键就恢复默认了双层锁屏了。。