2024年Android通讯录管理(获取联系人、通话记录、短信消息)(三,2024年最新android内存优化 面试题

最后

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了7、8年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。

其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。

不断奔跑,你就知道学习的意义所在!

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

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

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

import java.util.List;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.TextView;

import com.suntek.contact.R;

import com.suntek.contact.model.SMSBean;

/**

  • 短信适配器

  • @author Administrator

*/

public class SMSAdpter extends BaseAdapter {

private LayoutInflater mInflater;

private List smsList;

private Date date;

private SimpleDateFormat sdf;

public SMSAdpter(Context context) {

mInflater = LayoutInflater.from(context);

this.smsList = new ArrayList();

this.date = new Date();

this.sdf = new SimpleDateFormat(“MM/dd HH:mm”);

}

public void assignment(List smsList) {

this.smsList = smsList;

}

public void add(SMSBean bean) {

smsList.add(bean);

}

public void remove(int position) {

smsList.remove(position);

}

@Override

public int getCount() {

return smsList.size();

}

@Override

public Object getItem(int position) {

return smsList.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

if (convertView == null) {

convertView = mInflater.inflate(R.layout.sms_list_item, parent,

false);

holder = new ViewHolder();

holder.name = (TextView) convertView.findViewById(R.id.name);

holder.count = (TextView) convertView.findViewById(R.id.count);

holder.date = (TextView) convertView.findViewById(R.id.date);

holder.content = (TextView) convertView.findViewById(R.id.content);

} else {

holder = (ViewHolder) convertView.getTag();

}

holder.name.setText(smsList.get(position).getAddress());

holder.count.setText(“(” + smsList.get(position).getMsg_count() + “)”);

this.date.setTime(smsList.get(position).getDate());

holder.date.setText(this.sdf.format(date));

holder.content.setText(smsList.get(position).getMsg_snippet());

convertView.setTag(holder);

return convertView;

}

public final class ViewHolder {

public TextView name;

public TextView count;

public TextView date;

public TextView content;

}

}

Activity界面

/Contact_Demo/src/com/suntek/contact/SMSListActivity.java

package com.suntek.contact;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.ListView;

import com.suntek.contact.adapter.SMSAdpter;

import com.suntek.contact.model.SMSBean;

import com.suntek.contact.util.BaseIntentUtil;

import com.suntek.contact.util.RexseeSMS;

/**

  • 短信列表

  • @author Administrator

*/

public class SMSListActivity extends Activity {

private ListView smsListView;

private SMSAdpter smsAdpter;

private RexseeSMS rsms;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.sms_list_view);

smsListView = (ListView) findViewById(R.id.sms_list);

smsAdpter = new SMSAdpter(SMSListActivity.this);

rsms = new RexseeSMS(SMSListActivity.this);

List list_mmt = rsms.getThreadsNum(rsms.getThreads(0));

// 注入短信列表数据

smsAdpter.assignment(list_mmt);

// 填充数据

smsListView.setAdapter(smsAdpter);

// 短信列表项点击事件

smsListView.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

Map<String, String> map = new HashMap<String, String>();

SMSBean sb = (SMSBean) smsAdpter.getItem(position);

map.put(“phoneNumber”, sb.getAddress());

map.put(“threadId”, sb.getThread_id());

BaseIntentUtil.intentSysDefault(SMSListActivity.this,

MessageBoxList.class, map);

}

});

}

}

查询短信的工具类:

/Contact_Demo/src/com/suntek/contact/util/RexseeSMS.java

package com.suntek.contact.util;

import java.util.ArrayList;

import java.util.List;

import android.content.ContentResolver;

import android.content.Context;

import android.database.Cursor;

import android.net.Uri;

import com.suntek.contact.model.SMSBean;

