2024年Android最新Android 短信加密,联系人字母侧边栏定位,模具项目工程师面试经验

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

public MmsLockMsg(int id, int thread_id, long address, long date,int type,String body,String name) {

this._id = id;

this.thread_id = thread_id;

this.address = address;

this.date = date;

this.type =type;

this.body = body;

this.name = name;

}

public MmsLockMsg(int thread_id, long address, long date,int type, String body,String name) {

this.thread_id = thread_id;

this.address = address;

this.date = date;

this.type =type;

this.body = body;

this.name = name;

}

public int getId() {

return _id;

}

public int getThreadId() {

return thread_id;

}

public void setThreadId(int thread_id) {

this.thread_id = thread_id;

}

public long getAddress() {

return address;

}

public void setAddress(long address) {

this.address = address;

}

public long getDate() {

return date;

}

public void setDate(long date) {

this.date = date;

}

public int getType(){

return type;

}

public void setType(int type){

this.type=type;

}

public String getBody() {

return body;

}

public void setBody(String body) {

this.body = body;

}

public String getName(){

return name;

}

public void setName(String name){

this.name = name;

}

}

设置手势密码页:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.Typeface;

import android.graphics.Paint.Cap;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.TextView;

public class MmsLockSetPwd extends View {

TextView tv_forget_pwd = (TextView)findViewById(com.android.mms.R.id.zj_lock_forget_pwd);

Paint linePaint = new Paint();

Paint whiteLinePaint = new Paint();

Paint textPaint = new Paint();

Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.lock);

int defaultBitmapRadius = defaultBitmap.getWidth() / 2;

Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.indicator_lock_area);

int selectedBitmapDiameter = selectedBitmap.getWidth();

int selectedBitmapRadius = selectedBitmapDiameter / 2;

PointInfo[] points = new PointInfo[9];

PointInfo startPoint = null;

int width, height;

int moveX, moveY;

boolean isUp = false;

Context ctx;

StringBuffer lockString = new StringBuffer();

public MmsLockSetPwd(Context context) {

super(context);

ctx = context;

// this.setBackgroundColor(Color.WHITE);

initPaint();

}

public MmsLockSetPwd(Context context, AttributeSet attrs) {

super(context, attrs);

// this.setBackgroundColor(Color.WHITE);

tv_forget_pwd.setVisibility(View.GONE); //zj add

initPaint();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

width = getWidth();

height = getHeight();

if (width != 0 && height != 0) {

initPoints(points);

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

super.onLayout(changed, left, top, right, bottom);

}

private int startX = 0, startY = 0;

@Override

protected void onDraw(Canvas canvas) {

// canvas.drawText(“passwd:” + lockString, 0, 40, textPaint);

if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) {

// drawLine(canvas, startX, startY, moveX, moveY);

}

drawNinePoint(canvas);

super.onDraw(canvas);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

boolean flag = true;

if (isUp) {

finishDraw();

flag = false;

} else {

handlingEvent(event);

flag = true;

}

return flag;

}

private void handlingEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_MOVE:

moveX = (int) event.getX();

moveY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(moveX, moveY)

&& temp.isSelected() == false) {

temp.setSelected(true);

startX = temp.getCenterX();

startY = temp.getCenterY();

int len = lockString.length();

if (len != 0) {

int preId = lockString.charAt(len - 1) - 48;

points[preId].setNextId(temp.getId());

}

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_DOWN:

int downX = (int) event.getX();

int downY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(downX, downY)) {

temp.setSelected(true);

startPoint = temp;

startX = temp.getCenterX();

startY = temp.getCenterY();

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_UP:

startX = startY = moveX = moveY = 0;

isUp = true;

invalidate();

savePwd();

break;

default:

break;

}

}

private void finishDraw() {

for (PointInfo temp : points) {

temp.setSelected(false);

temp.setNextId(temp.getId());

}

lockString.delete(0, lockString.length());

isUp = false;

invalidate();

}

private void initPoints(PointInfo[] points) {

int len = points.length;

int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4;

int seletedX = seletedSpacing;

int seletedY = height - width + seletedSpacing;

int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius;

int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius;

for (int i = 0; i < len; i++) {

if (i == 3 || i == 6) {

seletedX = seletedSpacing;

seletedY += selectedBitmapDiameter + seletedSpacing;

defaultX = seletedX + selectedBitmapRadius

  • defaultBitmapRadius;

defaultY += selectedBitmapDiameter + seletedSpacing;

}

points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY);

seletedX += selectedBitmapDiameter + seletedSpacing;

defaultX += selectedBitmapDiameter + seletedSpacing;

}

}

private void initPaint() {

initLinePaint(linePaint);

initTextPaint(textPaint);

initWhiteLinePaint(whiteLinePaint);

}

/**

  • @param paint

*/

