android Service基礎(啟動服務與綁定服務)

     Service是Android中一個類,它是Android 四大組件之一,使用Service可以在後臺執行耗時的操作(註意需另啟子線程),其中Service並不與用戶產生UI交互。其他的應用組件可以啟動Service,即便用戶切換瞭其他應用,啟動的Service仍可在後臺運行。一個組件可以與Service綁定並與之交互,甚至是跨進程通信。通常情況下Service可以在後臺執行網絡請求、播放音樂、執行文件讀寫操作或者與contentprovider交互等。

  本文主要講述service服務裡的啟動與綁定服務。

首先,XML程序如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
 
    <Button
        android:id="@+id/start"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="operate"
        android:text="啟動服務" />
 
    <Button
        android:id="@+id/stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="停止服務"
        android:onClick="operate" />
 
    <Button
        android:id="@+id/bind"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="綁定服務"
        android:onClick="operate" />
 
    <Button
        android:id="@+id/unbind"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="解綁服務"
        android:onClick="operate"/>
 
</LinearLayout>

創建一個service類,並寫創建、啟動、綁定、摧毀、解綁五個方法

代碼如下:

package com.example.service;
 
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
 
public class MyService extends Service {
 
    private int i;
    public MyService() {
    }
    //創建
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("TAG","服務創建瞭");
    }
 
    class MyBinder extends Binder {
        //定義自己需要的方法(實現進度監控)
        public int getProcess(){
            return i;
        }
    }
 
 
    //啟動方法
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.e("TAG","服務啟動瞭");
        return super.onStartCommand(intent, flags, startId);
    }
 
    //解綁
    @Override
    public boolean onUnbind(Intent intent) {
        Log.e("TAG","服務解綁瞭");
        return super.onUnbind(intent);
    }
 
    //摧毀
    @Override
    public void onDestroy() {
        Log.e("TAG","服務摧毀瞭");
        super.onDestroy();
    }
 
    //綁定方法
    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
       // throw new UnsupportedOperationException("Not yet implemented");
        Log.e("TAG","服務綁定瞭");
        return new MyBinder();
    }
}

然後在MainActivity裡面寫點擊啟動方法:

public void operate(View v) {
        switch (v.getId()){
            case R.id.start:
                //啟動服務 :創建——啟動——摧毀
                //如果服務已經創建瞭,後續重復啟動,操作的都是同一個服務,不回在創建新 的服務,除非先摧毀他
                Intent it1=new Intent(this,MyService.class);
                startService(it1);
                break;
            case R.id.stop:
                Intent it2=new Intent(this,MyService.class);
                stopService(it2);
                break;
        }
    }

然後寫綁定的方法:

註意:捆綁和解綁的對象應該是同一個對象,如果捆綁與解綁的對象不一樣,則會報如下的錯誤:

Service not registered: com.m1910.servicetest.MainActivity$1@41ddfcc0

本篇文章捆綁與解綁的對象都是conn,定義一個全局變量:

 
    private ServiceConnection conn=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        }
 
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
 
        }
    };

然後寫解綁與捆綁的方法:

case R.id.bind:
                //綁定服務
                Intent it3=new Intent(this,MyService.class);
                bindService(it3,conn,BIND_AUTO_CREATE);
                break;
 
            case R.id.unbind:
                //解綁服務
//                unbindService(conn);
//                if (isBound) {
//                    unbindService(conn);// 解綁服務
//                    isBound = false;
//                }
                    unbindService(conn);//解綁服務
                break;

完整的程序如下:

package com.example.service;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;
import android.view.View;
 
public class MainActivity extends AppCompatActivity {
 
    private boolean isBound = false;
 
    private ServiceConnection conn=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        }
 
        @Override
        public void onServiceDisconnected(ComponentName componentName) {
 
        }
    };
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    public void operate(View v) {
        switch (v.getId()){
            case R.id.start:
                //啟動服務 :創建——啟動——摧毀
                //如果服務已經創建瞭,後續重復啟動,操作的都是同一個服務,不回在創建新 的服務,除非先摧毀他
                Intent it1=new Intent(this,MyService.class);
                startService(it1);
                break;
            case R.id.stop:
                Intent it2=new Intent(this,MyService.class);
                stopService(it2);
                break;
            case R.id.bind:
                //綁定服務
                Intent it3=new Intent(this,MyService.class);
                bindService(it3,conn,BIND_AUTO_CREATE);
                break;
 
            case R.id.unbind:
                //解綁服務
//                unbindService(conn);
//                if (isBound) {
//                    unbindService(conn);// 解綁服務
//                    isBound = false;
//                }
                    unbindService(conn);//解綁服務
                break;
 
        }
    }
}

到此這篇關於android Service基礎(啟動服務與綁定服務)的文章就介紹到這瞭,更多相關android Service內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: