Anroid四大組件service之本地服務

         服務是Android四大組件之一,與Activity同樣,表明可執行程序。但Service不像Activity有可操做的用戶界面,它是一直在後臺運行。用通俗易懂點的話來講:android

若是某個應用要在運行時向用戶呈現可操做的信息就應該選擇Activity,若是不是就選擇Service。app

Service的生命週期以下:ide

Service只會被建立一次,也只會被銷燬一次。那麼,如何建立本地服務呢?this

 

 

實現代碼以下:spa

package temp.com.androidserivce;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.SystemClock;
import android.support.annotation.Nullable;
import android.util.Log;

/**
 * Created by Administrator on 2017/8/18.
 */

public class Myservice extends Service {
    @Override
    public void onCreate() {
        Log.i("test", "服務被建立");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.i("test", "服務被啓動");
        new Thread(new myRunnable(startId)).start();
        return super.onStartCommand(intent, flags, startId);

    }

    @Override
    public void onDestroy() {
        Log.i("test", "服務被銷燬");
        super.onDestroy();
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    class myRunnable implements Runnable {
        int startId;

        public myRunnable(int startId) {
            this.startId = startId;
        }

        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                SystemClock.sleep(1000);
                Log.i("test", i + "");
             }
            //中止服務
            //stopSelf();
            stopSelf(startId);
            //當用無參數的中止服務時,將會銷燬第一次所啓動的服務;
            //當用帶參數的中止服務時,將會銷燬最末次所啓動的服務;

        }
    }
}

要聲明服務,就必須在manifests中進行配置線程

<manifest ... >
  ...
  <application ... >
      <service android:name=".Myservice" android:exported="true"/>

...

</application>

</manifest>
android:exported="true" 設置了這個屬性就表示別人也能夠使用你的服務。
還有一個須要注意的小點,在Myservice中能夠看見我啓動時用了一個子線程去幫我實現工做,那麼我爲何沒有直接把for循環的那段代碼寫在onStartCommand方法中呢,
是由於寫在onStartCommand
中將會報ANR程序無響應的錯誤。就是當你全部的事情都去交給主線程作時,就會形成主線程內存溢出,它就會炸了。這個時候也能夠用IntentService來取代Service。
package temp.com.androidserivce;

import android.app.IntentService;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;

/**
 * Created by Administrator on 2017/8/18.
 */

public class MyService2 extends IntentService {
    public MyService2() {
        super("");
    }
    public MyService2(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        for (int i = 0; i <10 ; i++) {
            SystemClock.sleep(1000);
            Log.i("test",i+"");
        }
    }
}
 

使用這個相對而言會比較簡單。IntentService是Service的子類。它使用工做線程逐一處理全部啓動請求。code

相關文章
相關標籤/搜索