2515天 Mr.贰呆

唯一自信的就是自己的人品。
寻求王者玩家一起开黑净化峡谷环境​​

【Android】实战开发之锁屏Activity实现步骤清晰简述

发布于 / 1985 次围观 / 0 条评论 / Android / 二呆 /

Android实战开发中,锁屏App占市场已不是小数,技术上其实也已经广为流传,首先需要知道锁屏实际上只是一个Activity而已,而开发一款锁屏App大致步骤都差不多,拢共就那么几步,为更清晰的了解以下以从文件分类角度进行说明:

一、首先,清单文件AndroidManifest.xml

1、添加权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />

2、activity:

<activity
            android:name="com.example.LockActivity"
            android:launchMode="singleTask"
            android:excludeFromRecents="true" >
            <intent-filter>
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
</activity>

3、service:
<service android:name="com.example.LockService" >

4、receiver:
<receiver android:name="com.unluck.receiver.BootReceiver">
            <intent-filter android:priority="1000" >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.DEFAULT" />
                <action android:name="android.intent.action.DATE_CHANGED" />
                <action android:name="RestartSerivcesForSystemEventReceiver" />
                <action android:name="android.intent.action.MEDIA_MOUNTED" />
                <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
                <action android:name="android.intent.action.MEDIA_EJECT" />
                <data android:scheme="file" />
            </intent-filter>
</receiver>

二、开机广告接收器BootReceiver
public class BootReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        context.startService(new Intent(context,LockService.class));//此Service可在首次启动Activity中启动
    }
}

三、后台运行的锁屏服务LockService
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 com.tongleer.view.LockActivity;
/**
 * 锁屏Service,用于监听屏幕变亮或变暗事件
 * @author tongleer.com
 *
 */
public class LockService extends Service{
    private ScreenOnReceiver screenOnReceiver;
    private ScreenOffReceiver screenOffReceiver;
    @Override
    public void onCreate() {
        super.onCreate();
        screenOnReceiver=new ScreenOnReceiver();
        IntentFilter screenOnFilter=new IntentFilter();
        screenOnFilter.addAction("android.intent.action.SCREEN_ON");
        registerReceiver(screenOnReceiver, screenOnFilter);
        screenOffReceiver=new ScreenOffReceiver();
        IntentFilter screenOffFilter=new IntentFilter();
        screenOffFilter.addAction("android.intent.action.SCREEN_OFF");
        registerReceiver(screenOffReceiver, screenOffFilter);
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return Service.START_STICKY;
    }
    /**
     * 监听屏幕变亮的广播接收器,变亮就屏蔽系统锁屏
     * @author tongleer.com
     *
     */
    private class ScreenOnReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            String action=intent.getAction();
            if(action.equals("android.intent.action.SCREEN_ON")){
                /*
                 * 此方式已经过时,在activtiy中编写
                 * getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
                 * getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
                 * 两句可以代替此方式
                 */
                /*KeyguardManager keyguardManager = (KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);
                KeyguardLock lock = keyguardManager.newKeyguardLock("");
                lock.disableKeyguard();*/
            }
        }
    }
    /**
     * 监听屏幕变暗的广播接收器,变暗就启动应用锁屏界面activity
     * @author tongleer.com
     *
     */
    private class ScreenOffReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            String action=intent.getAction();
            if(action.equals("android.intent.action.SCREEN_OFF")){
                Intent i1=new Intent(context,LockActivity.class);
                i1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(i1);
            }
        }
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(screenOnReceiver);
        unregisterReceiver(screenOffReceiver);
    }
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

四、锁屏界面LockActivity

1、在onCreate中执行以下代码:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);

 2、重写onKeyDown方法并返回false使锁屏界面禁用回退键:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    return false;
}
3、如果想禁用Home键可以使用WindowManager弹出的View作为作为锁屏界面,因此,可以自定义View;否则不禁用Home键也可以,具体实现方法,已给出实现开启和关闭锁屏的工具类,至于自定义View那只能自由发挥了,不过方法肯定都是继承View或者View子类,重写onDraw和onTouchEvent等。

(1)锁屏工具类

import android.content.Context;
import android.graphics.PixelFormat;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
/**
 * 锁屏工具类
 * @author tongleer.com
 * 
 */
public class LockUtil {
    private Context mContext;
    private WindowManager mWindowManager;// 窗口管理器
    private View mLockView;// 锁屏视图
    private WindowManager.LayoutParams wmParams;
    private static LockUtil mLockUtil;
    private boolean isLocked;// 是否锁定
    public static synchronized LockUtil getInstance(Context mContext) {
        if (mLockUtil == null) {
            mLockUtil = new LockUtil(mContext);
        }
        return mLockUtil;
    }
    /**
     * 构造方法
     * @param mContext
     */
    public LockUtil(Context mContext) {
        this.mContext = mContext;
        init();
    }
    /**
     * 初始化布局
     */
    private void init() {
        isLocked = false;
        // 获取WindowManager
        mWindowManager = (WindowManager) mContext.getApplicationContext().getSystemService("window");
        // 设置LayoutParams(全局变量)相关参数
        wmParams = new WindowManager.LayoutParams();
        wmParams.type = LayoutParams.TYPE_SYSTEM_ERROR;// 关键部分
        wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明
        // 设置Window flag
        wmParams.width = WindowManager.LayoutParams.FILL_PARENT;
        wmParams.height = WindowManager.LayoutParams.FILL_PARENT;
        wmParams.flags = 1280;
    }
    /**
     * 锁屏
     */
    public synchronized void lock() {
        if (mLockView != null && !isLocked) {
            mWindowManager.addView(mLockView, wmParams);
        }
        isLocked = true;
    }
    /**
     * 解锁
     */
    public synchronized void unlock() {
        if (mWindowManager != null && isLocked) {
            mWindowManager.removeView(mLockView);
        }
        isLocked = false;
    }
    /**
     * 更新
     */
    public synchronized void update() {
        if (mLockView != null && !isLocked) {
            mWindowManager.updateViewLayout(mLockView, wmParams);
        }
    }
    /**
     * 设置锁屏视图
     * @param v
     */
    public synchronized void setLockView(View v) {
        mLockView = v;
    }
}

(2)在锁屏界面activity中创建对象并开启锁屏
private LockUtil lockLayer;
private View lockView;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    lockView = View.inflate(this, R.layout.main, null);
    lockLayer = new LockUtil(this);
    lockLayer.setLockView(lockView);// 设置要展示的页面
    lockLayer.lock();// 开启锁屏
    CustomView.setHandler(mHandler);
}
(3)从第(2)步可以发现,你的自定义View可以传一个Handler参数,方便从自定义View中传递数据到Activity中,到此为止,锁屏App大致步骤已经结束,快去做一个锁屏App吧!
sitemap