private void initTextPaint(Paint paint) {

textPaint.setTextSize(30);

textPaint.setAntiAlias(true);

textPaint.setTypeface(Typeface.MONOSPACE);

}

/**

  • @param paint

*/

private void initLinePaint(Paint paint) {

//paint.setColor(Color.GRAY);

paint.setColor(Color.parseColor(“#1E90FF”));

//paint.setStyle(Style.STROKE);

paint.setStyle(Style.FILL);

paint.setStrokeWidth(10);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

/**

  • @param paint

*/

private void initWhiteLinePaint(Paint paint) {

//paint.setColor(Color.WHITE);

paint.setColor(Color.parseColor(“#1E90FF”));

paint.setStrokeWidth(8);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

/**

  • @param canvas

*/

private void drawNinePoint(Canvas canvas) {

if (startPoint != null) {

drawEachLine(canvas, startPoint);

}

for (PointInfo pointInfo : points) {

if (pointInfo != null) {

if (pointInfo.isSelected()) {

canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),

pointInfo.getSeletedY(), null);

}else{ // zj add

canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(),

pointInfo.getDefaultY(), null);

}

}

}

}

/**

  • @param canvas

  • @param point

*/

private void drawEachLine(Canvas canvas, PointInfo point) {

if (point.hasNextId()) {

int n = point.getNextId();

drawLine(canvas, point.getCenterX(), point.getCenterY(),

points[n].getCenterX(), points[n].getCenterY());

drawEachLine(canvas, points[n]);

}

}

/**

  • @param canvas

  • @param startX

  • @param startY

  • @param stopX

  • @param stopY

*/

private void drawLine(Canvas canvas, float startX, float startY,

float stopX, float stopY) {

canvas.drawLine(startX, startY, stopX, stopY, linePaint);

canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint);

}

/**

  • @author zkwlx

*/

private class PointInfo {

private int id;

private int nextId;

private boolean selected;

private int defaultX;

private int defaultY;

private int seletedX;

private int seletedY;

public PointInfo(int id, int defaultX, int defaultY, int seletedX,

int seletedY) {

this.id = id;

this.nextId = id;

this.defaultX = defaultX;

this.defaultY = defaultY;

this.seletedX = seletedX;

this.seletedY = seletedY;

}

public boolean isSelected() {

return selected;

}

public void setSelected(boolean selected) {

this.selected = selected;

}

public int getId() {

return id;

}

public int getDefaultX() {

return defaultX;

}

public int getDefaultY() {

return defaultY;

}

public int getSeletedX() {

return seletedX;

}

public int getSeletedY() {

return seletedY;

}

public int getCenterX() {

return seletedX + selectedBitmapRadius;

}

public int getCenterY() {

return seletedY + selectedBitmapRadius;

}

public boolean hasNextId() {

return nextId != id;

}

public int getNextId() {

return nextId;

}

public void setNextId(int nextId) {

this.nextId = nextId;

}

/**

  • @param x

  • @param y

*/

public boolean isInMyPlace(int x, int y) {

boolean inX = x > seletedX

&& x < (seletedX + selectedBitmapDiameter);

boolean inY = y > seletedY

&& y < (seletedY + selectedBitmapDiameter);

return (inX && inY);

}

}

public String getPwd() {

return lockString.toString();

}

public void savePwd() {

Intent intent = new Intent();

SharedPreferences shareDate = ctx.getSharedPreferences(“GUE_PWD”, 0);

boolean isSetFirst = shareDate.getBoolean(“IS_SET_FIRST”, false);

if (isSetFirst) {

String pwd = this.getPwd();

String first_pwd = shareDate.getString(“FIRST_PWD”, “HAVE NO PWD”);

if (pwd.equals(first_pwd)) {

shareDate.edit().clear().commit();

shareDate.edit().putBoolean(“IS_SET”, true).commit();

shareDate.edit().putString(“GUE_PWD”, pwd).commit();

intent.setClass(ctx, MmsLockSetPwdOk.class);

} else {

shareDate.edit().putBoolean(“SECOND_ERROR”, true).commit();

intent.setClass(ctx, MmsLock.class);

}

} else {

shareDate.edit().clear().commit();

shareDate.edit().putString(“FIRST_PWD”, this.getPwd()).commit();

shareDate.edit().putBoolean(“IS_SET_FIRST”, true).commit();

intent.setClass(ctx, MmsLock.class);

}

ctx.startActivity(intent);

((Activity) ctx).finish();

}

}

手势密码设置成功后,让用户输入字符密保,以防遗忘手势密码:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import android.app.Activity;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.os.Bundle;

import android.view.View;

import android.view.Window;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

public class MmsLockSetPwdOk extends Activity {

//private TextView showInfo;

private EditText secondPwd;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

//this.requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(com.android.mms.R.layout.mms_lock_res);

//showInfo = (TextView)findViewById(com.android.mms.R.id.res_info);

//SharedPreferences shareDate = getSharedPreferences(“GUE_PWD”, 0);

//String pwd = shareDate.getString(“GUE_PWD”, “HAVE NO PWD !”);

// showInfo.setText("密码是: "+pwd);

//showInfo.setText(com.android.mms.R.string.zj_set_pwd_tip);

}

public void saveSecondPwd(View v){

secondPwd = (EditText)findViewById(com.android.mms.R.id.second_pwd);

String secondStr = secondPwd.getText().toString();

if(secondStr!= null && secondStr.trim().length() != 0){

//获取SharedPreferences对象

// Context ctx = MainActivity.this;

SharedPreferences secondShare = getSharedPreferences(“SECOND_PWD”, MODE_PRIVATE);

//存入数据

Editor editor = secondShare.edit();

editor.putString(“SECOND_KEY”, secondStr);

editor.putBoolean(“SECOND_IS_SET”, true);

editor.commit();

Toast.makeText(this, com.android.mms.R.string.zj_set_pwd_success, Toast.LENGTH_SHORT).show();

finish();

}else{

Toast.makeText(this, com.android.mms.R.string.zj_pwd_null, Toast.LENGTH_SHORT).show();

}

}

}

MmsLockCheckPwd.java:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Typeface;

import android.graphics.Paint.Cap;

import android.graphics.Paint.Style;

//import android.os.Vibrator; // zj Cancel

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.TextView;

public class MmsLockCheckPwd extends View {

TextView tv_forget_pwd = (TextView) findViewById(com.android.mms.R.id.zj_lock_forget_pwd);

Paint linePaint = new Paint();

Paint whiteLinePaint = new Paint();

Paint textPaint = new Paint();

Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.lock);

int defaultBitmapRadius = defaultBitmap.getWidth() / 2;

Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.indicator_lock_area);

int selectedBitmapDiameter = selectedBitmap.getWidth();

int selectedBitmapRadius = selectedBitmapDiameter / 2;

PointInfo[] points = new PointInfo[9];

PointInfo startPoint = null;

int width, height;

int moveX, moveY;

boolean isUp = false;

Context ctx;

StringBuffer lockString = new StringBuffer();

public MmsLockCheckPwd(Context context) {

super(context);

ctx = context;

// this.setBackgroundColor(Color.WHITE);

initPaint();

}

public MmsLockCheckPwd(Context context, AttributeSet attrs) {

super(context, attrs);

// this.setBackgroundColor(Color.WHITE);

tv_forget_pwd.setVisibility(View.VISIBLE); // zj add

initPaint();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

width = getWidth();

height = getHeight();

if (width != 0 && height != 0) {

initPoints(points);

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

super.onLayout(changed, left, top, right, bottom);

}

private int startX = 0, startY = 0;

@Override

protected void onDraw(Canvas canvas) {

// canvas.drawText(“passwd:” + lockString, 0, 40, textPaint);

if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) {

// drawLine(canvas, startX, startY, moveX, moveY);

}

drawNinePoint(canvas);

super.onDraw(canvas);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

boolean flag = true;

if (isUp) {

finishDraw();

flag = false;

} else {

handlingEvent(event);

flag = true;

}

return flag;

}

private void handlingEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_MOVE:

moveX = (int) event.getX();

moveY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(moveX, moveY)

&& temp.isSelected() == false) {

temp.setSelected(true);

startX = temp.getCenterX();

startY = temp.getCenterY();

int len = lockString.length();

if (len != 0) {

int preId = lockString.charAt(len - 1) - 48;

points[preId].setNextId(temp.getId());

}

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_DOWN:

int downX = (int) event.getX();

int downY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(downX, downY)) {

temp.setSelected(true);

startPoint = temp;

startX = temp.getCenterX();

startY = temp.getCenterY();

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_UP:

startX = startY = moveX = moveY = 0;

isUp = true;

invalidate();

savePwd();

break;

default:

break;

}

}

private void finishDraw() {

for (PointInfo temp : points) {

temp.setSelected(false);

temp.setNextId(temp.getId());

}

lockString.delete(0, lockString.length());

isUp = false;

invalidate();

}

private void initPoints(PointInfo[] points) {

int len = points.length;

int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4;

int seletedX = seletedSpacing;

int seletedY = height - width + seletedSpacing;

int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius;

int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius;

for (int i = 0; i < len; i++) {

if (i == 3 || i == 6) {

seletedX = seletedSpacing;

seletedY += selectedBitmapDiameter + seletedSpacing;

defaultX = seletedX + selectedBitmapRadius

  • defaultBitmapRadius;

defaultY += selectedBitmapDiameter + seletedSpacing;

}

points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY);

seletedX += selectedBitmapDiameter + seletedSpacing;

defaultX += selectedBitmapDiameter + seletedSpacing;

}

}

private void initPaint() {

initLinePaint(linePaint);

initTextPaint(textPaint);

initWhiteLinePaint(whiteLinePaint);

}

private void initTextPaint(Paint paint) {

textPaint.setTextSize(30);

textPaint.setAntiAlias(true);

textPaint.setTypeface(Typeface.MONOSPACE);

}

private void initLinePaint(Paint paint) {

// paint.setColor(Color.GRAY);

paint.setColor(Color.parseColor(“#1E90FF”));

// paint.setStyle(Style.STROKE);

paint.setStyle(Style.FILL);

paint.setStrokeWidth(10);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

private void initWhiteLinePaint(Paint paint) {

// paint.setColor(Color.WHITE);

paint.setColor(Color.parseColor(“#1E90FF”));

paint.setStrokeWidth(8);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

private void drawNinePoint(Canvas canvas) {

if (startPoint != null) {

drawEachLine(canvas, startPoint);

}

for (PointInfo pointInfo : points) {

if (pointInfo != null) {

if (pointInfo.isSelected()) {

canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),

pointInfo.getSeletedY(), null);

} else { // zj add else case

canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(),

pointInfo.getDefaultY(), null);

}

}

}

}

/**

  • @param canvas

  • @param point

*/

private void drawEachLine(Canvas canvas, PointInfo point) {

if (point.hasNextId()) {

int n = point.getNextId();

drawLine(canvas, point.getCenterX(), point.getCenterY(),

points[n].getCenterX(), points[n].getCenterY());

drawEachLine(canvas, points[n]);

}

}

/**

  • @param canvas

  • @param startX

  • @param startY

  • @param stopX

  • @param stopY

*/

private void drawLine(Canvas canvas, float startX, float startY,

float stopX, float stopY) {

canvas.drawLine(startX, startY, stopX, stopY, linePaint);

canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint);

}

private class PointInfo {

private int id;

private int nextId;

private boolean selected;

private int defaultX;

private int defaultY;

private int seletedX;

private int seletedY;

public PointInfo(int id, int defaultX, int defaultY, int seletedX,

int seletedY) {

this.id = id;

this.nextId = id;

this.defaultX = defaultX;

this.defaultY = defaultY;

this.seletedX = seletedX;

this.seletedY = seletedY;

}

public boolean isSelected() {

return selected;

}

public void setSelected(boolean selected) {

this.selected = selected;

}

public int getId() {

return id;

}

public int getDefaultX() {

return defaultX;

}

public int getDefaultY() {

return defaultY;

}

public int getSeletedX() {

return seletedX;

}

public int getSeletedY() {

return seletedY;

}

public int getCenterX() {

return seletedX + selectedBitmapRadius;

}

public int getCenterY() {

return seletedY + selectedBitmapRadius;

}

public boolean hasNextId() {

return nextId != id;

}

public int getNextId() {

return nextId;

}

public void setNextId(int nextId) {

this.nextId = nextId;

}

/**

  • @param x

  • @param y

*/

public boolean isInMyPlace(int x, int y) {

boolean inX = x > seletedX

&& x < (seletedX + selectedBitmapDiameter);

boolean inY = y > seletedY

&& y < (seletedY + selectedBitmapDiameter);

return (inX && inY);

}

}

public String getPwd() {

return lockString.toString();

}

public void savePwd() {

Intent intent = new Intent();

SharedPreferences shareDate = ctx.getSharedPreferences(“GUE_PWD”, 0);

String pwd = this.getPwd();

String first_pwd = shareDate.getString(“GUE_PWD”, “HAVE NO PWD”);

if (pwd.equals(first_pwd)) {

// shareDate.edit().clear().commit();

// shareDate.edit().putBoolean(“IS_SET”, true).commit();

// shareDate.edit().putString(“GUE_PWD”, pwd).commit();

intent.setClass(ctx, MmsLockList.class);

} else {

// shareDate.edit().putBoolean(“SECOND_ERROR”, true).commit();

intent.setClass(ctx, MmsLock.class);

}

ctx.startActivity(intent);

((Activity) ctx).finish();

}

}

到这儿核心功能都贴出来了,布局和资源还有项目代码等以后分离出独立工程的时候附加在后边。

有疑问欢迎交流。

转载请注明出处:周木水的CSDN博客 http://blog.csdn.net/zhoumushui

我的GitHub:周木水的GitHub https://github.com/zhoumushui

洗衣机坏了,有时候按一会儿就可以启动了,今天怎么弄都没效果,大概是启动电容的问题吧,悲剧。

下午去看公司部门间的球赛,我们队再胜一局,维持不败战绩,作为拉拉队员还是很开心的。

今天接着昨天的内容开始~

哎呀,代码在公司,明天再补充。先去学习。

Mms类:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

public class MmsLockMsg {

int _id;

int thread_id; // 号码区分标识

long address; // 号码

long date; // 日期

int type;//信息类型

// long date_sent; // 发送日期

String body; // 短信内容

String name;

public MmsLockMsg(int id, int thread_id, long address, long date,int type,String body,String name) {

this._id = id;

this.thread_id = thread_id;

this.address = address;

this.date = date;

this.type =type;

this.body = body;

this.name = name;

}

public MmsLockMsg(int thread_id, long address, long date,int type, String body,String name) {

this.thread_id = thread_id;

this.address = address;

this.date = date;

this.type =type;

this.body = body;

this.name = name;

}

public int getId() {

return _id;

}

public int getThreadId() {

return thread_id;

}

public void setThreadId(int thread_id) {

this.thread_id = thread_id;

}

public long getAddress() {

return address;

}

public void setAddress(long address) {

this.address = address;

}

public long getDate() {

return date;

}

public void setDate(long date) {

this.date = date;

}

public int getType(){

return type;

}

public void setType(int type){

this.type=type;

}

public String getBody() {

return body;

}

public void setBody(String body) {

this.body = body;

}

public String getName(){

return name;

}

public void setName(String name){

this.name = name;

}

}

设置手势密码页:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.Typeface;

import android.graphics.Paint.Cap;

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.TextView;

public class MmsLockSetPwd extends View {

TextView tv_forget_pwd = (TextView)findViewById(com.android.mms.R.id.zj_lock_forget_pwd);

Paint linePaint = new Paint();

Paint whiteLinePaint = new Paint();

Paint textPaint = new Paint();

Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.lock);

int defaultBitmapRadius = defaultBitmap.getWidth() / 2;

Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.indicator_lock_area);

int selectedBitmapDiameter = selectedBitmap.getWidth();

int selectedBitmapRadius = selectedBitmapDiameter / 2;

PointInfo[] points = new PointInfo[9];

PointInfo startPoint = null;

int width, height;

int moveX, moveY;

boolean isUp = false;

Context ctx;

StringBuffer lockString = new StringBuffer();

public MmsLockSetPwd(Context context) {

super(context);

ctx = context;

// this.setBackgroundColor(Color.WHITE);

initPaint();

}

public MmsLockSetPwd(Context context, AttributeSet attrs) {

super(context, attrs);

// this.setBackgroundColor(Color.WHITE);

tv_forget_pwd.setVisibility(View.GONE); //zj add

initPaint();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

width = getWidth();

height = getHeight();

if (width != 0 && height != 0) {

initPoints(points);

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

super.onLayout(changed, left, top, right, bottom);

}

private int startX = 0, startY = 0;

@Override

protected void onDraw(Canvas canvas) {

// canvas.drawText(“passwd:” + lockString, 0, 40, textPaint);

if (moveX != 0 && moveY != 0 && startX != 0 && startY != 0) {

// drawLine(canvas, startX, startY, moveX, moveY);

}

drawNinePoint(canvas);

super.onDraw(canvas);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

boolean flag = true;

if (isUp) {

finishDraw();

flag = false;

} else {

handlingEvent(event);

flag = true;

}

return flag;

}

private void handlingEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_MOVE:

moveX = (int) event.getX();

moveY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(moveX, moveY)

&& temp.isSelected() == false) {

temp.setSelected(true);

startX = temp.getCenterX();

startY = temp.getCenterY();

int len = lockString.length();

if (len != 0) {

int preId = lockString.charAt(len - 1) - 48;

points[preId].setNextId(temp.getId());

}

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_DOWN:

int downX = (int) event.getX();

int downY = (int) event.getY();

for (PointInfo temp : points) {

if (temp.isInMyPlace(downX, downY)) {

temp.setSelected(true);

startPoint = temp;

startX = temp.getCenterX();

startY = temp.getCenterY();

lockString.append(temp.getId());

break;

}

}

invalidate(0, height - width, width, height);

break;

case MotionEvent.ACTION_UP:

startX = startY = moveX = moveY = 0;

isUp = true;

invalidate();

savePwd();

break;

default:

break;

}

}

private void finishDraw() {

for (PointInfo temp : points) {

temp.setSelected(false);

temp.setNextId(temp.getId());

}

lockString.delete(0, lockString.length());

isUp = false;

invalidate();

}

private void initPoints(PointInfo[] points) {

int len = points.length;

int seletedSpacing = (width - selectedBitmapDiameter * 3) / 4;

int seletedX = seletedSpacing;

int seletedY = height - width + seletedSpacing;

int defaultX = seletedX + selectedBitmapRadius - defaultBitmapRadius;

int defaultY = seletedY + selectedBitmapRadius - defaultBitmapRadius;

for (int i = 0; i < len; i++) {

if (i == 3 || i == 6) {

seletedX = seletedSpacing;

seletedY += selectedBitmapDiameter + seletedSpacing;

defaultX = seletedX + selectedBitmapRadius

  • defaultBitmapRadius;

defaultY += selectedBitmapDiameter + seletedSpacing;

}

points[i] = new PointInfo(i, defaultX, defaultY, seletedX, seletedY);

seletedX += selectedBitmapDiameter + seletedSpacing;

defaultX += selectedBitmapDiameter + seletedSpacing;

}

}

private void initPaint() {

initLinePaint(linePaint);

initTextPaint(textPaint);

initWhiteLinePaint(whiteLinePaint);

}

/**

  • @param paint

*/

private void initTextPaint(Paint paint) {

textPaint.setTextSize(30);

textPaint.setAntiAlias(true);

textPaint.setTypeface(Typeface.MONOSPACE);

}

/**

  • @param paint

*/

