(4)第一个单机项目手机锁----------Service的实现

news/2023/12/5 6:36:40

本来想将一个个java代码都说明一遍的,但是仔细一想有点啰嗦。这里实现service后,整个项目就结束了。至于定时锁屏的界面就不再贴一章了,有仔细的注释说明,大家自行阅读吧。


首先,常驻后台的服务   LockService

贴上代码,从代码分析

package com.example.mylock;/** 锁屏服务,在这里启动锁屏和解锁* 判断时间与日期等等一系列都在这里完成*/import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;import android.app.AlarmManager;
import android.app.PendingIntent;
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 lockService extends Service {private Context MyContext;private static getDataFromSp gdfs;//SP对象private String day, time[];private boolean flag = false, clockFlag = false;public IBinder onBind(Intent arg0) {return null;}public void onCreate() {super.onCreate();init();/* 注册屏幕唤醒时的广播 */setLock();   //---------------下面的几行代码貌似并无卵用IntentFilter mScreenOnFilter = new IntentFilter("android.intent.action.SCREEN_ON");lockService.this.registerReceiver(mScreenReceiver, mScreenOnFilter);/* 注册机器锁屏时的广播 */IntentFilter mScreenOffFilter = new IntentFilter("android.intent.action.SCREEN_OFF");lockService.this.registerReceiver(mScreenReceiver, mScreenOffFilter);reStartService();}public int onStartCommand(Intent intent0, int flags, int startId) {/* 注册屏幕唤醒时的广播 */init();setLock();IntentFilter mScreenOnFilter = new IntentFilter("android.intent.action.SCREEN_ON");lockService.this.registerReceiver(mScreenReceiver, mScreenOnFilter);/* 注册机器锁屏时的广播 */IntentFilter mScreenOffFilter = new IntentFilter("android.intent.action.SCREEN_OFF");lockService.this.registerReceiver(mScreenReceiver, mScreenOffFilter);System.out.println("lockservicedakaile");return START_STICKY;}public void onDestroy() {super.onDestroy();this.unregisterReceiver(mScreenReceiver);startService(new Intent(lockService.this, lockService.class));//----服务关闭前重启服务}public void init() {   //实例化对象MyContext = getApplicationContext();gdfs = new getDataFromSp(MyContext);time = new String[5];getDataFromSp();}/** 然后从相应的SP文件中获取相应模式的时间和日期 1*/public void getDataFromSp() {day = gdfs.getDayOfWeek();time[0] = gdfs.getOneTime();time[1] = gdfs.getTwoTime();time[2] = gdfs.getThreeTime();time[3] = gdfs.getFourTime();time[4] = gdfs.getFiveTime();}//判断日期是否为空public boolean dayIsNull() {   if (day.equals("")) {return false;}return true;}//判断时间段是否为空,参数是代表第X个时间段public boolean timeIsNull(int i) {if (time[i].equals("")) {return false;}return true;}/** 将获取到的日期和时间与系统日期比较 注意要将SP文件中获取的时间转换成可比较的时间 如果日期在设定的日期内并且时间在设定的时间内,返回true*/public boolean compareTimeAndDay() {Log.v("判断定时函数", "进来了");if (dayIsNull()) {Log.v("判断日期不空", "进来了");for (int i = 0; i < 5; i++) {if (timeIsNull(i)) { // 如果该时间段不空的话,进去判断时间是否符合,符合就锁,超过时间段就解锁。int _time[] = gdfs.getTimeOfNum(i + 1);// 获取第i个时间段的整型时间Log.v("定时时间段不空", "进来了");boolean day_flag = false;long t = System.currentTimeMillis();Date date = new Date(t);SimpleDateFormat format = new SimpleDateFormat("E");String weekDay = format.format(date);format = new SimpleDateFormat("hh");String hour = format.format(date);format = new SimpleDateFormat("mm");String minute = format.format(date);Log.v("时:分", hour + ":" + minute);Log.v("星期", weekDay);if (day.length() == 2) {if (day.equals(weekDay)) { // 判断星期的字符串是否匹配,如果匹配,将标志设为trueLog.v("文件星期", day);day_flag = true;}} else {for (int j = day.length() - 2; j >= 2; j = j - 2) {String d = day.substring(j, j + 2);if (d.equals(weekDay)) { // 判断星期的字符串是否匹配,如果匹配,将标志设为trueLog.v("文件星期", d);day_flag = true;break;}}}if (day_flag) {// 时间段不空,并且星期也匹配。// 通过获取时间判断是上午还是下午long time = System.currentTimeMillis();final Calendar mCalendar = Calendar.getInstance();mCalendar.setTimeInMillis(time);int apm = mCalendar.get(Calendar.AM_PM);// 值为0 上午 值为1 下午Log.v("上下午", String.valueOf(apm));// 如果是上午if (apm == 0) {// 如果时间到了设定的锁屏时间Log.v("上午", "匹配了");if (_time[0] == Integer.parseInt(hour)&& _time[1] == Integer.parseInt(minute)) {long time_sum = 0; // 将定时锁屏转换成快速锁屏// 下面的代码是通过时间段获取锁屏的时长if (_time[3] > _time[1]) { //time_sum += (_time[3] - _time[1]);time_sum += (_time[2] - _time[0]) * 60;} else if (_time[3] == _time[1]) {time_sum += (_time[2] - _time[0]) * 60;} else if (_time[3] < _time[1]) {time_sum += (_time[3] + 60 - _time[1]);time_sum += (_time[2] - _time[0] - 1) * 60;}// 保存锁屏时长gdfs.saveClockLockTime(time_sum);// 设置定时锁屏标志位truegdfs.setClockStatusToTrue();// 锁屏次数加一gdfs.setLockNum();// 锁屏时长增加gdfs.setLockTime_long(time_sum);return true;}}// 如果是下午,hour需要加上12else if (apm == 1) {Log.v("下午", "匹配了");// 如果时间到了设定的锁屏时间if (_time[0] == (Integer.parseInt(hour) + 12)&& _time[1] == Integer.parseInt(minute)) {long time_sum = 0; // 将定时锁屏转换成快速锁屏// 下面的代码是通过时间段获取锁屏的时长if (_time[3] > _time[1]) { //time_sum += (_time[3] - _time[1]);time_sum += (_time[2] - _time[0]) * 60;} else if (_time[3] == _time[1]) {time_sum += (_time[2] - _time[0]) * 60;} else if (_time[3] < _time[1]) {time_sum += (_time[3] + 60 - _time[1]);time_sum += (_time[2] - _time[0] - 1) * 60;}// 将定时锁屏的时长保存到SP中Log.v("锁屏时长", String.valueOf(time_sum));// 锁屏次数+1,总的锁屏时长增加gdfs.saveClockLockTime(time_sum);;gdfs.setLockNum();// 设置定时锁屏时长gdfs.setLockTime_long(time_sum);// 将应该结束锁屏的时-分保存gdfs.setStopClockLockTimeOfHour(_time[2]);gdfs.setStopClockLockTimeOfMinute(_time[3]);gdfs.setClockStatusToTrue();return true;}}long _t = gdfs.getClockLockTime();Log.v("定时解锁时间", String.valueOf(_t));// 每过一分钟服务重启的时间时间减去1if (gdfs.getClockLockTime() > 0 && clockFlag&& gdfs.getStatus()) {gdfs.saveClockLockTime(gdfs.getClockLockTime() - 1);return true;}}}}}return false;}//设置快速锁屏方法,比定时锁屏简单多了public boolean compareFastLockTime() {long time = gdfs.getFastLockTime();Log.v("快速解锁时间", String.valueOf(time));// 每次减去一分钟,因为每过一分钟服务就会自动重启,会进到这里if (gdfs.getFastLockTime() > 0) {if (time > 0 && flag) {gdfs.saveFastLockTime(time - 1);}return true;} elsereturn false;}/** 如果系统日期跟设定的日期匹配,而且时间匹配,启动锁屏 启动lockActivity*/public void setLock() {// 如果时间-日期都准确,并且定时锁屏的标志值为true并且定时锁屏的开关为true,启动锁屏if (this.compareTimeAndDay() && gdfs.getClockStatus()&& gdfs.getStatus()) {Intent i = new Intent(MyContext, startLockWinService.class);i.setAction(startLockWinService.LOCK_ACTION);MyContext.startService(i);// 启动之后将定时锁屏标志值为FALSEgdfs.setClockStatusToFalse();Log.v("锁屏启动", "定时锁屏");} else if (this.compareFastLockTime() && gdfs.getFastStatus()) {Log.v("快速锁", "快速锁上了");Intent i = new Intent(MyContext, startLockWinService.class);i.setAction(startLockWinService.FAST_LOCK_ACTION);MyContext.startService(i);// 启动之后将快速锁屏标志值为FALSEgdfs.setFastStatusToFalse();} else if ((gdfs.getFastLockTime() == 0)&& (gdfs.getClockLockTime() == 0)) {// 重置解锁计数gdfs.setCloseClockNumber(0);gdfs.setCloseFastNumber(0);Intent i = new Intent(MyContext, startLockWinService.class);i.setAction(startLockWinService.UNLOCK_ACTION);//解锁MyContext.startService(i);}}/** 利用定时器检测服务是否在启动,每隔1分钟更新一次。如果不在启动则重启服务。*/public void reStartService() {Intent intent = new Intent(this, lockService.class);PendingIntent sender = PendingIntent.getService(this, 0, intent, 0);AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);alarm.setRepeating(AlarmManager.RTC_WAKEUP, 0, 60 * 1000, sender);flag = true;clockFlag = true;}// 定义一个广播接受者,用于动态接听亮屏和息屏广播private BroadcastReceiver mScreenReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {// 获取当前的动作String action = intent.getAction();// 如果亮屏,启动lockAcivity
}
}

