}
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);
}
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
}
@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);
}
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。
[外链图片转存中…(img-cYAnZ7xg-1714875793559)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!