因为用于显示短信的历史记录的Fragment已经实现了,所以先修改好MainActivity中mViewPager的适配器里面的逻辑,就可以实现显示历史记录了,很简单:
mViewPager.setAdapter(new FragmentPagerAdapter(
getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
//在ViewPager与Tab的联系后,会多次(具体次数等于getCount)调用getItem
if (position==0) return new FestivalCategoryFragment();
else return new SmsHistoryFragment();
}
...
});
然后需要实现与短信有关的业务类SmsBiz
public class SmsBiz {
private Context context;
public SmsBiz(Context context) {
this.context=context;
}
/**
*
* @param number
* @param msgContent
* @param sentPi
* @param deliverPi
* @return 返回短信的条数(有可能短信内容比较长,要做分割)
**/
public int sendMsg(String number, String msgContent, PendingIntent sentPi, PendingIntent deliverPi) {
SmsManager smsManager=SmsManager.getDefault();
ArrayList<String> contents=smsManager.divideMessage(msgContent);
//分割后单条短信的发送
for(String content:contents) {
smsManager.sendTextMessage(number,null,content,sentPi,deliverPi);
}
return contents.size();
}
//有可能需要发送的联系人不止一个
public int sendMsg(Set<String> numbers, SendedMsg msg, PendingIntent sentPi, PendingIntent deliverPi) {
save(msg);//存入数据库中
int result=0;
for(String number:numbers) {
int count=sendMsg(number,msg.getContent(),sentPi,deliverPi);
result+=count;
}
return result;
}
//因为这里只涉及数据库的增和查,所以这里直接写在业务层下
//但是如果涉及到的数据库的操作比较多(增删改查,以及按条件查询等),最好在项目的包下建立一个"dao"层
//或者在"db"下增加一个相关操作的类,然后业务层就可以根据其实例去访问数据库的一些内容
private void save(SendedMsg sendedMsg) {
sendedMsg.setDate(new Date());
ContentValues values=new ContentValues();
values.put(SendedMsg.COLUMN_DATE,sendedMsg.getDate().getTime());
values.put(SendedMsg.COLUMN_FESTIVAL_NAME,sendedMsg.getFestivalName());
values.put(SendedMsg.COLUMN_CONTENT,sendedMsg.getContent());
values.put(SendedMsg.COLUMN_NAMES,sendedMsg.getNames());
values.put(SendedMsg.COLUMN_NUMBERS,sendedMsg.getNumbers());
context.getContentResolver().insert(SmsProvider.URI_SMS_ALL,values);
}
}
在分割后的单条短信发送后,会发送两个广播,然后再SendMsgActivity就可以掌握到短信发送的情况了。
最后就是在SendMsgActivity实现选择联系人与发生短信的逻辑了(需要注意,相比于UI篇中,除了增加了代码,某些地方也做了一下改动):
public class SendMsgActivity extends AppCompatActivity {
public static final String KEY_ID_FESTIVAL="FestivalId";
public static final String KEY_ID_MSG="MsgId";
private static final int CODE_REQUEST=1;
private int mFestivalId;
private int mMsgId;
private Festival mFestival;
private Msg mMsg;
private EditText mEdMsg;
private Button mBtnAdd;
private FlowLayout mFlContacts;
private FloatingActionButton mFabSend;//用于发送短信的FloatingActionButton
private View mLayoutLoading;
private Set<String> mContactNames=new HashSet<>();
private Set<String> mContactNums=new HashSet<>();
private LayoutInflater mInflater;
private static final String ACTION_SEND_MSG="ACTION_SEND_MSG";
private static final String ACTION_DELIVER_MSG="ACTION_DELIVER_MSG";
private PendingIntent mSendPi;
private PendingIntent mDeliverPi;
private BroadcastReceiver mSendBroadcastReceiver;
private BroadcastReceiver mDeliverBroadcastReceiver;
private SmsBiz mSmsBiz;
private int mMsgSendCount;//用来记录发送次数
private int mTotalCount;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_msg);
mInflater=LayoutInflater.from(this);
mSmsBiz=new SmsBiz(this);
initDatas();
initViews();
initEvents();
initRecivers();
}
private void initRecivers() {
Intent sendIntent=new Intent(ACTION_SEND_MSG);
mSendPi=PendingIntent.getBroadcast(this,0,sendIntent,0);
Intent deliverIntent=new Intent(ACTION_DELIVER_MSG);
mDeliverPi=PendingIntent.getBroadcast(this,0,deliverIntent,0);
registerReceiver(mSendBroadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//因为是每个分割的短信发送后都会发送一个广播,所以这里每次在接受广播后都要累加(不管发送成功与否),直至等于分割的短信的总数
mMsgSendCount++;
if(getResultCode()==RESULT_OK) {
Log.d("测试","短信发送成功"+(mMsgSendCount+"/"+mTotalCount));
}
else {
Log.d("测试","短信发送失败");
}
Toast.makeText(SendMsgActivity.this,(mMsgSendCount+"/"+mTotalCount)+"短信已经发送",Toast.LENGTH_SHORT).show();
if(mMsgSendCount==mTotalCount) {
finish();
}
}
},new IntentFilter(ACTION_SEND_MSG));
registerReceiver(mDeliverBroadcastReceiver=new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("测试","联系人已经成功接收短信");
}
},new IntentFilter(ACTION_DELIVER_MSG));
}
private void initEvents() {
mBtnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent,CODE_REQUEST);
}
});
mFabSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(mContactNums.size()==0) {
Toast.makeText(SendMsgActivity.this,"请先添加联系人!",Toast.LENGTH_SHORT).show();
return;
}
String msgContent=mEdMsg.getText().toString();
if(TextUtils.isEmpty(msgContent)) {
Toast.makeText(SendMsgActivity.this,"短信内容不能为空!",Toast.LENGTH_SHORT).show();
return;
}
mLayoutLoading.setVisibility(View.VISIBLE);
mMsgSendCount=0;
mTotalCount=mSmsBiz.sendMsg(mContactNums,buildSendedMsg(msgContent),mSendPi,mDeliverPi);
}
});
}
private SendedMsg buildSendedMsg(String msgContent) {
SendedMsg sendedMsg=new SendedMsg();
sendedMsg.setContent(msgContent);
sendedMsg.setFestivalName(mFestival.getName());
StringBuilder names=new StringBuilder();
for (String name:mContactNames) {
names.append(name+",");
}
sendedMsg.setNames(names.substring(0,names.length()-1));
StringBuilder numbers=new StringBuilder();
for (String number:mContactNums) {
numbers.append(number+",");
}
sendedMsg.setNumbers(numbers.substring(0,numbers.length()-1));
return sendedMsg;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==CODE_REQUEST) {
if(resultCode==RESULT_OK) {
Uri contactUri=data.getData();//这里得到的Uri是选定的联系人的特定Uri
Cursor cursor=getContentResolver().query(contactUri,null,null,null,null);
if (cursor!=null) {
cursor.moveToFirst();
String contactName=cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String number=getContactNumber(cursor);
cursor.close();
//如果number不存在,就不需要添加contactName与number
if(!TextUtils.isEmpty(number)) {
mContactNums.add(number);
mContactNames.add(contactName);
addTag(contactName);
}
}
}
}
}
/**
* 将选定的联系人添加进FlowLayout中
* @param contactName
*/
private void addTag(String contactName) {
TextView textView= (TextView) mInflater.inflate(R.layout.tag,mFlContacts,false);
textView.setText(contactName);
mFlContacts.addView(textView);
}
private String getContactNumber(Cursor cursor) {
int numberCount=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
String number=null;
if(numberCount>0) {
int contactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phoneCursor=getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID+" = "+contactId,null,null);
phoneCursor.moveToFirst();
//可能phoneCursor中会存在多个号码(因为可能同一个联系人下存有多种号码,如手机、单位等),这里只简单的获取第一个
number=phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
phoneCursor.close();
}
return number;
}
private void initViews() {
mEdMsg= (EditText) findViewById(R.id.id_et_content);
mBtnAdd= (Button) findViewById(R.id.id_btn_add);
mFlContacts= (FlowLayout) findViewById(R.id.id_fl_contacts);
mFabSend= (FloatingActionButton) findViewById(R.id.id_fab_send);
mLayoutLoading=findViewById(R.id.id_layout_loading);
mLayoutLoading.setVisibility(View.GONE);
if(mMsgId!=-1) {
mMsg= FestivalLab.getInstance().getMsgByFestivalIdAndMsgId(mFestivalId,mMsgId);
mEdMsg.setText(mMsg.getContent());
}
}
private void initDatas() {
mFestivalId=getIntent().getIntExtra(KEY_ID_FESTIVAL,-1);
mMsgId=getIntent().getIntExtra(KEY_ID_MSG,-1);
mFestival=FestivalLab.getInstance().getFestivalById(mFestivalId);
setTitle(mFestival.getName());
}
public static void toActivity(Context context, int festivalId, int msgId) {
Intent intent=new Intent(context,SendMsgActivity.class);
intent.putExtra(KEY_ID_FESTIVAL,festivalId);
intent.putExtra(KEY_ID_MSG,msgId);
context.startActivity(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mSendBroadcastReceiver);
unregisterReceiver(mDeliverBroadcastReceiver);
}
}
选择联系人的时候,是跳转到了系统的页面,当然,也可以自己去编写一个页面,貌似在慕课网就有相关教程。