Android自己定义锁频控制程序,有个Bug急,系统默认的锁屏界面进不去了

我心飞翔.坚定不移 2012-02-10 05:28:09
我自己写了Android锁屏控制程序,思路大体是:主界面有个 设置 是否锁屏控制的按钮,勾选之后,后台会启动一个service,注册一个广播,监听screen_of行为,如果监听到则进入自己定制的锁频界面,如果没有勾选,则需要停止service。(当然需要一个sharePreference来存储上一次退出时的设置值,如果设置了,则下一次启动时,需要启动服务),我勾选上的话,能进入到自己定制的界面,但是取消勾选时,此时如果再按power键(锁屏键),应该要默认进入系统界面,但是我没有进入,反而是停留在当前的界面,好像是系统的界面被整没有了一样,忘各位童鞋给我提出好建议啊,急啊,因为实习,经验不丰富,没办法啊,在这先谢谢各位博友啦!
...全文
781 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
konglingkang 2014-06-02
  • 打赏
  • 举报
回复
看不懂 路过!!!!!!!!!!
flyword2050 2013-10-10
  • 打赏
  • 举报
回复
我在第三方程序去disableKeyguard 第一执行有效,再按电源键就恢复默认了双层锁屏了。。
  • 打赏
  • 举报
回复
问题,已经解决!
a675281873 2012-05-09
  • 打赏
  • 举报
回复
你好,看了下你的帖子发的时间比较长了,不知道你的问题解决了没有?我在做屏幕锁的时候出现了和你差不多的问题!
wolfhoo 2012-02-13
  • 打赏
  • 举报
回复
你好,锁屏我研究得不多,但是到网上查了下资料,总结了下:
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,这事一个很好的例子,希望对你有用~
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 enhancing 的回复:]

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

呵呵,谢谢了,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(); //(还有这句话呢)
}
}
wolfhoo 2012-02-11
  • 打赏
  • 举报
回复
你的service里面的onCreate和onStar周期函数里面都注册了同一个广播接收器,是不是重复了。另外键盘锁是否在关闭后有没有被打开,这些你都需要检查下。最好打一下log,仔细看log。
追风筝的孩子 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 nanzhiwen666 的回复:]
引用 4 楼 a328240784 的回复:

引用 3 楼 a328240784 的回复:
程序锁是吧?开启服务时候,每一秒获取一次当前activity栈顶的第一个activity的包名,也就是当前运行的程序,判断是否是用户勾选的那个。是的话,进入一个自定义界面,自定义界面需要输入密码什么的即可。把逻辑理顺了就可以了,想不明白为什么要用系统那种锁屏,用户体验超差
说错了,又没好好看内容。……
[/Quote]嗯嗯,我对锁屏程序不太了解。我想请教一下系统锁屏是系统的luncher(桌面程序或者叫启动器) 自带的吗??你那个自己写的锁屏程序是一个普通的程序吗??或者说锁屏程序其实不是普通程序,而是类似于窗口小部件,动态壁纸或者输入法之类的特殊存在?
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 a328240784 的回复:]

引用 3 楼 a328240784 的回复:
程序锁是吧?开启服务时候,每一秒获取一次当前activity栈顶的第一个activity的包名,也就是当前运行的程序,判断是否是用户勾选的那个。是的话,进入一个自定义界面,自定义界面需要输入密码什么的即可。把逻辑理顺了就可以了,想不明白为什么要用系统那种锁屏,用户体验超差
说错了,又没好好看内容。。。你用的是模拟器吗
[/Quote]

我的逻辑其实很清晰,勾选了之后,启动service监听广播,如果发现有锁屏广播,则进入自己定制的锁屏界面。如果取消了勾选之后,则按锁屏按钮之后,则要恢复到原来的系统默认锁屏界面。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 a328240784 的回复:]

引用 3 楼 a328240784 的回复:
程序锁是吧?开启服务时候,每一秒获取一次当前activity栈顶的第一个activity的包名,也就是当前运行的程序,判断是否是用户勾选的那个。是的话,进入一个自定义界面,自定义界面需要输入密码什么的即可。把逻辑理顺了就可以了,想不明白为什么要用系统那种锁屏,用户体验超差
说错了,又没好好看内容。。。你用的是模拟器吗
[/Quote]
呵呵。兄弟,你没好好看内容,其实就是个锁屏控制软件,我勾选了之后,能进入到自己定制的界面,自己自己定制的界面是通过触摸滑动解锁,问题是取消勾选之后,再按锁屏按钮,就不能进入到系统的锁屏界面了,为什么有这个逻辑是因为,用户的自带系统锁屏界面你不能随便屏蔽,应该要保留,不然有谁敢用你的软件。
追风筝的孩子 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a328240784 的回复:]
程序锁是吧?开启服务时候,每一秒获取一次当前activity栈顶的第一个activity的包名,也就是当前运行的程序,判断是否是用户勾选的那个。是的话,进入一个自定义界面,自定义界面需要输入密码什么的即可。把逻辑理顺了就可以了,想不明白为什么要用系统那种锁屏,用户体验超差
[/Quote]说错了,又没好好看内容。。。你用的是模拟器吗
追风筝的孩子 2012-02-10
  • 打赏
  • 举报
回复
程序锁是吧?开启服务时候,每一秒获取一次当前activity栈顶的第一个activity的包名,也就是当前运行的程序,判断是否是用户勾选的那个。是的话,进入一个自定义界面,自定义界面需要输入密码什么的即可。把逻辑理顺了就可以了,想不明白为什么要用系统那种锁屏,用户体验超差
  • 打赏
  • 举报
回复


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

}

}

};

}
  • 打赏
  • 举报
回复
关键代码如下(主界面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();
}
}
}

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