一 实验代码(部分)
meactivity
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.annotation.SuppressLint;
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.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.WindowManager;
import android.widget.RelativeLayout;
@SuppressWarnings("deprecation")
public class MEActivity extends Activity {
private static final String LOCK_TAG = null;
private boolean isopent = false;
private Camera camera;
public static int MSG_LOCK_SUCESS = 1;
public static int MY_PHONE = 2;
public static int MY_SSM = 3;
public static int MY_TROCH = 4;
public static final int FLAG_HOMEKEY_DISPATCHED = 0x80000000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setFlags(FLAG_HOMEKEY_DISPATCHED, FLAG_HOMEKEY_DISPATCHED);//关键代码
setContentView(R.layout.activity_main);
//调用方法
mylockview();
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE); //对锁屏进行管理
KeyguardLock keyguardLock = keyguardManager.newKeyguardLock(LOCK_TAG);
keyguardLock.disableKeyguard(); //执行应用时隐藏锁屏
startService(new Intent(MEActivity.this, ZdLockService.class));
//this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
}
@SuppressLint("HandlerLeak")
public Handler mHandler =new Handler (){
public void handleMessage(Message msg){
if(MSG_LOCK_SUCESS == msg.what)
{
Intent i= new Intent(Intent.ACTION_MAIN);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //提示如果是服务里调用,必须加入new task标识
i.addCategory(Intent.CATEGORY_HOME);
startActivity(i);
kg();
finish();
}
if(MY_PHONE == msg.what)
{
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(intent);
kg();
finish();
}
if(MY_SSM == msg.what)
{
Intent intent = new Intent();
ComponentName comp = new ComponentName("com.android.mms",
"com.android.mms.ui.ConversationList");
intent.setComponent(comp);
intent.setAction("android.intent.action.VIEW");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
startActivity(intent);
kg();
finish();
}
if(MY_TROCH == msg.what)
{
if(!isopent)
{
camera = Camera.open();
Parameters params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
isopent = true;
}
else
{
camera.stopPreview();
camera.release();
isopent = false;
}
}
}
};
public void mylockview()
{ //定义一个空间,用于放置图像,
@SuppressWarnings("unused")
WindowManager winManager=(WindowManager)getSystemService(Context.WINDOW_SERVICE);
RelativeLayout layout=(RelativeLayout) findViewById(R.id.root);
final DrawView view=new DrawView(this);
layout.addView(view); //将view添加到activtymain
view.setMainHandler(mHandler);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
//屏蔽back键
public boolean onKeyDown(int keyCode ,KeyEvent event){
if(event.getKeyCode() == KeyEvent.KEYCODE_BACK)
return true ;
else
return super.onKeyDown(keyCode, event);
}
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
Log.d("Focus debug", "Focus changed !");
if(!hasFocus) {
Log.d("Focus debug", "Lost focus !");
Intent closeDialog = new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
closeDialog.putExtra("reason", "globalactions");//可避免关机对话框被关闭
sendBroadcast(closeDialog);
}
}
public void kg()
{
if(!isopent)
{
}
else
{
camera.stopPreview();
camera.release();
isopent = false;
}
}
}
在本段测试代码中
首先是锁屏,锁屏当然按键就不能用了,所以就要添加命令屏蔽,当前activity运行时就不会锁屏
在app 中要屏蔽home 键的activity 中,只需要添加该标志就可以了
getWindow().addFlags(WindowManager.LayoutParams.FLAG_HOMEKEY_DISPATCHED);
注意:以上代码要加在setContentView()之前才行;
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE); 新建它对锁屏进行管理。平时打开应用则将要把锁屏隐蔽,则会用到 keyguardLock.disableKeyguard();
定义一个mylockview(),用来放置锁屏图像,getSystemService(Context.WINDOW_SERVICE)根据系统的WINDOW_SERVICE窗口服务,获取管理打开的窗口程序,将锁屏的view 添加的activity。在锁屏时返回键是不能用的,所以还要屏蔽掉返回键。
还有在锁屏中添加一些快捷应用,拨打电话,短信。
当然在开机时手机会自动锁屏,所以就要有监听手机是否开启
BootBroadcastReceiver
public class BootBroadcastReceiver extends BroadcastReceiver {
static final String ACTION = "android.intent.action.BOOT_COMPLETED";//监听手机开机
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION)){
Intent sayHelloIntent=new Intent(context,MEActivity.class);
sayHelloIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(sayHelloIntent);//执行sayhello
}
}
}
除去开机,还有熄屏亮屏都会锁屏所以
ZdLockService
public class ZdLockService extends Service {
private static String TAG = "ZdLockService";
private Intent zdLockIntent = null ;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
public void onCreate(){
super.onCreate();
zdLockIntent = new Intent(ZdLockService.this , MEActivity.class);
zdLockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
/*注册 屏幕唤醒时的广播*/
IntentFilter mScreenOnFilter = new IntentFilter("android.intent.action.SCREEN_ON");
ZdLockService.this.registerReceiver(mScreenOnReceiver, mScreenOnFilter);
/*注册 屏幕锁屏时的广播*/
IntentFilter mScreenOffFilter = new IntentFilter("android.intent.action.SCREEN_OFF");
ZdLockService.this.registerReceiver(mScreenOffReceiver, mScreenOffFilter);
}
public int onStartCommand(Intent intent , int flags , int startId){
return super.onStartCommand(intent, flags, startId);
//return Service.START_STICKY;
}
public void onDestroy(){
super.onDestroy();
ZdLockService.this.unregisterReceiver(mScreenOnReceiver);
ZdLockService.this.unregisterReceiver(mScreenOffReceiver);
//在此重新启动
startService(new Intent(ZdLockService.this, ZdLockService.class));
}
private KeyguardManager mKeyguardManager = null ;
@SuppressWarnings("deprecation")
private KeyguardManager.KeyguardLock mKeyguardLock = null ;
//屏幕变亮的广播,隐藏默认的锁屏界面
private BroadcastReceiver mScreenOnReceiver = new BroadcastReceiver(){
@Override
public void onReceive(Context context , Intent intent) {
Log.i(TAG, intent.getAction());
if(intent.getAction().equals("android.intent.action.SCREEN_ON")){
Log.i(TAG, "----------------- android.intent.action.SCREEN_ON------");
}
}
};
//屏幕变暗/变亮的广播 , 我们要调用KeyguardManager类相应方法去解除屏幕锁定
private BroadcastReceiver mScreenOffReceiver = new BroadcastReceiver(){
@SuppressWarnings("deprecation")
@Override
public void onReceive(Context context , Intent intent) {
String action = intent.getAction() ;
Log.i(TAG, intent.toString());
if(action.equals("android.intent.action.SCREEN_OFF")
|| action.equals("android.intent.action.SCREEN_ON") ){
mKeyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
mKeyguardLock = mKeyguardManager.newKeyguardLock("zdLock 1");
mKeyguardLock.disableKeyguard();
startActivity(zdLockIntent);
}
}
};
}
activity_main.xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/root"
>
</RelativeLayout>
虽然是空的,但会将锁屏界面直接导入进来。