Android后臺運行的解決方案,不需要交互,長期運行。
服務基礎框架:
public class MyService extends Service {
public MyService() { ??
}
????@Override
public IBinder onBind(Intent intent) {
????//activity與service交互(需要繼承)
????????// TODO: Return the communication channel to the service.
????????throw new UnsupportedOperationException("Not yet implemented");
????}
????public void onCreate(){
????????//創建服務時定義
????????super.onCreate(); ??}
????public int onStartCommand(Intent intent,int flags,int startId)
????{
????????//啟動服務時調用
????????return super.onStartCommand(intent,flags,startId);
????}
????public void onDestroy(){
????????//銷毀服務時調用
????????super.onDestroy();
} ??}
Android多線程:
方法一:
①繼承Thread,重寫run()方法
Class MyThread extends Thread{
Public void run( ){ // 處理具體的邏輯}
}
②啟動線程,new ?MyThread( ).start( );
方法二: ??????????????????????????
①使用Runable 接口定義線程
Class MyThread implements Runnable{
Public void run( ) {// 處理具體的邏輯 }
}
②啟動線程,
MyThread myThread = new MyYhread( );
New Thread(my Thread ).start( );
匿名類簡寫:
在子線程中更新UI:
??如果直接在子線程中修改UI會導致系統崩潰,因為UI線程是不安全的。所以采用異步消息處理機制。示例:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
????public ?static final int UPDATE_TEXT=1;
????private TextView text;
????private Handler handler = new Handler(){
??????public void ?handleMessage(Message msg)
??????{
??????????switch (msg.what){
??????????????case UPDATE_TEXT:
??????????????????//UI修改部分
??????????????????text.setText("NICE TO MEET YOU");
??????????????????break;
??????????????default:
??????????????????break; ????}???????}????????};
????@Override
????protected void onCreate(Bundle savedInstanceState) {
????????super.onCreate(savedInstanceState);
????????setContentView(R.layout.activity_main);
????????text = (TextView) findViewById(R.id.text);
????????Button changeText= (Button) findViewById(R.id.change_text);
????????changeText.setOnClickListener(this);
????}
????@Override
????public void onClick(View v) {
????????if (v.getId() == R.id.change_text) {
????????????new Thread(new Runnable() {
????????????????@Override
????????????????public void run() {
????????????????????Message message = new Message();
????????????????????message.what = UPDATE_TEXT;
????????????????????handler.sendMessage(message);
????????????????}
????????????}).start();
????????}
????}
}
異步消息處理機制:主要由4個部分組成:Message、Handler、MessageQueue和Looper。
Message是在線程之間傳遞的消息,它可以在內部攜帶少量的信息,用于在不同線程之間交
換數據。上一小節中我們使用到了Message的what字段,除此之外還可以使用arg1和arg2字段來攜帶一些整型數據,使用obj字段攜帶一個 object對象。
Handler顧名思義也就是處理者的意思,它主要是用于發送和處理消息的。發送消息一般是
使用Handler 的sendMessage()方法, 而發出的消息經過一- 系列地輾轉處理后,最終會傳遞到Handler的handleMessage()方法中。
MessageQueue是消息隊列的意思,它主要用于存放所有通過Handler發送的消息。這部分消息會一直存在于消息隊列中,等待被處理。每個線程中只會有一個MessageQueue對象。
Looper是每個線程中的MessageQueue的管家,調用Looper的loop()方法后,就會進入到
一個無限循環當中,然后每當發現MessageQueue中存在一條消息,就會將它取出,并傳遞到Handler的handleMessage()方法中。每個線程中也只會有一個Looper對象。
異步消息封裝工具AsyncTask:
?AsyncTask抽象類,需要子類繼承,一共三個泛型
簡單定義AsyncTask:
Class DownloadTask extends AsynTask<Void, Integer, Boolean >{....}
這里我們把AsyncTask的第-一個泛 型參數指定為Void,表示在執行AsyncTask的時候不需
要傳人參數給后臺任務。第二個泛型參數指定為Integer,表示使用整型數據來作為進度顯示單位。第三個泛型參數指定為Boolean, 則表示使用布爾型數據來反饋執行結果。
經常需要重寫onPreExecute( ),doInBackground(params.. ),
?onProgressUpdate(params.. ), ?onPostExecute(Result)
前臺服務:會一直有一個正在運行的圖標在系統狀態欄顯示。
IntentService類封裝了自動開啟線程,調用stopSelf( )方法。