第四章 Android開發三大基石—Activity、Service和Handler(5)

來源:互聯網
上載者:User

標籤:android   android平台   android應用   android開發   

2)和Activity互動的本地服務

剛剛我們介紹的Service是不需要與Activity進行互動的,現在我們再來看看與Activity互動的本地服務。首先,我們建立一個BindLocalServide類繼承自Serivce,代碼如下:

// import略

public class BindLocalServideextends Service {

 

    private static final String TAG = "localservice";

    private MyBinder myBinder = new MyBinder();

   

    @Override

    public IBinder onBind(Intent intent) {

        return myBinder;

    }

    @Override

    public void onCreate() {

        super.onCreate();

    }

    @Override

    public void onDestroy() {

        super.onDestroy();

    }

    @Override

    public void onStart(Intent intent, int startId) {

        super.onStart(intent, startId);

    }

    @Override

    public boolean onUnbind(Intent intent) {

        return super.onUnbind(intent);

    }

 

    public class MyBinder extends Binder{

        public LocalService getService(){

            return LocalService.this;

        }

    }

}

 

然後,我們建立一個BindServiceActivity類繼承自Actvity,代碼如下:

// import略

public class BindServiceActivity extends Activity{

 

     private Button startBtn,stopBtn;

     private boolean flag;

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.localservice);

        startBtn = (Button)findViewById(R.id.start_button);

        stopBtn = (Button)findViewById(R.id.stop_button);

        startBtn.setOnClickListener(new View.OnClickListener() {

             @Override

             public void onClick(View v) {

                 Intent intent = new Intent(BindServiceActivity.this,LocalService.class);

                bindService(intent, conn, Context.BIND_AUTO_CREATE);

             }

        });

        stopBtn.setOnClickListener(new View.OnClickListener() {

             @Override

             public void onClick(View v) {

                 if(flag == true){

                    unbindService(conn);

                    flag = false;

                }

             }

        });

    }

    private ServiceConnection conn = new ServiceConnection() {

        @Override

        public void onServiceDisconnected(ComponentName name) {

           

        }

 

        @Override

        public void onServiceConnected(ComponentName name, IBinder service) {

             MyBinder binder = (MyBinder)service;

            LocalService bindService = binder.getService();

            bindService.MyMethod();

            flag = true;

        }

    };

}

 

在這裡,也是使用之前使用過的localservice.xml布局檔案,定義了“啟動”和“停止”兩個按鈕。另外,別忘了在AndroidMainfest.xml中註冊Service:

<service android:name=". BindLocalServideextends "/>

 --------------------------------------------試著放個廣告 現在沒工作 要生存 沒辦法平安陸金所 隸屬於平安集團的p2p平台年投資報酬率7%-9% 是替代銀行理財的首選個人經驗教訓 推薦投資安鑫或者有擔保的彩虹項目不要投資安e 那個幾乎無法轉讓 想提前提現非常困難註冊連結 http://affiliate.lufax.com/action/36XBU用此連結註冊 你我都會有幾十元的額外現金獎勵--------------------------------------------

這裡可以發現onBind需要返回一個IBinder對象。也就是說和上一例子LocalService不同的是:

1)添加了一個public內部類繼承Binder,並添加getService方法來返回當前的Service對象;

2)建立一個IBinder對象——new那個Binder內部類;

    3)onBind方法返還那個IBinder對象。

然後,我們來看看列印出來的效果,4-8所示:

圖4-8 onBind Service執行順序

 

通過日誌,我們可以發現,通過bindService這種方法啟動服務,當服務啟動後,多次啟動只有第一次有效,並且與服務相綁定的Activity“死亡”時,該服務也停止。

4.2.4開機自啟動的服務

我們在使用某些Android應用的時候,可能會發現安裝了某個應用之後,會有一些服務也會隨之運行。而且,有的服務每次都會隨著手機開機而自動啟動。下面,就讓我們一起來看看是怎麼樣實現開機自啟動服務的。

首先,我們需要來瞭解一下Android中的 BroadcastReceiver:

BroadcastReceiver也就是“廣播接收者”的意思,顧名思義,它就是用來接收來自系統和應用中的廣播。

在Android系統中,廣播應用在方方面面。例如當開機完成後系統會產生一條廣播,接收到這條廣播就能實現開機啟動服務的功能;當網路狀態改變時系統會產生一條廣播,接收到這條廣播就能及時地做出提示和儲存資料等操作;當電池電量改變時,系統會產生一條廣播,接收到這條廣播就能在電量低時告知使用者及時儲存進度,等等。

正是基於這樣的原理,只要實現一個BroadcastReceiver,我們就可以監聽開機時候的廣播(手機啟動完成的事件ACTION_BOOT_COMPLETED),當收到開機“訊號”時,啟動相應的服務。

我們用一個簡單的例子來看看它是如何?的。

首先,我們建立一個MyReceiver類繼承自BroadcastReceiver,代碼如下:

// import略

public class MyReceiver extends BroadcastReceiver {

 

private static final String POWERN_ON_ACTION = "android.intent.action.BOOT_COMPLETED";

 

    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals(POWERN_ON_ACTION)) {

        startService(new Intent("com.char4.LOCAL_SERVICE"));       

}

    }

}

 

我們要讓這個Receiver工作,需要把它註冊到Android系統上,去監聽廣播的BOOT_COMPLETED intent。在AndroidManifest.xml中添加如下代碼:

<receiver android:name=".MyReceiver" >

      <intent-filter>

            <action android:name="android.intent.action.BOOT_COMPLETED"/>

      </intent-filter>

</receiver>

 

這樣重新開機以後,服務就會在系統啟動完畢後自動運行了。

第四章 Android開發三大基石—Activity、Service和Handler(5)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.