public class RexseeSMS {

public static final String CONTENT_URI_SMS = “content://sms”; // 短信

public static final String CONTENT_URI_SMS_INBOX = “content://sms/inbox”;// 收件箱

public static final String CONTENT_URI_SMS_SENT = “content://sms/sent”; // 发送

public static final String CONTENT_URI_SMS_CONVERSATIONS = “content://sms/conversations”;

public RexseeSMS(Context mContext) {

this.mContext = mContext;

// TODO Auto-generated constructor stub

}

public static String[] SMS_COLUMNS = new String[] { “_id”, // 0

“thread_id”, // 1

“address”, // 2

“person”, // 3

“date”, // 4

“body”, // 5

“read”, // 6; 0:not read 1:read; default is 0

“type”, // 7; 0:all 1:inBox 2:sent 3:draft 4:outBox 5:failed

// 6:queued

“service_center” // 8

};

public static String[] THREAD_COLUMNS = new String[] { “thread_id”,

“msg_count”, “snippet” };

private Context mContext;

public String getContentUris() {

String rtn = “{”;

rtn += ““sms”:”" + CONTENT_URI_SMS + “”";

rtn += “,“inbox”:”" + CONTENT_URI_SMS_INBOX + “”";

rtn += “,“sent”:”" + CONTENT_URI_SMS_SENT + “”";

rtn += “,“conversations”:”" + CONTENT_URI_SMS_CONVERSATIONS + “”";

rtn += “}”;

return rtn;

}

public String get(int number) {

return getData(null, number);

}

public String getUnread(int number) {

return getData(“type=1 AND read=0”, number);

}

public String getRead(int number) {

return getData(“type=1 AND read=1”, number);

}

public String getInbox(int number) {

return getData(“type=1”, number);

}

public String getSent(int number) {

return getData(“type=2”, number);

}

public String getByThread(int thread) {

return getData(“thread_id=” + thread, 0);

}

public String getData(String selection, int number) {

Cursor cursor = null;

ContentResolver contentResolver = mContext.getContentResolver();

try {

if (number > 0) {

cursor = contentResolver.query(Uri.parse(CONTENT_URI_SMS),

SMS_COLUMNS, selection, null, "date desc limit "

  • number);

} else {

cursor = contentResolver.query(Uri.parse(CONTENT_URI_SMS),

SMS_COLUMNS, selection, null, “date desc”);

}

if (cursor == null || cursor.getCount() == 0)

return “[]”;

String rtn = “”;

for (int i = 0; i < cursor.getCount(); i++) {

cursor.moveToPosition(i);

if (i > 0)

rtn += “,”;

rtn += “{”;

rtn += “”_id":" + cursor.getString(0);

rtn += “,“thread_id”:” + cursor.getString(1);

rtn += “,“address”:”" + cursor.getString(2) + “”";

rtn += “,“person”:”"

  • ((cursor.getString(3) == null) ? “” : cursor

.getString(3)) + “”";

rtn += “,“date”:” + cursor.getString(4);

rtn += “,“body”:”" + cursor.getString(5) + “”";

rtn += “,“read”:”

  • ((cursor.getInt(6) == 1) ? “true” : “false”);

rtn += “,“type”:” + cursor.getString(7);

rtn += “,“service_center”:” + cursor.getString(8);

rtn += “}”;

}

return “[” + rtn + “]”;

} catch (Exception e) {

return “[]”;

}

}

public List getThreads(int number) {

Cursor cursor = null;

ContentResolver contentResolver = mContext.getContentResolver();

List list = new ArrayList();

try {

if (number > 0) {

cursor = contentResolver.query(

Uri.parse(CONTENT_URI_SMS_CONVERSATIONS),

THREAD_COLUMNS, null, null, "thread_id desc limit "

  • number);

} else {

cursor = contentResolver.query(

Uri.parse(CONTENT_URI_SMS_CONVERSATIONS),

THREAD_COLUMNS, null, null, “date desc”);

}

if (cursor == null || cursor.getCount() == 0)

return list;

for (int i = 0; i < cursor.getCount(); i++) {

cursor.moveToPosition(i);

SMSBean mmt = new SMSBean(cursor.getString(0),

cursor.getString(1), cursor.getString(2));

list.add(mmt);

}

return list;

} catch (Exception e) {

return list;

}

}

public List getThreadsNum(List ll) {

Cursor cursor = null;

ContentResolver contentResolver = mContext.getContentResolver();

List list = new ArrayList();

// try {

for (SMSBean mmt : ll) {

cursor = contentResolver.query(Uri.parse(CONTENT_URI_SMS),

SMS_COLUMNS, "thread_id = " + mmt.getThread_id(), null,

null);

if (cursor == null || cursor.getCount() == 0)

return list;

cursor.moveToFirst();

mmt.setAddress(cursor.getString(2));

mmt.setDate(cursor.getLong(4));

mmt.setRead(cursor.getString(6));

list.add(mmt);

}

return list;

// } catch (Exception e) {

// Log.e(“getThreadsNum”, “getThreadsNum-------------”);

// return list;

// }

}

}

上面是短信列表的实现,下面是会话消息的实现

界面布局:

/Contact_Demo/res/layout/message_list_view.xml

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width=“fill_parent”

android:layout_height=“fill_parent”

android:background=“#000000” >

<ListView

android:id=“@+id/message_list”

android:layout_width=“fill_parent”

android:layout_height=“wrap_content”

android:background=“#00000000”

android:cacheColorHint=“#00000000”

android:choiceMode=“singleChoice”

android:soundEffectsEnabled=“true” />

/Contact_Demo/res/layout/list_say_he_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width=“fill_parent”

android:layout_height=“wrap_content”

android:gravity=“left”

android:orientation=“horizontal”

