Android核心基礎學習進程

來源:互聯網
上載者:User

標籤:

第一天: 
 adb命令:
  adb devices 列出所有的裝置
  adb shell 掛載到Linux的空間,可以執行Linux指令
  adb install xxx.apk 如果多個裝置adb install -s 裝置名稱
  adb push 把檔案推到手機裡
  adb pull把檔案從手機裡拉出來
  netstat -ano查看連接埠號碼
  taskkill /pid pid /f 殺死pid對應的進程
 電話撥號器
  1、找到控制項並且得到控制項對象
   et_phone = (EditText) findViewById(R.id.et_phone);
   Button bt_call  = (Button) findViewById(R.id.bt_call);
  2、為按鈕設定點擊事件,並且拿到使用者在文字框中輸入的值
   String phone = et_phone.getText().toString().trim();
  3、建立一個撥打到電話的意圖,並開啟
   Intent intent = new Intent();
   //設定撥打到電話號碼的動作
   intent.setAction(Intent.ACTION_CALL);
   //設定撥打的電話號碼
   intent.setData(Uri.parse("tel://"+phone));
   //開啟撥打到電話的意圖
   startActivity(intent);
 四種點擊事件
  1、採用內部類的方式去實現OnClickListener
  2、使用匿名內部類
  3、讓當前類去實現OnClickListener,並實現未實現的方法
  4、在layout檔案的Button中定義onclick方法,並在代碼中去實現對應的方法
   標準:public void XXX(View view){}
   
第二天:
 1、Junit測試方法
  寫一個測試類別繼承AndroidTestCase類
    在資訊清單檔中添加
   <!-- 添加指令集,添加到manifest節點裡面,指令集會把應用程式部署到模擬器上運行 -->
  <instrumentation android:name="android.test.InstrumentationTestRunner"
   android:targetPackage="com.itheima.junit">
  </instrumentation>
  <!-- 添加JUnit的測試包 ,添加到application節點的裡面-->
        <uses-library android:name="android.test.runner"/>
 2、從檔案中讀取資料並顯示到控制項
  1、把檔案儲存到SD卡
   File file = new File(Environment.getExternalStorageDirectory(),"xx.txt");
   FileOutputStream fos = new FileOutputStream(file);
   fos.write("xxx".getBytes());
   fos.close();
  2、從SD卡中讀取檔案
   File file = new File(Environment.getExternalStorageDirectory(),"xx.txt");
   FileReader fr = new FileReader(file);
   BufferedReader br = new BufferedReader(fr);
   String info = br.readLine();
  3、在資訊清單檔中添加訪問SD卡的許可權
   寫SD卡
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
   讀SD卡
   <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 3、SharedPreferences儲存和讀取資料
  儲存資料
  SharedPreferences sp = getSharedPreferences("xxx",0);
  sp.edit.putString("Key","Value").commit;
  讀取資料
  String data = sp.getString("Key","預設值");
 4、XML檔案的建立與解析
  1、建立XML檔案
   1、初始化一個xml檔案的序列化器
   XmlSerializer serializer = XML.newSerializer();
   2、初始化序列器參數
   File file = new File(Environment.getExternalStorageDirectory(),"backup.xml");
   FileOutputStream fos = new FileOutputStream(file);
   serializer.setOutput(fos,"UTF-8");
   //3.開始寫xml檔案.
   serializer.startDocument("UTF-8", true);
   serializer.startTag(null, "smss");
   //開始寫body節點
   serializer.startTag(null, "body");
   serializer.text(info.getBody());
   //body節點結束
   serializer.endTag(null, "body");
   //smss根節點結束
   serializer.endTag(null, "smss");
   //xml 結束
   serializer.endDocument();
   fos.close();
  2、解析XML檔案
   /**
   * 解析伺服器返回的資料 擷取天氣資訊
   * @param is 伺服器返回的包含天氣資訊的流 (xml)
   * @return
   */
  public static List<Channel> getAllWeatherInfos(InputStream is) throws Exception{
   List<Channel> channels = null;
   Channel channel = null;
   //1.擷取xml解析器
   XmlPullParser parser = Xml.newPullParser();
   //2.設定xml解析器的參數
   parser.setInput(is, "utf-8");
   //3.開始解析xml檔案.
   
   int type = parser.getEventType();// 擷取當前的事件的類型
   while (type!=XmlPullParser.END_DOCUMENT){ //需要讓pull解析器解析到檔案的末尾
    switch (type) {
    case XmlPullParser.START_TAG:
     if("weather".equals(parser.getName())){//總的開始節點
      channels = new ArrayList<Channel>(); //初始化集合
     }else if("channel".equals(parser.getName())){//某個城市的資訊開始了.
      channel = new Channel();
      //擷取到id的屬性值
      String id = parser.getAttributeValue(0);
      channel.setId(Integer.parseInt(id));
      //解析city節點
     }
     break;
    //判斷xml的結束節點
    case XmlPullParser.END_TAG:
     if("channel".equals(parser.getName())){
      //把解析的內容加入到集合中
      channels.add(channel);
      channel = null;
     }
     break;
    }
    type = parser.next();
   }
   is.close();
   return channels;//把所有的頻道的集合返回回去
   }
