轉載請標明出處http://blog.csdn.net/mingyue_1128
一、首先要創建一個Service保證Service一直開啓,同時不被一鍵清理掉。
二、屏蔽掉系統的鎖屏
三、創建鎖屏的Activity,在Activity中屏蔽掉back,menu,home鍵
四、保證自己的進程不在最近任務中出現
一、創建一個Service名字爲LockService
public class LockService extends Service{
private KeyguardManager km;
private KeyguardLock kk;
private BroadcastReceiver broadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent arg1) {
Log.e("-----可以跳到鎖屏界面--------", "---------");
Intent intent=new Intent(context,LockActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
};
@Override
public IBinder onBind(Intent arg0) {
return null;
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
//服務裏面收到關閉屏幕的動作就發送廣播
IntentFilter iFilter=new IntentFilter(Intent.ACTION_SCREEN_OFF);
this.registerReceiver(broadcastReceiver, iFilter);
}
@Override
public void onCreate() {
super.onCreate();
//屏蔽掉系統的鎖屏
km=(KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
kk=km.newKeyguardLock("");
kk.disableKeyguard();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
在Service中與他合作的還有一個廣播,當監聽到屏幕關的時候,service就會發送廣播,使屏幕開的時候爲自己鎖屏界面
三、鎖屏界面中屏蔽掉menu,home,back
public class LockActivity extends Activity{
private static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
private Button btn_open;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);//關鍵代碼
setContentView(R.layout.activity_main);
//解鎖的按鈕
btn_open=(Button) findViewById(R.id.open);
btn_open.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
finish();
}
});
}
@SuppressWarnings("static-access")
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==event.KEYCODE_BACK){
return true;
}
if(keyCode==event. KEYCODE_HOME){
return true;
}
if(keyCode == KeyEvent.KEYCODE_MENU) {//MENU鍵
//監控/攔截菜單鍵
return true;
}
return super.onKeyDown(keyCode, event);
}
}
保證自己的鎖屏程序不在最近進程中出現,只需要在註冊鎖屏界面的Activity時,添加一個屬性android:excludeFromRecents="true",如下
<activity
android:name="com.mm.wallpaper.LockActivity"
android:launchMode="singleInstance"
android:excludeFromRecents="true">
<intent-filter>
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
四、我們需要看一下主界面怎麼處理
public class MainActivity extends Activity {
MyBroadcast receiveBroadCast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//註冊廣播
receiveBroadCast = new MyBroadcast();
IntentFilter filter = new IntentFilter();
filter.addAction("action"); // 只有持有相同的action的接受者才能接收此廣播
registerReceiver(receiveBroadCast, filter);
//發送廣播
Intent intent=new Intent();
intent.setAction("action");
this.sendBroadcast(intent);
}
public class MyBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
KeyguardManager km = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardLock kk = km.newKeyguardLock("");
kk.disableKeyguard();
//開始服務
Intent service=new Intent();
service.setClass(context,LockService.class);//稍後再定義
context.startService(service);
}
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unregisterReceiver(receiveBroadCast);
}
}
在這裏我們需要註冊一個廣播保證服務的開啓
在配置清單中MainActivity需要多一個屬性來保證程序始終在
<category android:name="android.intent.category.HOME"/>
整個的流程大概如此,希望對想做解鎖軟件的朋友有所幫助。