}
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());
tvDate = (TextView) layout_father
.findViewById(R.id.messagedetail_row_date);
tvDate.setText(mb.getDate());
addListener(tvText, tvDate, layout_child, mb);
return layout_father;
}
public void addListener(final TextView tvText, final TextView tvDate,
LinearLayout layout_bj, final MessageBean mb) {
layout_bj.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
}
});
layout_bj.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View v) {
tvText.setTextColor(0xffffffff);
showListDialog(newtan, mb);
return true;
}
});
layout_bj.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
tvText.setTextColor(0xffffffff);
break;
default:
tvText.setTextColor(Color.BLACK);
break;
}
return false;
}
});
}
private String[] newtan = new String[] { “转发”, “复制文本内容”, “删除”, “查询信息详情” };
private void showListDialog(final String[] arg, final MessageBean mb) {
new AlertDialog.Builder(ctx).setTitle(“信息选项”)
.setItems(arg, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
break;
case 1:
ClipboardManager cmb = (ClipboardManager) ctx
.getSystemService(ctx.CLIPBOARD_SERVICE);
cmb.setText(mb.getText());
break;
case 2:
break;
case 3:
break;
}
;
}
}).show();
}
}
/Contact_Demo/src/com/suntek/contact/MessageBoxList.java
package com.suntek.contact;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import android.app.Activity;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.Toast;
import com.suntek.contact.adapter.MessageBoxListAdapter;
import com.suntek.contact.model.MessageBean;
/**
-
短信消息列表 收发人
-
@author Administrator
*/
public class MessageBoxList extends Activity {
private ListView talkView;
private List messages = null;
private AsyncQueryHandler asyncQuery;
private String address;
private SimpleDateFormat sdf;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.message_list_view);
sdf = new SimpleDateFormat(“MM-dd HH:mm”);
String thread = getIntent().getStringExtra(“threadId”);
init(thread);
}
private void init(String thread) {
asyncQuery = new MessageAsynQueryHandler(getContentResolver());
talkView = (ListView) findViewById(R.id.message_list);
messages = new ArrayList();
Uri uri = Uri.parse(“content://sms”);
String[] projection = new String[] { “date”, “address”, “person”,
“body”, “type” }; // 查询的列
asyncQuery.startQuery(0, null, uri, projection,
"thread_id = " + thread, null, “date asc”);
}
/**
-
异步查询数据库的类
-
@author Administrator
*/
private class MessageAsynQueryHandler extends AsyncQueryHandler {
public MessageAsynQueryHandler(ContentResolver cr) {
super(cr);
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
for (int i = 0; i < cursor.getCount(); i++) {
cursor.moveToPosition(i);
String date = sdf.format(new Date(cursor.getLong(cursor
.getColumnIndex(“date”))));
if (cursor.getInt(cursor.getColumnIndex(“type”)) == 1) {// 他说的信息
MessageBean d = new MessageBean(
cursor.getString(cursor
.getColumnIndex(“address”)),
date,
cursor.getString(cursor.getColumnIndex(“body”)),
R.layout.list_say_he_item);
messages.add(d);
} else { // 我说的信息
MessageBean d = new MessageBean(
cursor.getString(cursor
.getColumnIndex(“address”)),
date,
cursor.getString(cursor.getColumnIndex(“body”)),
R.layout.list_say_me_item);
messages.add(d);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结尾
最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-3PEbtmxj-1713285015059)]
[外链图片转存中…(img-mxVyXOsl-1713285015061)]
[外链图片转存中…(img-0IZROjD8-1713285015061)]
[外链图片转存中…(img-LLpyqbp6-1713285015062)]
[外链图片转存中…(img-5yPFmyoB-1713285015063)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结尾
最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
[外链图片转存中…(img-NZ9oFMZI-1713285015064)]
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
[外链图片转存中…(img-t0MKg0zy-1713285015065)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!