第三天:
 1、建立資料庫的步驟
  建立一個類繼承SQLiteOpenHelper
   //建立資料庫
  DBHelper helper = new DBHelper(this, "account.db", null, 1);
     onCreate是在資料庫建立的時候調用的,主要用來初始化資料表結構和插入資料初始化的記錄    
  onUpGrade是在資料庫版本升級的時候調用的,主要用來改變表結構
  1、插入資料
   ContentValues values = new ContentValues();
   values.put("name", "zhangsan");
   long rowId =  db.insert("person", null, values);
  2、查詢資料
   Cursor cursor = db.query("person", new String[]{"id","name" }, null, null, null, null, null);
   while(cursor.moveToNext()){
    int id = cursor.getInt(0);
    String name = cursor.getString(1);
    System.out.println("id="+id+"; name="+name);
   }
  3、更新資料
   ContentValues values = new ContentValues();
   values.put("name", "wangwu");
   db.update("person", values, "id=?", new String[]{"1"});
  4、刪除資料
   db.delete("person", "id=?", new String[]{"2"});
 2、ListView的使用
  1、得到ListView對象
  2、lv.setAdapter(new MyAdapter())填充資料
  3、建立一個類繼承BaseAdapter並實現未實現的方法
   主要是getCount和getView
   TextView tv_id = (TextView) view.findViewById(R.id.tv_id);
   TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
   Person p = list.get(position);
   tv_id.setText(p.getId()+"");
   tv_name.setText(p.getName());
   return view;
第四天:
 1、網狀圖片查看器
  1、發送請求
   1、建立一個URL對象
    URL url = new URL(path);
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
   2、佈建要求頭資訊
    conn.setRequestMethod("GET");
    conn.setConnectTimeout(3000);
  2、伺服器返回資料
   1、判斷狀態代碼200 ok,404 沒有找到資源、503、509 伺服器端錯誤
    conn.getResponseCode();
   2、解析伺服器返回的位元據
    InputStream is = conn.getInputStream();
    String data = StreamTools.readStream(is);
   3、把圖片顯示在控制項上
    Message msg = Message.obtain();
    msg.obj = data;
    handler.sendMessage(msg);
    private Handler handler = new Handler(){
     public void handleMessage(android.os.Message msg) {
     String data = (String) msg.obj;
     
     tv_content.setText(data);
     };
    };
   4、添加訪問互連網的許可權:
    <uses-permission android:name="android.permission.INTERNET"/>
 2、線程不能修改UI介面
  activity中的onCreate方法和點擊事件的方法都是運行在主線程中的
  只有建立UI介面的那個線程才能修改UI Only the original thread that created a view hierarchy can touch its views.
  主線程(UI線程):只有主線程才能修改UI,如果子線程修改UI,系統驗證當前線程是不是主線程,如果不是主線程,就會終止運行
  runOnUiThread
    3、訊息處理機制的原理
  步驟:
   1、主線程中建立handler
    private Handler handler = new Handler(){};
   2、線上程中得到handler的引用,調用發送訊息的方法
    Message msg = new Message();
    msg.obj = bm;
    handler.sendMessage(msg);
   3、handler修改UI介面
    public void handleMessage(Message msg){
     super.handleMessage(msg);
     //2、handler修改UI介面
     Bitmap bm = (Bitmap) msg.obj;
     iv.setImageBitmap(bm);
    }
  Handler、Message、Looper(訊息處理機制的原理):
   前提知識
    所有使用UI介面的作業系統,後台都運行著一個死迴圈,在不停的監視和接受使用者發送的指令,一旦接受指令就立即執行
    當我們的Android應用程式的進程一建立的時候,系統就給這個進程提供了一個Looper
    Looper是一個死迴圈,它內部維護這個一個訊息佇列,Loop不停地從訊息佇列中取訊息(Message),取到訊息就發送給了Handler,最後Handler根據接收到的訊息去修改UI。
   
 4、使用POST方式提交資料
  業務情境:
   1、使用者登入
   2、檔案上傳
  1、佈建要求頭資訊POST、Content-Length:
    conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
   //必須添加的兩個要求標頭資訊
    conn.setRequestProperty("Content-Length", data.length()+"");
   conn.setRequestMethod("POST");
     2、設定把資料提交到伺服器端:
    conn.setDoOutput(true);
    //把資料寫到伺服器端
   conn.getOutputStream().write(data.getBytes());
     缺點:
   1、代碼複雜
     優點:
   1、安全;
   2、提交大量的資料
第五天: 
 1、使用POST方式提交資料是的中文亂碼解決方案
  解決辦法:使用用戶端和伺服器兩邊的字元集編碼保持一致。UTF-8,
 2、 使用GET方式提交資料的中文亂碼的解決方案
  使用URLEncoder.encode(name,"UTF-8")進行url編碼:
  String path = "http://192.168.22.136:8080/web/servlet/LoginServlet?username="+URLEncoder.encode(name,"UTF-8")+"&password="+URLEncoder.encode(pwd,"UTF-8"); 
 3、 
第六天:
 1、顯和隱式意圖的區別
  顯只能開啟自己應用程式中的介面
  隱式意圖可以開啟別的應用程式的介面
 2、意圖的設計的目的
  解耦,實現應用程式的高內聚、低耦合.保證應用程式之間能夠相互獨立運行,又能彼此相互調用
  保證自己寫代碼能夠重複使用
  結構師:保證項目多快好省的把項目做完
 3、Activity的生命週期
  onCreate:在activity被建立的時候調用,初始化介面
  onStart:當介面可見的時候調用
  onResume:按鈕可以被點擊的時候
  onPause:按鈕失去焦點的時候
  onStop:介面不可見的時候調用
  onDestroy:銷毀activity執行個體
  1、activity建立時調用onCreate、onStart、onResume;
  2、關閉activity時調用:onPause、onStop、onDestroy;
  3、最小化activity時調用:onPause、onStop;
  4、最小後重新打時調用:onRestart、onStart、onResume;
 4、啟動模式
  singletop:單一頂部模式在activity的設定檔中設定android:launchMode="singleTop"
   如果任務棧的棧頂存在這個要開啟的activity,不會重新的建立activity,而是複用已經存在的activity。保證棧頂如果存在,不會重複建立。
   應用情境:瀏覽器的書籤
  singletask:單一任務棧,在當前任務棧裡面只能有一個執行個體存在
   如果有執行個體存在,則清空這個執行個體上面的所有別的activity,並複用這個執行個體
   應用情境:瀏覽器的activity
  singleInstance:啟動模式非常特殊,activity會運行在自己的任務棧裡面,並且這個任務棧裡面只有一個執行個體存在
   如果你要保證一個activity在整個手機作業系統裡面只有一個執行個體存在,使用singleInstance
   應用情境: 來電頁面   有道詞典
第七天:
 如何建立廣播
  1、建立一個類,繼承BroadcastReceiver類,並重寫onReceive方法
  2、在資訊清單檔中註冊
   <receiver android:name="包名.類名" />
  3、在意圖過濾器中指定要過濾的內容
   <intent-filter >
      <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
   </intent-filter>
  4、自訂廣播
   1、建立一個傳遞訊息的意圖對象
    Intent intent = new Intent();
   2、設定要廣播的事件類型
    intent.setAction("自訂包名");
   3、設定廣播的訊息資料
    intent.putExtra("Key","Value");
   4、發送一個廣播
    sendBroadcast(intent);
  5、發送有序廣播
   Intent intent = new Intent();
   intent.setAction("com.itheima.orderedbroadcast.ZYFFNTBT");
   //發送一個有序的廣播
   //intent 意圖
   //permission 指定接收者需要添加了許可權
   //resultReceiver 指定哪個廣播接收者最後接到訊息
   //scheduler 訊息處理器
   //initialCode 給訊息指定初始代碼
   //initialData 指定訊息的資料
   //initialExtras 指定額外的參數
   sendOrderedBroadcast(intent, null, null, null, 1, "廣播內容..", null);
   廣播接收者的設定檔:
    <receiver android:name="com.itheima.zf.ProvinceBroadCastReceiver">
      <intent-filter android:priority="1000" >
       <action  android:name="com.itheima.orderedbroadcast.ZYFFNTBT"/>
      </intent-filter>
    </receiver>
   廣播接收者的代碼:
  
   String info = getResultData();
   System.out.println("---------廣播內容:"+info);
   修改廣播內容
   setResultData("國務院開始發放2014年農田補貼:400元");
第八天:
 1、什麼是服務
  Windows下的服務:沒有介面、長期運行在背景應用程式
  Android下的服務:應用程式的一個組件,沒有介面activity,長期運行在後台
  進程:是應用程式啟動並執行載體
  進程與應用程式直接的關係:Linux作業系統建立一個進程,這個進程負責運行dalvik虛擬機器,Android的應用程式都是運行在dalvik虛擬機器上的
 2、進程的生命週期
  1、應用程式一啟動的時候就建立了進程
  2、當應用程式退出的時候進程並沒有退出
  3、只有手工停止這個進程,進程才會結束
  瞭解:作業系統盡量長時間運行應用程式的進程,為了保證記憶體空間不被大量佔用,它會按照進程的優先順序,從低到高一級一級的殺死進程,直到記憶體空間被清理的差不多為止
 3、進程的等級
  1、Foreground process(前台進程)
   應用程式,使用者正在操作,activity的onResume方法被執行了,可以響應點擊事件
  2、Visible process(可視進程)
   應用程式的UI介面,使用者還可以看到,但是不能操作了
  3、Service process(服務進程)
   應用程式沒有介面,但是有一個背景服務還處於運行狀態
  4、Background process(後台進程)
   應用程式沒有服務處於運行狀態,應用程式被最小化了,activity執行了onStop方法
  5、Empty process(空進程)
   沒有任何組件運行,所有的activity都關閉了,任務棧清空了
 4、服務的特點
  服務被建立時調用onCreate、onStartCommand
  服務只能被建立一次,可以開啟多次onStartCommand
  服務只能被停止一次
  沒有onPause、onStop、onResume、onRestart方法,因為service沒有介面,長期運行在後台。
 5、bind方式開啟服務的生命週期
  bindService綁定服務、unBindService解除綁定的服務
  服務是在被綁定的時候被建立,調用onUnbind、onDestrory方法,如果多次解除綁定會拋出異常
  推薦的方式:
  startService:開啟並建立一個服務,服務長期運行在後台;
  bindService:綁定服務,可以調用服務裡面的方法;
  unBindService:解除服務,停止服務裡面的方法;
  stopService:停止服務,銷毀服務物件;
 08_遠程服務aidl的寫法(重點)
  本地服務:寫在自己的應用程式的工程裡的服務 ,使用自己應用程式的進程運行這個服務;
  遠程服務:寫在別的應用程式的工程裡的服務,使用別的應用程式的進程運行這個服務(安裝在同一個手機上的應用程式);
  IPC: Inter Process Communication(進程間的通訊);
  aidl: Android Interface definition language 安卓介面定義語言;
  aidl的介面類裡面不需要public 、protected、private 等修飾符,預設是公開共用;
  步驟:
  1、建立一個服務的介面類,裡麵包含需要對外暴露的商務邏輯方法: 
  2、讓服務中的中間人實現了服務的介面類: 
  3、修改並拷貝介面檔案:
  4、在本地服務的工程中的activity裡,綁定服務:
  5、通過介面調用遠程服務的方法: 
第九天:
 1、如何使用內容提供者
  定義類繼承 ContentProvider,根據需要重寫內部方法
 2、在資訊清單檔的<application>節點下進行配置,<provider標籤中需要>
  
第十天:
 1、在記憶體中建立原圖的副本
  1、得到原圖
   Bitmap srcPic = BitmapFactory.decodeResource(getResources(), R.drawable.meinv);
  2、建立一個空白的紙張,參考原圖
    Bitmap copyPic = Bitmap.createBitmap(srcPic.getWidth(), srcPic.getHeight(), srcPic.getConfig()); 
  3、建立一個畫板,參考空白紙張
   Canvas canvas = new Canvas(copyPic);
  4、建立一個畫筆 
   Paint paint = new Paint();
   //預設是使用黑色,後面會根據原圖的顏色畫畫
   paint.setColor(Color.BLACK);
  5、在畫板上畫畫
   canvas.drawBitmap(srcPic, matrix,paint);
  6、為控制項設定圖片
   iv.setImageBitmap(copyPic);
  
  1、獲得裝置螢幕的解析度
   WindowManager wm = getSystemService(WINDOW_SERVICE);
   獲得裝置解析度對象
   Display display = wm.getDefaultDisplay();
  按照比例值縮放圖片
           opts.inJustDecodeBounds = false;
           opts.inSampleSize = scale; // 1/scale * 1/scale
           Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/lp.jpg", opts);

Android核心基礎學習進程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.