真正启动悬浮窗口实现锁屏的服务  startLockWinService


package com.example.mylock;import android.app.AlarmManager;
import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.os.IBinder;
import android.text.TextUtils;
import android.util.Log;
import android.view.WindowManager.LayoutParams;
import android.view.*;/** 这个服务是启动悬浮窗口的服务,由lockService启动,* 在启动这个服务的时候需要传递活动是锁屏还是解锁*/
public class startLockWinService extends Service {private Context mContext;private WindowManager mWinMng;private LockView screenView = null;private Intent zdLockIntent = null;private KeyguardManager mKeyguardManager = null;@SuppressWarnings("deprecation")private KeyguardManager.KeyguardLock mKeyguardLock = null;// 自定义action作为启动或者关闭活动的标志public static final String LOCK_ACTION = "lock";//定时锁public static final String UNLOCK_ACTION = "unlock";//解锁public static final String FAST_LOCK_ACTION = "fastLock";//快速锁public IBinder onBind(Intent intent) {return null;}public void onCreate() {super.onCreate();// 如果窗口还没设置,获取一堆实例mContext = getApplicationContext();mWinMng = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);mKeyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);// 关闭系统的屏保,以免多重锁mKeyguardLock = mKeyguardManager.newKeyguardLock("");mKeyguardLock.disableKeyguard();zdLockIntent = new Intent(startLockWinService.this,startLockWinService.class);zdLockIntent.setAction(startLockWinService.LOCK_ACTION);zdLockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);reStartService();}public void onDestroy() {super.onDestroy();startService(zdLockIntent);}public int onStartCommand(Intent intent, int flags, int startId) {if (intent != null) {String action = intent.getAction();// 如果启动的活动是锁屏,添加viewif (TextUtils.equals(action, LOCK_ACTION)) {addView();getDataFromSp gdfs = new getDataFromSp(mContext);final long time = gdfs.getClockLockTime() * 60 * 1000;//锁屏时长,分钟*60*1000位锁屏的毫秒长度new Thread() {public void run() {Intent intent = new Intent(startLockWinService.this,startLockWinService.class);intent.setAction(startLockWinService.UNLOCK_ACTION);PendingIntent sender = PendingIntent.getService(startLockWinService.this, 0, intent, 0);AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);alarm.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + time, sender);// X豪秒后执行时钟// 解锁}}.start();}else if (TextUtils.equals(action, FAST_LOCK_ACTION)) {addView();getDataFromSp gdfs = new getDataFromSp(mContext);final long time = gdfs.getFastLockTime() * 60 * 1000;new Thread() {public void run() {Intent intent = new Intent(startLockWinService.this,startLockWinService.class);intent.setAction(startLockWinService.UNLOCK_ACTION);PendingIntent sender = PendingIntent.getService(startLockWinService.this, 0, intent, 0);AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);alarm.set(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + time, sender);// X秒后执行// 解锁}}.start();}// 如果是解锁去除viewelse if (TextUtils.equals(action, UNLOCK_ACTION)) {Log.v("解锁", "定时解锁了");getDataFromSp gdfs = new getDataFromSp(mContext);gdfs.saveFastLockTime(0);gdfs.setFastStatusToTrue();gdfs.saveClockLockTime(0);gdfs.setClockStatusToTrue();removeView();}}return Service.START_STICKY;}public void reStartService() {//为了确保解锁,我们设置时钟60秒重启这个服务,其实用处不大。有lockService足够了Intent intent = new Intent(this, startLockWinService.class);PendingIntent sender = PendingIntent.getService(this, 0, intent, 0);AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);alarm.setRepeating(AlarmManager.RTC_WAKEUP, 0, 60 * 1000, sender);}public void addView() {if (screenView == null) {     //创建悬浮窗口screenView = new LockView(mContext);LayoutParams param = new LayoutParams();param.type = 2010;// 窗口在最上层param.format = PixelFormat.RGBA_8888;param.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;param.gravity = Gravity.TOP;// 窗口的宽和高param.width = LayoutParams.MATCH_PARENT;param.height = LayoutParams.MATCH_PARENT;mWinMng.addView(screenView, param);}}//销毁窗口public void removeView() {if (screenView != null) {mWinMng.removeView(screenView);screenView = null;}}
}