private void initLinePaint(Paint paint) {

//paint.setColor(Color.GRAY);

paint.setColor(Color.parseColor(“#1E90FF”));

//paint.setStyle(Style.STROKE);

paint.setStyle(Style.FILL);

paint.setStrokeWidth(10);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

/**

  • @param paint

*/

private void initWhiteLinePaint(Paint paint) {

//paint.setColor(Color.WHITE);

paint.setColor(Color.parseColor(“#1E90FF”));

paint.setStrokeWidth(8);

paint.setAntiAlias(true);

paint.setStrokeCap(Cap.ROUND);

}

/**

  • @param canvas

*/

private void drawNinePoint(Canvas canvas) {

if (startPoint != null) {

drawEachLine(canvas, startPoint);

}

for (PointInfo pointInfo : points) {

if (pointInfo != null) {

if (pointInfo.isSelected()) {

canvas.drawBitmap(selectedBitmap, pointInfo.getSeletedX(),

pointInfo.getSeletedY(), null);

}else{ // zj add

canvas.drawBitmap(defaultBitmap, pointInfo.getDefaultX(),

pointInfo.getDefaultY(), null);

}

}

}

}

/**

  • @param canvas

  • @param point

*/

private void drawEachLine(Canvas canvas, PointInfo point) {

if (point.hasNextId()) {

int n = point.getNextId();

drawLine(canvas, point.getCenterX(), point.getCenterY(),

points[n].getCenterX(), points[n].getCenterY());

drawEachLine(canvas, points[n]);

}

}

/**

  • @param canvas

  • @param startX

  • @param startY

  • @param stopX

  • @param stopY

*/

private void drawLine(Canvas canvas, float startX, float startY,

float stopX, float stopY) {

canvas.drawLine(startX, startY, stopX, stopY, linePaint);

canvas.drawLine(startX, startY, stopX, stopY, whiteLinePaint);

}

/**

  • @author zkwlx

*/

private class PointInfo {

private int id;

private int nextId;

private boolean selected;

private int defaultX;

private int defaultY;

private int seletedX;

private int seletedY;

public PointInfo(int id, int defaultX, int defaultY, int seletedX,

int seletedY) {

this.id = id;

this.nextId = id;

this.defaultX = defaultX;

this.defaultY = defaultY;

this.seletedX = seletedX;

this.seletedY = seletedY;

}

public boolean isSelected() {

return selected;

}

public void setSelected(boolean selected) {

this.selected = selected;

}

public int getId() {

return id;

}

public int getDefaultX() {

return defaultX;

}

public int getDefaultY() {

return defaultY;

}

public int getSeletedX() {

return seletedX;

}

public int getSeletedY() {

return seletedY;

}

public int getCenterX() {

return seletedX + selectedBitmapRadius;

}

public int getCenterY() {

return seletedY + selectedBitmapRadius;

}

public boolean hasNextId() {

return nextId != id;

}

public int getNextId() {

return nextId;

}

public void setNextId(int nextId) {

this.nextId = nextId;

}

/**

  • @param x

  • @param y

*/

public boolean isInMyPlace(int x, int y) {

boolean inX = x > seletedX

&& x < (seletedX + selectedBitmapDiameter);

boolean inY = y > seletedY

&& y < (seletedY + selectedBitmapDiameter);

return (inX && inY);

}

}

public String getPwd() {

return lockString.toString();

}

public void savePwd() {

Intent intent = new Intent();

SharedPreferences shareDate = ctx.getSharedPreferences(“GUE_PWD”, 0);

boolean isSetFirst = shareDate.getBoolean(“IS_SET_FIRST”, false);

if (isSetFirst) {

String pwd = this.getPwd();

String first_pwd = shareDate.getString(“FIRST_PWD”, “HAVE NO PWD”);

if (pwd.equals(first_pwd)) {

shareDate.edit().clear().commit();

shareDate.edit().putBoolean(“IS_SET”, true).commit();

shareDate.edit().putString(“GUE_PWD”, pwd).commit();

intent.setClass(ctx, MmsLockSetPwdOk.class);

} else {

shareDate.edit().putBoolean(“SECOND_ERROR”, true).commit();

intent.setClass(ctx, MmsLock.class);

}

} else {

shareDate.edit().clear().commit();

shareDate.edit().putString(“FIRST_PWD”, this.getPwd()).commit();

shareDate.edit().putBoolean(“IS_SET_FIRST”, true).commit();

intent.setClass(ctx, MmsLock.class);

}

ctx.startActivity(intent);

((Activity) ctx).finish();

}

}

手势密码设置成功后,让用户输入字符密保,以防遗忘手势密码:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import android.app.Activity;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.os.Bundle;

import android.view.View;

import android.view.Window;

import android.widget.EditText;

import android.widget.TextView;

import android.widget.Toast;

public class MmsLockSetPwdOk extends Activity {

//private TextView showInfo;

private EditText secondPwd;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

//this.requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(com.android.mms.R.layout.mms_lock_res);

//showInfo = (TextView)findViewById(com.android.mms.R.id.res_info);

//SharedPreferences shareDate = getSharedPreferences(“GUE_PWD”, 0);

//String pwd = shareDate.getString(“GUE_PWD”, “HAVE NO PWD !”);

// showInfo.setText("密码是: "+pwd);

//showInfo.setText(com.android.mms.R.string.zj_set_pwd_tip);

}

public void saveSecondPwd(View v){

secondPwd = (EditText)findViewById(com.android.mms.R.id.second_pwd);

String secondStr = secondPwd.getText().toString();

if(secondStr!= null && secondStr.trim().length() != 0){

//获取SharedPreferences对象

// Context ctx = MainActivity.this;

SharedPreferences secondShare = getSharedPreferences(“SECOND_PWD”, MODE_PRIVATE);

//存入数据

Editor editor = secondShare.edit();

editor.putString(“SECOND_KEY”, secondStr);

editor.putBoolean(“SECOND_IS_SET”, true);

editor.commit();

Toast.makeText(this, com.android.mms.R.string.zj_set_pwd_success, Toast.LENGTH_SHORT).show();

finish();

}else{

Toast.makeText(this, com.android.mms.R.string.zj_pwd_null, Toast.LENGTH_SHORT).show();

}

}

}

MmsLockCheckPwd.java:

/*

  • ZJ add for Mms Lock

*/

package com.android.mms.ui;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Typeface;

import android.graphics.Paint.Cap;

import android.graphics.Paint.Style;

//import android.os.Vibrator; // zj Cancel

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.TextView;

public class MmsLockCheckPwd extends View {

TextView tv_forget_pwd = (TextView) findViewById(com.android.mms.R.id.zj_lock_forget_pwd);

Paint linePaint = new Paint();

Paint whiteLinePaint = new Paint();

Paint textPaint = new Paint();

Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.lock);

int defaultBitmapRadius = defaultBitmap.getWidth() / 2;

Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.indicator_lock_area);

int selectedBitmapDiameter = selectedBitmap.getWidth();

int selectedBitmapRadius = selectedBitmapDiameter / 2;

PointInfo[] points = new PointInfo[9];

PointInfo startPoint = null;

int width, height;

int moveX, moveY;

boolean isUp = false;

Context ctx;

StringBuffer lockString = new StringBuffer();

public MmsLockCheckPwd(Context context) {

super(context);

ctx = context;

// this.setBackgroundColor(Color.WHITE);

initPaint();

}

public MmsLockCheckPwd(Context context, AttributeSet attrs) {

super(context, attrs);

// this.setBackgroundColor(Color.WHITE);

tv_forget_pwd.setVisibility(View.VISIBLE); // zj add

initPaint();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

width = getWidth();

height = getHeight();

if (width != 0 && height != 0) {

initPoints(points);

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

文末

初级工程师拿到需求会直接开始做,然后做着做着发现有问题了,要么技术实现不了,要么逻辑有问题。

而高级工程师拿到需求会考虑很多,技术的可行性?对现有业务有没有帮助?对现有技术架构的影响?扩展性如何?等等…之后才会再进行设计编码阶段。

而现在随着跨平台开发,混合式开发,前端开发之类的热门,Android开发者需要学习和掌握的技术也在不断的增加。

通过和一些行业里的朋友交流讨论,以及参考现在大厂面试的要求。我们花了差不多一个月时间整理出了这份Android高级工程师需要掌握的所有知识体系。你可以看下掌握了多少。

混合式开发,微信小程序。都是得学会并且熟练的

这些是Android相关技术的内核,还有Java进阶

高级进阶必备的一些技术。像移动开发架构项目实战等

Android前沿技术;包括了组件化,热升级和热修复,以及各种架构跟框架的详细技术体系

以上即是我们整理的Android高级工程师需要掌握的技术体系了。可能很多朋友觉得很多技术自己都会了,只是一些新的技术不清楚而已。应该没什么太大的问题。

而这恰恰是问题所在!为什么别人高级工程师能年限突破30万,而你只有十几万呢?

就因为你只需补充你自己认为需要的,但并不知道企业需要的。这个就特别容易造成差距。因为你的技术体系并不系统,是零碎的,散乱的。那么你凭什么突破30万年薪呢?

我这些话比较直接,可能会戳到一些人的玻璃心,但是我知道肯定会对一些人起到点醒的效果的。而但凡只要有人因为我的这份高级系统大纲以及这些话找到了方向,并且付出行动去提升自我,为了成功变得更加努力。那么我做的这些就都有了意义。

喜欢的话请帮忙转发点赞一下能让更多有需要的人看到吧。谢谢!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

e com.android.mms.ui;

import android.app.Activity;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Typeface;

import android.graphics.Paint.Cap;

import android.graphics.Paint.Style;

//import android.os.Vibrator; // zj Cancel

import android.util.AttributeSet;

import android.view.MotionEvent;

import android.view.View;

import android.widget.TextView;

public class MmsLockCheckPwd extends View {

TextView tv_forget_pwd = (TextView) findViewById(com.android.mms.R.id.zj_lock_forget_pwd);

Paint linePaint = new Paint();

Paint whiteLinePaint = new Paint();

Paint textPaint = new Paint();

Bitmap defaultBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.lock);

int defaultBitmapRadius = defaultBitmap.getWidth() / 2;

Bitmap selectedBitmap = BitmapFactory.decodeResource(getResources(),

com.android.mms.R.drawable.indicator_lock_area);

int selectedBitmapDiameter = selectedBitmap.getWidth();

int selectedBitmapRadius = selectedBitmapDiameter / 2;

PointInfo[] points = new PointInfo[9];

PointInfo startPoint = null;

int width, height;

int moveX, moveY;

boolean isUp = false;

Context ctx;

StringBuffer lockString = new StringBuffer();

public MmsLockCheckPwd(Context context) {

super(context);

ctx = context;

// this.setBackgroundColor(Color.WHITE);

initPaint();

}

public MmsLockCheckPwd(Context context, AttributeSet attrs) {

super(context, attrs);

// this.setBackgroundColor(Color.WHITE);

tv_forget_pwd.setVisibility(View.VISIBLE); // zj add

initPaint();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

width = getWidth();

height = getHeight();

if (width != 0 && height != 0) {

initPoints(points);

}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

文末

初级工程师拿到需求会直接开始做,然后做着做着发现有问题了,要么技术实现不了,要么逻辑有问题。

而高级工程师拿到需求会考虑很多,技术的可行性?对现有业务有没有帮助?对现有技术架构的影响?扩展性如何?等等…之后才会再进行设计编码阶段。

而现在随着跨平台开发,混合式开发,前端开发之类的热门,Android开发者需要学习和掌握的技术也在不断的增加。

通过和一些行业里的朋友交流讨论,以及参考现在大厂面试的要求。我们花了差不多一个月时间整理出了这份Android高级工程师需要掌握的所有知识体系。你可以看下掌握了多少。

混合式开发,微信小程序。都是得学会并且熟练的

[外链图片转存中…(img-8BD6mYtN-1715651645810)]

这些是Android相关技术的内核,还有Java进阶

[外链图片转存中…(img-3vjlcCan-1715651645811)]

高级进阶必备的一些技术。像移动开发架构项目实战等

[外链图片转存中…(img-fefZFu3C-1715651645811)]

Android前沿技术;包括了组件化,热升级和热修复,以及各种架构跟框架的详细技术体系

[外链图片转存中…(img-TlEXpoao-1715651645811)]

以上即是我们整理的Android高级工程师需要掌握的技术体系了。可能很多朋友觉得很多技术自己都会了,只是一些新的技术不清楚而已。应该没什么太大的问题。

而这恰恰是问题所在!为什么别人高级工程师能年限突破30万,而你只有十几万呢?

就因为你只需补充你自己认为需要的,但并不知道企业需要的。这个就特别容易造成差距。因为你的技术体系并不系统,是零碎的,散乱的。那么你凭什么突破30万年薪呢?

我这些话比较直接,可能会戳到一些人的玻璃心,但是我知道肯定会对一些人起到点醒的效果的。而但凡只要有人因为我的这份高级系统大纲以及这些话找到了方向,并且付出行动去提升自我,为了成功变得更加努力。那么我做的这些就都有了意义。

喜欢的话请帮忙转发点赞一下能让更多有需要的人看到吧。谢谢!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值