android:paddingBottom=“10dip”

android:paddingLeft=“5dip”

android:paddingRight=“50dip”

android:paddingTop=“10dip” >

<LinearLayout

android:id=“@+id/layout_bj”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“left”

android:background=“@drawable/incoming”

android:gravity=“center_vertical”

android:orientation=“vertical” >

<com.suntek.contact.view.CustomTextView

android:id=“@+id/messagedetail_row_text”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:gravity=“top|left”

android:padding=“5dip”

android:textColor=“#000000” />

<TextView

android:id=“@+id/messagedetail_row_date”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“right”

android:textAppearance=“?android:attr/textAppearanceSmall”

android:textColor=“#65879e” />

/Contact_Demo/res/layout/list_say_me_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width=“fill_parent”

android:layout_height=“wrap_content”

android:gravity=“right”

android:orientation=“horizontal”

android:paddingBottom=“10dip”

android:paddingLeft=“50dip”

android:paddingRight=“5dip”

android:paddingTop=“10dip” >

<LinearLayout

android:id=“@+id/layout_bj”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“right”

android:background=“@drawable/outgoing”

android:gravity=“center_vertical”

android:orientation=“vertical” >

<com.suntek.contact.view.CustomTextView

android:id=“@+id/messagedetail_row_text”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:gravity=“top|left”

android:padding=“5dip”

android:textColor=“#000000” />

<TextView

android:id=“@+id/messagedetail_row_date”

android:layout_width=“wrap_content”

android:layout_height=“wrap_content”

android:layout_gravity=“right”

android:textAppearance=“?android:attr/textAppearanceSmall”

android:textColor=“#65879e” />

短信消息实体类:

/Contact_Demo/src/com/suntek/contact/model/MessageBean.java

package com.suntek.contact.model;

public class MessageBean {

private String name; // 联系人姓名

private String date; // 日期

private String text; // 文本

private int layoutID; // 布局id,区分是发送人还是接收人

public MessageBean() {

}

public MessageBean(String name, String date, String text, int layoutID) {

super();

this.name = name;

this.date = date;

this.text = text;

this.layoutID = layoutID;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getDate() {

return date;

}

public void setDate(String date) {

this.date = date;

}

public String getText() {

return text;

}

public void setText(String text) {

this.text = text;

}

public int getLayoutID() {

return layoutID;

}

public void setLayoutID(int layoutID) {

this.layoutID = layoutID;

}

}

消息列表适配器:

/Contact_Demo/src/com/suntek/contact/adapter/MessageBoxListAdapter.java

package com.suntek.contact.adapter;

import java.util.List;

import android.app.AlertDialog;

import android.content.Context;

import android.content.DialogInterface;

import android.graphics.Color;

import android.text.ClipboardManager;

import android.view.LayoutInflater;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnLongClickListener;

import android.view.View.OnTouchListener;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.LinearLayout;

import android.widget.TextView;

import com.suntek.contact.R;

import com.suntek.contact.model.MessageBean;

/**

  • 消息列表适配器

  • @author Administrator

*/

public class MessageBoxListAdapter extends BaseAdapter {

private List mbList;

private Context ctx;

private LinearLayout layout_father;

private LayoutInflater vi;

private LinearLayout layout_child;

private TextView tvDate;

private TextView tvText;

public MessageBoxListAdapter(Context context, List coll) {

ctx = context;

vi = (LayoutInflater) ctx

.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

this.mbList = coll;

}

public int getCount() {

return mbList.size();

}

public Object getItem(int position) {

return mbList.get(position);

}

public long getItemId(int position) {

return position;

}

public View getView(int position, View convertView, ViewGroup parent) {

MessageBean mb = mbList.get(position);

// 得到布局ID

int itemLayout = mb.getLayoutID();

layout_father = new LinearLayout(ctx);

vi.inflate(itemLayout, layout_father, true);

layout_father.setBackgroundColor(Color.TRANSPARENT);

layout_child = (LinearLayout) layout_father

.findViewById(R.id.layout_bj);

tvText = (TextView) layout_father

.findViewById(R.id.messagedetail_row_text);

tvText.setText(mb.getText());

最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题!

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

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

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

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

ackgroundColor(Color.TRANSPARENT);

layout_child = (LinearLayout) layout_father

.findViewById(R.id.layout_bj);

tvText = (TextView) layout_father

.findViewById(R.id.messagedetail_row_text);

tvText.setText(mb.getText());

最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

选定你想去的几家公司后,先去一些小的公司练练,学习下面试技巧,总结下,也算是熟悉下面试氛围,平时和同事或者产品PK时可以讲得头头是道,思路清晰至极,到了现场真的不一样,怎么描述你所做的一切,这绝对是个学术性问题!

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-m9LxkPZc-1714981775338)]

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值