編輯:關於Android編程
時間匆匆,轉眼就是大半個月過去了,學習android的道理上艱苦而漫長呀!!自己寫了很多的小demo,總結總結,也在博客裡面留點足跡吧!
源代碼下載:http://download.csdn.net/detail/harderxin/7761401 參考實例:老羅博客
實現功能:統計計數,我們可能有很多種方式來實現它,但是這個實例運用了Activity、Service、BroadcastReceiver在android中三個大知識點,所以覺得它比較有參考價值;
可學知識點:1)Activity、Service的生命周期;2)bindService的用法;3)代碼注冊BroadcastReceiver;4)學習使用異步加載類AsyncTask
功能邏輯:參考下面流程圖:
啟動Activity後,在相應的Activity生命周期中綁定Service和注冊廣播接收者,當用戶點擊按鈕時,啟動AsyncTask異步處理邏輯,也就是加數,然後將結果時時發送到廣播中,廣播接收者接到廣播後時時更新Activity;
實現功能:
功能詳解:因為有源代碼,所以我只講解該小應用的核心代碼:
1)啟動Activity,綁定Service
//通過bindService方法會將計數器服務CounterService啟動起來 //serviceConn為ServiceConnection的一個實例,服務器啟動起來後 //系統會調用ServiceConnection裡面的onServiceConnected方法將Service中 //的CounterBinder對象傳回來,得到相應的Service //當我們調用unBindService停止服務時,會調用其onServiceDisconnected方法 Intent bindIntent=new Intent(MainActivity.this,CounterService.class); bindService(bindIntent, serviceConn, Context.BIND_AUTO_CREATE);
//創建Service連接對象 private ServiceConnection serviceConn=new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { counterService=null; Log.i(TAG, "Counter Service Disconnected"); } @Override public void onServiceConnected(ComponentName name, IBinder service) { counterService=((CounterService.CounterBinder)service).getService(); Log.i(TAG, "Counter Service Connected"); } };在Service中創建與Activity打交道的Binder對象:
//Activity和Service的關聯紐帶 public class CounterBinder extends Binder{ public CounterService getService(){ return CounterService.this; } } private final IBinder binder=new CounterBinder(); //當系統調用bindService時候,該方法會被執行,返回一個自定義的Binder對象給系統 @Override public IBinder onBind(Intent arg0) { Log.i(TAG,"Counter Service onBind"); return binder; }
//創建一個廣播對象,接收從CounterService中發送過來的廣播信息,並將相應的信息顯示在界面上 private BroadcastReceiver counterActionReceiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int counter=intent.getIntExtra(CounterService.COUNTER_VALUE, 0); count=counter; counterText.setText(count+""); Log.i(TAG, "Receive counter event"); } }; @Override protected void onResume() { super.onResume(); Log.i(TAG, "MainActivity onResume"); //注冊一個廣播接收器,該廣播接收器指定了只對CounterService.BROADCAST_COUNTER_ACTION //類型的廣播感興趣,當CounterService發送一個廣播後sendBroadcast,該廣播就會被counterActionReceiver //中的onReceive函數接收處理 //這裡是通過代碼的形式注冊我們的廣播,我們也可以在xml中進行相應的注冊 IntentFilter counterActionFilter=new IntentFilter(CounterService.BROADCAST_COUNTER_ACTION); registerReceiver(counterActionReceiver, counterActionFilter); }
public void startCounter(int initVal) { //使用異步進行後台計數 //為什麼使用它?因為這個計數的過程我們可以將其類比一個耗時的計算邏輯,耗時的操作則不能在主線程中進行 //否則會出現ANR(Application not responding)現象 //也可以使用Handler與線程的結合進行 AsyncTasktask=new AsyncTask () { @Override protected Integer doInBackground(Integer... params) { Log.i(TAG, "doInBackground execute"); Integer initCounter=params[0]; stop=false; while(!stop){ //調用該方法系統會自動調用onProgressUpdate方法 publishProgress(initCounter); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } initCounter++; } return initCounter; } @Override protected void onProgressUpdate(Integer... values) { Log.i(TAG, "onProgressUpdate execute"); super.onProgressUpdate(values); int counter=values[0]; //將時時更新的值廣播出去 Intent intent=new Intent(BROADCAST_COUNTER_ACTION); intent.putExtra(COUNTER_VALUE, counter); sendBroadcast(intent); } @Override protected void onPostExecute(Integer result) { Log.i(TAG, "onPostExecute execute"); int counter=result; //將時時更新的值廣播出去 Intent intent=new Intent(BROADCAST_COUNTER_ACTION); intent.putExtra(COUNTER_VALUE, counter); sendBroadcast(intent); } }; task.execute(initVal); }
@Override public void onReceive(Context context, Intent intent) { int counter=intent.getIntExtra(CounterService.COUNTER_VALUE, 0); count=counter; counterText.setText(count+""); Log.i(TAG, "Receive counter event"); }因為AsyncTask的實例化和啟動必須在UI線程中,也就是說在主線程中,該程序中,Activity和Service同在主線程中,所以我們能夠在Service中實例化和啟動AsyncTask!
從一開始寫Android程序,就被告知這些常識1.長度寬度的數值要使用dp作為單位放入dimens.xml文件中2.字體大小的數值要使用sp作為單位,也放入dimens.
效果圖開發環境IDE版本:AndroidStudio2.0物理機版本:Win7旗艦版(64位)前言最近的項目中用到了一個課程選擇的日歷View,於是在網上搜了搜自定義日歷
一、原理分析 package com.njupt.action; import java.io.IOException; import java.io.Pr
1、概述Android提供了幾種動畫類型:View Animation 、Drawable Animation 、Property Animation 。View Ani