开机广播接受者  bootBroadcastReceiver  

package com.example.mylock;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;public class bootBroadcastReceiver extends BroadcastReceiver
{static final String ACTION = "android.intent.action.BOOT_COMPLETED";  public void onReceive(Context p1, Intent p2){//将定时锁屏和快速锁屏的标志设置为true;getDataFromSp gdfs = new getDataFromSp(p1);gdfs.setFastStatusToTrue();gdfs.setClockStatusToTrue();//获取系统现在的时间long t=System.currentTimeMillis();  Date date=new Date(t);  SimpleDateFormat format = new SimpleDateFormat("HH");int hour = Integer.parseInt(format.format(date));format = new SimpleDateFormat("mm");int minute =  Integer.parseInt(format.format(date));//更改锁屏时长,重新启动锁屏时减去关机的时长。if(gdfs.getClockLockTime() > 0){//每次重启都添加一次计数int num = gdfs.getCloseClockNumber();gdfs.setCloseClockNumber(num+1);//获取应该解锁的时间int Ch = gdfs.getStopClockLockTimeOfHour();int Cm = gdfs.getStopClockLockTimeOfMinute();//重新计算解锁时间long newTime = 0;if(Cm >= minute){newTime += (Cm - minute);newTime += (Ch - hour)*60;} else if(Cm < minute){newTime += (Cm + 60 - minute);newTime += (Ch - 1 - hour)*60;}   Log.v("应锁时长", String.valueOf(newTime));if(newTime > 0)gdfs.saveClockLockTime(newTime);else    gdfs.saveClockLockTime(0);}if(gdfs.getFastLockTime() > 0){int num = gdfs.getCloseFastNumber();gdfs.setCloseFastNumber(num+1);int Ch = gdfs.getStopFastLockTimeOHour();int Cm = gdfs.getStopFastLockTimeOfMinute();long newTime = 0;if(Cm >= minute){newTime += (Cm - minute);newTime += (Ch - hour)*60;} else if(Cm < minute){newTime += (Cm + 60 - minute);newTime += (Ch - 1 - hour)*60;} Log.v("应锁时长", String.valueOf(newTime));if(newTime > 0)gdfs.saveFastLockTime(newTime);elsegdfs.saveFastLockTime(0);}if((gdfs.getCloseClockNumber() > 9)) {gdfs.setUnLockNum();gdfs.saveClockLockTime(0);}if((gdfs.getCloseFastNumber() > 9)) {gdfs.saveFastLockTime(0);//解锁次数++gdfs.setUnLockNum();}Intent i = new Intent(p1,lockService.class);p1.startService(i);Log.v("开机自动启动", "快启动了");}}


为了方便直接阅读源码,我这里给出代码调用的流程图



当年完成了之后发现几个bug-------------------------

android8.0以上系统不再支持广播功能-------失效!

部分安卓7.0以上的手机来电显示等等悬浮窗口级别太高并且不可逾越-----锁屏失效

源码下载      https://download.csdn.net/download/wanmingjking/10454655


http://www.ppmy.cn/news/366767.html

相关文章

SpringBoot+mybatisPlus + dynamic-datasource实现真正的动态切换数据源(附核心代码)

文章目录 前言创建主库生成mapper等代码定义新数据源创建初始化runner类创建Mybatis配置类 前言 系统要调整为S A S S版实现多 租 户功能&#xff0c;首先想到的两个解决方案就是&#xff1a; 1、通过表字段隔离租户数据信息 2、通过分库来隔离租户数据&#xff08;这种方案还…

SpringBatch从入门到实战(四):表结构

batch_job_instance -> batch_job_execution/batch_job_execution_params -> batch_job_execution_context 一&#xff1a;batch_job_instance 作业实例 同一个作业&#xff0c;同一套作业参数 唯一标识一条记录&#xff0c;首次启动时插入一条数据。 字段描述JOB_IN…

bff服务编排

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

.NET中使用HtmlSanitizer来有效的防范XSS攻击!

0X00 前言 随着互联网的发展&#xff0c;网络安全问题越来越受到关注。XSS攻击作为最常见的网络安全漏洞之一&#xff0c;对企业和用户的信息安全构成严重威胁。.NET开发人员可以使用HtmlSanitizer来有效防范XSS攻击&#xff0c;确保网站的安全性。 HtmlSanitizer是一个.NET开…

ChatGPT与Web的完美结合:创造一加一大于二的化学反应

怎么介绍Web&#xff1f; Web&#xff0c;全称World Wide Web&#xff0c;是互联网上的一种基于文本传输协议&#xff08;HTTP&#xff09;的网络服务系统&#xff0c;一言以蔽之就是&#xff0c;通过互联网进行全球范围内的信息交流与共享。 更简单易懂的表述就是&#xff0c;…

RK3288 Android8.1添加lvds以及gt9触摸屏(二)

现在先说gt9触摸屏如何配置 首先拿到硬件厂商提供的cfg以及gt9xx文件夹 驱动源码路径&#xff1a;kernel/drivers/input/touchscreen/gtxx 注&#xff1a;可以自己定义最后把gt9xx.h以及gt9xx.c文件放在哪&#xff0c;放在哪就在makefile里指定对应位置 1.touchscreen文件夹…

4399小游戏怎样下载到本地玩

首先感谢吾爱作者iamcjsyr提供的方法 原帖地址https://www.52pojie.cn/thread-646029-1-1.html 1.打开4399小游戏官网选择你喜欢的游戏并打开 2.F12 切换到网络&#xff08;network&#xff09;选项卡 点击开始游戏 并输入swf进行过滤 3.选择较大的swf文件&#xff0c;我弄…

【python】小游戏-下载即可玩

首先我们需要先下载pycharm&#xff0c;随后我们winR 调出命令控制行 大家可以下载pycharm后&#xff0c;winr 输入cmd 调出命令控制行&#xff0c;随后输入 pip install freegames 安装游戏 pip install freegames 下载好后会跳出来这样的页面 (后带翻译),由于我提前安装完了…

工厂方法模式(五)

过气的&#xff0c;终究是过气了 上一章简单介绍了工厂模式(四), 如果没有看过,请观看上一章 一.工厂方法模式 工厂方法模式&#xff0c;通过定义工厂父类负责定义创建对象的公共接口&#xff0c;而子类则负责生成具体的对象。 将类的实例化&#xff08;具体产品的创建&…

Android的服务Service

Android学了太久了&#xff0c;都忘了。复习下四大组件之一的Service。 介绍 Android的Service是一种在后台执行长时间运行操作的组件&#xff0c;它可以在没有用户界面的情况下执行任务&#xff0c;并且可以与应用程序的其他组件进行通信。Service通常用于处理网络请求、音乐…

JVM、JDK 和 JRE 有什么区别?

JVM&#xff08;Java Virtual Machine&#xff09;、JDK&#xff08;Java Development Kit&#xff09;和JRE&#xff08;Java Runtime Environment&#xff09;是Java平台的三个核心组件&#xff0c;它们在Java开发和运行环境中扮演着不同的角色&#xff0c;具有以下区别&…

《项目实战》 Jenkins 与 CICD、发布脚本

前言 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行&#xff08;这个比较抽象&#xff0c;暂且写上&#xff0c;不做解释…

Surface渲染流程解析:如何实现车载智能座舱的高质量图像显示?

SurfaceFlinger简介 SurfaceFlinger是Android系统中负责图形渲染和显示的一个系统服务&#xff0c;SurfaceFlinger负责将来自多个应用程序的屏幕缓冲区组合成单个屏幕缓冲区&#xff0c;并将最终结果输出到系统的显示设备上。SurfaceFlinger在Android系统中是一个非常重要的服…

AUTOSAR知识点 之 XCP (二):XCP基础概念

目录 1、概述 2、概念解读 2.1、MCD-X(X= 1\2\3) 2.2、CTO与DTO 2.3、Polling模式 2.4、E

敏捷实践 | 8个实用方法助你开好有效的敏捷反思会

又是年底&#xff0c;各大app都推出各种年度总结&#xff0c;年度回顾。这些总结有的很有趣&#xff0c;有的很扎心&#xff0c;在推动年底KPI完成的同时&#xff0c;也给我们带来不同角度的思考。而在敏捷工作方法中&#xff0c;反思回顾也是敏捷实践很关键的一环。那么我们如…

166. 分数到小数 Python

文章目录 一、题目描述示例 1示例 2示例 3 二、代码三、解题思路 一、题目描述 给定两个整数&#xff0c;分别表示分数的分子 numerator 和分母 denominator&#xff0c;以 字符串形式返回小数 。 如果小数部分为循环小数&#xff0c;则将循环的部分括在括号内。 如果存在多…

计算机错误 爱普生,爱普生打印机的常见故障及解决方法

一般的电脑用户都会遇到打印机的各种毛病,下面就让学习啦小编为大家介绍一下关于爱普生激光打印机常见的故障详细解答吧,欢迎大家参考和学习。 一,6200/6200L维修注意 与6100/6100L相比,6200/6200L的碳粉盒增加了CSIC芯片,更换碳粉后无需在驱动里进行重新设置;硒鼓没有芯片…

epson连接计算机后无法打印,电脑连接爱普生打印机后无法打印如何解决

一位用户说电脑连接爱普生打印机后无法打印了&#xff0c;现在上班族需要通过打印机来下载工作的材料&#xff0c;无论生活还是办公已经离不开打印机设备了。但是打印机会出现不能使用的问题&#xff0c;如何解决呢&#xff1f;针对此故障问题&#xff0c;接下去一起看下详细教…

爱普生r390打印机如何清零

爱普生r390打印机清零的步骤是&#xff1a;1.打开打印机前面板上的“Power”按钮&#xff1b;2.按住“Feed”按钮&#xff1b;3.按下“Power”按钮&#xff1b;4.松开“Feed”按钮&#xff1b;5.打印机会出现“Reset”消息&#xff1b;6.按下“Enter”按钮以完成清零。

兄弟打印机内存已满清零方法_打印机是如何清零的?兄弟打印机清零方法

每一台喷墨打印机的废墨仓都会有超容的时候,一旦超容,打印机就会报错,而等待维修的日子里,是不能再进行打印操作的。如果非要自己来修理,就需要对打印机进行清零操作,而不同的打印机清零步骤大同小异,请参见下文了解兄弟打印机清零方法。 打印机为什么要清零? 废墨仓再…
最新文章