編輯:系統備份
目前,Android手機中的一些軟件可以實現手機短信的備份與還原操作。這篇博文就是要向大家介紹如何實現Android短信的備份與還原操作。好了,相信大家對這些實用的功能還是比較感興趣的,不多說了,我們直接進入主題吧。
我的實現原理很簡單,界面上放置幾個TextView列表,其中兩項為“短信的備份”和“短信的還原”,點擊“短信的備份”,讀取所有的短信信息,將短信信息保存在一個xml文件中,這個xml文件放置的sdcard中,作為短信的備份文件,然後當需要還原短信的時候,只需要點擊“短信的還原”,這時程序首先會刪除手機上現有的短信,然後從短信的備份xml文件中讀取之前備份的短信內容,寫入手機短信數據庫中。
原理講完了,是不是很簡單呢?下面,我們就一起來實現這些功能吧!
為了使程序更加面向對象化,更加符合面向對象的封裝,我將短信信息封裝成了一個實體類SmsInfo
具體代碼如下:
package cn.lyz.mobilesafe.domain; /** * 短信內容的實體類 * @author liuyazhuang * */ public class SmsInfo { //電話號碼 private String address; //日期 private String date; //短信類型 private String type; //短信內容 private String body; public SmsInfo() { super(); // TODO Auto-generated constructor stub } public SmsInfo(String address, String date, String type, String body) { super(); this.address = address; this.date = date; this.type = type; this.body = body; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getType() { return type; } public void setType(String type) { this.type = type; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } @Override public String toString() { return SmsInfo [address= + address + , date= + date + , type= + type + , body= + body + ]; } }
這個類主要封裝了對短信數據的操作,同時封裝了對xml文件的寫入與解析操作。備份短信流程是首先從短信數據庫中讀取短信,然後將短信信息寫入xml文件。還原短信的流程為先刪除手機中的短信,然後解析備份的短信文件,將解析出的短信信息寫入短信數據庫。
具體實現代碼如下:
package cn.lyz.mobilesafe.engine; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Environment; import android.util.Xml; import cn.lyz.mobilesafe.domain.SmsInfo; /** * 獲取短信內容的業務類 * @author liuyazhuang * */ public class SmsInfoService { private Context context; public SmsInfoService(Context context) { // TODO Auto-generated constructor stub this.context = context; } //得到所有的短信 public ListgetSmsInfos(){ List smsInfos = new ArrayList (); Uri uri = Uri.parse(content://sms); Cursor c = context.getContentResolver().query(uri, new String[]{address,date,type,body}, null, null, null); while(c.moveToNext()){ String address = c.getString(c.getColumnIndex(address)); String date = c.getString(c.getColumnIndex(date)); String type = c.getString(c.getColumnIndex(type)); String body = c.getString(c.getColumnIndex(body)); SmsInfo smsInfo = new SmsInfo(address, date, type, body); smsInfos.add(smsInfo); } return smsInfos; } //把短信數據寫入到xml文件 public void createXml(List smsInfos) throws Exception{ XmlSerializer serializer = Xml.newSerializer(); File file = new File(Environment.getExternalStorageDirectory(), smsbackup.xml); OutputStream os = new FileOutputStream(file); serializer.setOutput(os, UTF-8); serializer.startDocument(UTF-8, true); serializer.startTag(null, smsinfos); for(SmsInfo info:smsInfos){ serializer.startTag(null, smsinfo); //address serializer.startTag(null, address); serializer.text(info.getAddress()); serializer.endTag(null, address); //date serializer.startTag(null, date); serializer.text(info.getDate()); serializer.endTag(null, date); //type serializer.startTag(null, type); serializer.text(info.getType()); serializer.endTag(null, type); //body serializer.startTag(null, body); serializer.text(info.getBody()); serializer.endTag(null, body); serializer.endTag(null, smsinfo); } serializer.endTag(null, smsinfos); serializer.endDocument(); os.close(); } //從xml文件中得到短信數據 public List getSmsInfosFromXml() throws Exception{ List smsInfos =null; SmsInfo smsInfo = null; XmlPullParser parser = Xml.newPullParser(); File file = new File(Environment.getExternalStorageDirectory(), smsbackup.xml); InputStream inputStream = new FileInputStream(file); parser.setInput(inputStream, UTF-8); int eventType = parser.getEventType(); while(eventType != XmlPullParser.END_DOCUMENT){ switch (eventType) { case XmlPullParser.START_TAG: if(smsinfos.equals(parser.getName())){ smsInfos = new ArrayList (); }else if(smsinfo.equals(parser.getName())){ smsInfo = new SmsInfo(); }else if(address.equals(parser.getName())){ String address = parser.nextText(); smsInfo.setAddress(address); }else if(date.equals(parser.getName())){ String date = parser.nextText(); smsInfo.setDate(date); }else if(type.equals(parser.getName())){ String type = parser.nextText(); smsInfo.setType(type); }else if(body.equals(parser.getName())){ String body = parser.nextText(); smsInfo.setBody(body); } break; case XmlPullParser.END_TAG: if(smsinfo.equals(parser.getName())){ smsInfos.add(smsInfo); smsInfo = null; } break; default: break; } eventType = parser.next(); } return smsInfos; } }
這個類主要是實現備份短信的操作,將備份短信的操作放在一個服務類中執行,由於讀取數據庫的操作是一個耗時的操作,所以我在這個類中開啟了一個線程來做短信的備份操作,如果備份短信失敗,則提示用戶備份失敗,如果備份短信成功,則對外發出通知,提示用戶短信備份成功。操作完畢後停止服務。
具體實現代碼如下:
package cn.lyz.mobilesafe.service; import java.util.List; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.os.Looper; import android.widget.Toast; import cn.lyz.mobilesafe.R; import cn.lyz.mobilesafe.activity.MainActivity; import cn.lyz.mobilesafe.domain.SmsInfo; import cn.lyz.mobilesafe.engine.SmsInfoService; /** * 備份短信的服務類 * @author liuyazhuang * */ public class BackupSmsService extends Service { private SmsInfoService smsInfoService; private NotificationManager nm; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); smsInfoService = new SmsInfoService(this); nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); new Thread(){ public void run() { //1 得到所有的短信 //2 生成一個xml文件 ListsmsInfos = smsInfoService.getSmsInfos(); try { smsInfoService.createXml(smsInfos); //發送一個通知告訴用戶備份完成 Notification notification = new Notification(R.drawable.notification, 短信備份完畢, System.currentTimeMillis()); Intent intent = new Intent(getApplicationContext(),MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(), 100, intent, 0); notification.setLatestEventInfo(getApplicationContext(), 提示信息, 短信備份完畢, contentIntent); //點擊通知消息自動消失 notification.flags = Notification.FLAG_AUTO_CANCEL; nm.notify(100, notification); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); //looper是一個消息泵,從消息隊列(MessageQueue)裡面抽取消息,把消息交給Handler處理 Looper.prepare(); Toast.makeText(getApplicationContext(), 短信備份失敗, 0).show(); Looper.loop(); } stopSelf();//停止服務 }; }.start(); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } }
具體實現代碼如下:
在這個類中主要完成的功能是,找到頁面上的控件,並設置控件的狀態事件,在相應事件中完成對業務的響應操作。
具體實現代碼如下:
package cn.lyz.mobilesafe.activity; import java.util.List; import android.app.Activity; import android.app.ProgressDialog; import android.content.ContentValues; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Looper; import android.os.SystemClock; import android.view.View; import android.view.View.OnClickListener; import android.widget.TextView; import android.widget.Toast; import cn.lyz.mobilesafe.R; import cn.lyz.mobilesafe.domain.SmsInfo; import cn.lyz.mobilesafe.engine.SmsInfoService; import cn.lyz.mobilesafe.service.BackupSmsService; /** * 短信的備份與還原 * @author liuyazhuang * */ public class AtoolsActivity extends Activity implements OnClickListener{ private TextView tv_atools_sms_backup; private TextView tv_atools_sms_restore; private ProgressDialog mPd; private SmsInfoService smsInfoService; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.atools); tv_atools_sms_backup = (TextView) findViewById(R.id.tv_atools_sms_backup); tv_atools_sms_backup.setOnClickListener(this); tv_atools_sms_restore = (TextView) findViewById(R.id.tv_atools_sms_restore); tv_atools_sms_restore.setOnClickListener(this); smsInfoService = new SmsInfoService(this); } public void onClick(View v) { // TODO Auto-generated method stub int id = v.getId(); Intent intent = null; switch (id) { case R.id.tv_atools_sms_backup: intent = new Intent(this,BackupSmsService.class); startService(intent); break; case R.id.tv_atools_sms_restore: restoreSms(); default: break; } } /** * 還原短信操作 */ private void restoreSms() { //1 刪除所有的短信 //2 把xml裡面的數據插入到短信的數據庫 //2.1 先解析xml文件 //2.2 插入數據 mPd = new ProgressDialog(this); mPd.setTitle(正在刪除原來的短信); mPd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mPd.show(); new Thread(){ public void run() { try { Uri uri = Uri.parse(content://sms); getContentResolver().delete(uri, null, null); mPd.setTitle(正在還原短信); ListsmsInfos = smsInfoService.getSmsInfosFromXml(); mPd.setMax(smsInfos.size()); for(SmsInfo smsInfo:smsInfos){ ContentValues values = new ContentValues(); values.put(address, smsInfo.getAddress()); values.put(date, smsInfo.getDate()); values.put(type, smsInfo.getType()); values.put(body, smsInfo.getBody()); getContentResolver().insert(uri, values); SystemClock.sleep(2000); mPd.incrementProgressBy(1);//每次進度條刻度值加1 } mPd.dismiss(); Looper.prepare(); Toast.makeText(getApplicationContext(), 短信還原成功, 1).show(); Looper.loop(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); mPd.dismiss(); Looper.prepare(); Toast.makeText(getApplicationContext(), 短信還原失敗, 1).show(); Looper.loop(); } }; }.start(); } }
別忘了向AndroidManifest.xml文件注冊相應的權限
具體如下:
運行界面
短信備份完畢
通知顯示
開始還原短信
正在還原短信
短信還原成功
本實例中,為了方面,我把一些文字直接寫在了布局文件中和相關的類中,大家在真實的項目中要把這些文字寫在string.xml文件中,在外部引用這些資源,切記,這是作為一個Android程序員最基本的開發常識和規范,我在這裡只是為了方便直接寫在了類和布局文件中。
目前卓大師(刷機專家)暫時不提供更改備份路徑的功能,但是您可以手動將備份在SD/TF卡的clockworkmod/backup 目錄下的備份文件轉移到電
與計算機軟件類似,91手機助手內置備份還原功能,不僅能備份聯系人、短信
手機使用一段時候後,在手機端會保留一些對個人來說比較珍貴的數據,比如通訊錄、照片、短信、錄音等等,通常的刷機一般不會將這些數據清除掉(通訊錄會),其他的數據都保存在SD卡
你是否為了誤刪手機的聯系人而苦惱?小面小編分享下怎樣備份、恢復Gphone中的聯系人的方法