編輯:關於Android編程
import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.ProgressBar; public class ProgressBarTestActivity extends Activity { private ProgressBar mProgress; private Handler mHandler = new Handler(); protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.progressbar_activity); mProgress = (ProgressBar) findViewById(R.id.progress_bar); Thread thread = new Thread(new Runnable() { public void run() { int progressBarMax = mProgress.getMax(); try { while (progressBarMax != mProgress.getProgress()) { int stepProgress = progressBarMax / 10; int currentprogress = mProgress.getProgress(); final int progress = stepProgress + currentprogress; mHandler.post(new Runnable() { @Override public void run() { mProgress.setProgress(progress); } }); Thread.sleep(1000); } } catch (Exception e) { e.printStackTrace(); } } }); thread.start(); } }
必調用的三個方法:onCreate() –> onStart() –> onResume(),用AAA表示。
- 父Activity(A)啟動,點擊啟動子Activity(B),子Actvity退出,返回父Activity的調用順序如下:
AAA –> onFreeze() –> onPause() –> B onCreate() -> B onStart() -> B onResume –> onStop() –> onRestart() –> onStart()->onResume()
- 用戶點擊Home,Actvity調用順序如下:
AAA –> onFreeze() -> onPause() –> onStop() — Maybe –> onDestroy()
- 用戶點擊back鍵,Activity調用順序如下:
AAA-> onPause() –> onStop() –> onDestroy() ->onCreate()->onStart()->onResume()
- 在Activity上顯示dialog, Activity調用順序如下:
AAA -> onPause()
- 在父Activity上顯示透明的或非全屏的activity,Activity調用順序如下:
AAA –> onFreeze() –> onPause()
- 設備進入睡眠狀態,Activity調用順序如下:
AAA –> onFreeze() –> onPause()
onSaveInstanceState()
當你的程序中某一個Activity A在運行時,主動或被動地運行另一個新的Activity B,這個時候A會執行onSaveInstanceState(),如下:
public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong("id", 1234567890); }
B完成以後又回來找A,這個時候就有兩種情況:一是A被回收,二是A沒有被回收,被回收的A就要重新調用onCreate()方法,不同於直接啟動的是這回onCreate()裡是帶上了參數savedInstanceState;而沒被收回的就直接執行onResume(),跳過onCreate()了。
在AndroidManifest.xml 中定義Activity的地方加上主題android:theme=”@android:style/Theme.Dialog”或android:theme=”@android:style/Theme.Translucent”就變成半透明的
Android提供了ContentProvider,一個程序可以通過實現一個ContentProvider的抽象接口將自己的數據完全暴露出去,而且ContentProviders是以類似數據庫中表的方式將數據暴露,也就是說ContentProvider就像一個“數據庫”。那麼外界獲取其提供的數據,也就應該與從數據庫中獲取數據的操作基本一樣,只不過是采用URI來表示外界需要訪問的“數據庫”。外部訪問通過ContentResolver去訪問並操作這些被暴露的數據。所以,創建一個屬於你自己的Content provider或者將你的數據添加到一個已經存在的Content provider中(前提是有相同數據類型並且有寫入Content provider的權限),就可實現共享。
第一步:繼承Service類:
public class SMSService extends Service {}
第二步:在AndroidManifest.xml文件中的節點裡對服務進行配置:
服務不能自己運行,需要通過調用Context.startService()或Context.bindService()方法啟動服務。
- 使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行。
使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止。
如果打算采用Context.startService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onStart()方法。如果調用startService()方法前服務已經被創建,多次調用startService()方法並不會導致多次創建服務,但會導致多次調用onStart()方法。采用startService()方法啟動的服務,只能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
如果打算采用Context.bindService()方法啟動服務,在服務未被創建時,系統會先調用服務的onCreate()方法,接著調用onBind()方法。這個時候調用者和服務綁定在一起,調用者退出了,系統就會先調用服務的onUnbind()方法,接著調用onDestroy()方法。如果調用bindService()方法前服務已經被綁定,多次調用bindService()方法並不會導致多次創建服務及綁定(也就是說onCreate()和onBind()方法並不會被多次調用)。如果調用者希望與正在綁定的服務解除綁定,可以調用unbindService()方法,調用該方法也會導致系統調用服務的onUnbind()–>onDestroy()方法。
onCreate() 該方法在服務被創建時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,服務也只被創建一次。onDestroy()該方法在服務被終止時調用。
與采用Context.startService()方法啟動服務有關的生命周期方法:
onStart() 只有采用Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運行時被調用。多次調用startService()方法盡管不會多次創建服務,但onStart() 方法會被多次調用。
與采用Context.bindService()方法啟動服務有關的生命周期方法:
onBind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。
onUnbind()只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用
在android下,要想接受廣播信息,就需要自己來實現一個廣播接收器,這裡重寫onReceiver()方法,來實現一個信息防火牆:
public class SmsBroadCastReceiverextendsBroadcastReceiver { @Override public void onReceive(Context context, Intentintent) { Bundle bundle = intent.getExtras(); Object[] object = (Object[])bundle.get("pdus"); SmsMessage sms[] = new SmsMessage[object.length]; for(int i = 0;i < object.length;i++) { sms[0] = SmsMessage.createFromPdu((byte[])object); Toast.makeText(context,"來自" + sms.getDisplayOriginatingAddress()+"的消息是:" + sms.getDisplayMessageBody(),Toast.LENGTH_SHORT).show(); } //終止廣播,在這裡我們可以稍微處理,根據用戶輸入的號碼可以實現短信防火牆。 abortBroadcast(); } }
當實現了廣播接收器,還要設置廣播接收器接收廣播信息的類型,這裡是信息:android.provider.Telephony.SMS_RECEIVED
我們就可以把廣播接收器注冊到系統裡面,可以讓系統知道我們有個廣播接收器。這裡有兩種,一種是代碼動態注冊:
//生成廣播處理 smsBroadCastReceiver = new SmsBroadCastReceiver(); //實例化過濾器並設置要過濾的廣播 IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED"); //注冊廣播 BroadCastReceiverActivity.this.registerReceiver(smsBroadCastReceiver,intentFilter);
一種是在AndroidManifest.xml中配置廣播:
兩種注冊類型的區別是:
1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。 2)第二種是常駐型,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。
Android TextView 中當文字比較多時希望它橫向滾動顯示,下面是一種親測可行的方法。效果圖:1.自定義TextView,重寫isFocused()方法返回tr
在網易數據酷的中看到一幅圖,非常有特色,因為最近用Canvas繪了不少圖表,就想用代碼把這幅圖也繪出來。 基本也繪出來了,效果圖如下: 繪制這張圖,a
第4節 Button按鈕是需要與用戶進行互動的控件。Button繼承自TextView,凡是TextView有的特定,它都有。public class Button ex
本文實現如下幾個界面之間的平移動畫實現分析:導航界面移動過程中,平移動畫上一頁移入動畫 (-屏幕寬度,y)------>(0,y)上一頁移出動畫 (0,y)----