更加省心的服務,IntentService的使用


通過前兩篇文章的學習,我們知道了服務的代碼是默認運行在主線程里的,因此,如果要在服務里面執行耗時操作的代碼,我們就需要開啟一個子線程去處理這些代碼。比如我們可以在 onStartCommand方法里面開啟子線程來處理耗時代碼。

    public int onStartCommand(Intent intent, int flags, int startId) {
        
        Thread thread = new Thread(){
            @Override
            public void run() {
                
                /**
                 * 耗時的代碼在子線程里面寫
                 */
                
            }
        };
        thread.start();
        
        return super.onStartCommand(intent, flags, startId);
    }

但是,我們都知道,服務一旦啟動,就會一直運行下去,必須調用stopService()或者stopSelf()方法才能讓服務停止下來。所以,我們來修改一下run方法

 public void run() {
                
                /**
                 * 耗時的代碼在子線程里面寫
                 */
                stopSelf();
                
            }

就這樣,我們很容易的就在服務里面開啟了一個線程,然后在代碼最后面加上stopSelf();這樣就可以在代碼運行結束的時候,結束服務了。但是這樣對於我們開發者來說,是不是有些麻煩呢,確實有點麻煩,比如你有時候忘記了開啟線程呢?或者忘記了調用stopSelf()?所以,谷歌給我們一個很好的類,通過這個類我們就可以不用管這些東西,因為這個類已經幫我們實現了在子線程中操作代碼了。同時,但子線程代碼執行完畢,這個服務會自動銷毀,不用再占用內存資源。所以,我們通過這個類,就可以不用去開啟線程,也不用去銷毀這個服務。因為,這個類都幫我們處理好了。這個類就是IntentService。這個類的使用和Service大同小異,但是比Service更加省心,更加方便。下面我們直接看代碼吧,我習慣在代碼中講解。

布局文件就是一個按鈕而已,先看布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    
    <Button 
        android:id="@+id/bt_start" 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    

</LinearLayout>
intentservice.xml

和Service一樣,使用的話,要在清單文件中

 <service android:name="com.example.mydemo.intentservice.MyIntentService"></service>
View Code

然后是服務類

package com.example.mydemo.intentservice;

import android.annotation.SuppressLint;
import android.app.IntentService;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.widget.Toast;

/**
 *************************************************************** 
 * 
 * @版權 LinFeng
 * 
 * @作者 LinFeng
 * 
 * @版本 1.0
 * 
 * @創建日期 2016-6-10
 * 
 * @功能描述 
 ***************************************************************** 
 */

/**
 * 注意,繼承的是 IntentService而不是Service哦,還有,既然是服務,那么就必須在清單文件里面注冊
 */
public class MyIntentService extends IntentService {
    
    
    
    @SuppressLint("HandlerLeak") 
    Handler handler = new Handler(){
        
        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(MyIntentService.this, "IntetnService Running", Toast.LENGTH_SHORT)
            .show();
            super.handleMessage(msg);
            
        }
    };

    /**
     * 使用Eclipse如果沒有添加這個無參構造函數的話會報一個運行時錯誤: java.lang.InstantiationException
     */
    public MyIntentService() {
        /**
         * 這里只需要傳入一個字符串就可以了
         */
        super("MyIntentService");

    }

    /**
     * 必須實現的抽象方法,我們的業務邏輯就是在這個方法里面去實現的 在這個方法里實現業務邏輯,我們就不用去關心ANR的問題
     */
    @Override
    protected void onHandleIntent(Intent intent) {
        
        /**
         * 因為這個方法是在子線程里面處理的,所以這里我們不能直接在子線程里面彈Toast
         * 我們這里使用handler來幫助我們處理Toast
         */
        handler.sendEmptyMessage(0);
    }

    /**
     * 為了驗證onHandleIntent執行后,服務會不會自動銷毀,我們在這里重寫onDestroy方法
     * 如果會自動銷毀,那么在"IntetnService Running"出現后,應該會出現"IntetnService Stop"
     */
    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "IntetnService Stop", Toast.LENGTH_SHORT).show();
    }

}
MyIntentService

然后就是主界面類,主界面類也沒干啥事情,就是按鈕點擊事件,點擊后啟動服務,啟動IntentService和啟動普通的Service沒有差別,都是通過意圖來啟動的。

package com.example.mydemo.intentservice;

import com.example.mydemo.R;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

/**
 *************************************************************** 
 * 
 * @版權 LinFeng
 * 
 * @作者 LinFeng
 * 
 * @版本 1.0
 * 
 * @創建日期 2016-6-10
 * 
 * @功能描述 
 ***************************************************************** 
 */
public class IntentServiceActivity extends Activity{
    
    private Button btButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.intentservice);
        
        btButton = (Button) findViewById(R.id.bt_start);
        btButton.setText("Start IntentService");
        
        btButton.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(IntentServiceActivity.this,MyIntentService.class);
                startService(intent);
            }
        });
    }
    

}
IntentServiceActivity

然后就是運行截圖了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM