編輯:關於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與線程的結合進行
AsyncTask task=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 中SP與DP的區別實例詳解
從一開始寫Android程序,就被告知這些常識1.長度寬度的數值要使用dp作為單位放入dimens.xml文件中2.字體大小的數值要使用sp作為單位,也放入dimens.
Android 自定義控件之可多選課程日歷CalendarView
效果圖開發環境IDE版本:AndroidStudio2.0物理機版本:Win7旗艦版(64位)前言最近的項目中用到了一個課程選擇的日歷View,於是在網上搜了搜自定義日歷
Android中解析Json數據
一、原理分析 package com.njupt.action; import java.io.IOException; import java.io.Pr
Android 屬性動畫Property Animation
1、概述Android提供了幾種動畫類型:View Animation 、Drawable Animation 、Property Animation 。View Ani