Android基礎知識:Service(3)啟動模式

weixin_34249678發表於2018-12-28

廢話

今天我們來學習Service的啟動模式

Service的啟動模式有兩種
startService
bindService

startService

這種模式是啟動Service後,Service就會一直執行下去,直到程式被殺死,Service在被啟動後,就和啟動它的context沒有關係了,context不知道Service在幹什麼,當然,context還可以讓它停止,它也可以自己停止

下面就讓我們啟動一個Service

先建立一個Service

public class MyService extends Service {
    public MyService() {
    }

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

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

然後在主介面通過一個按鈕啟動Service

mBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent=new Intent(MainActivity.this,MyService.class);
        startService(intent);
    }
});

這樣,Service就啟動起來了

我們可以讓Service停止

Intent intent=new Intent(MainActivity.this,MyService.class);
stopService(intent);

也可以在Service自己停止

stopSelf();

bindService

這個方式啟動的Service可以和啟動它的context互動

下面我們來看看如何用bind方式啟動Service

我們首先在Service中建立一個自定義的內部類並定義兩個方法,然後在IBinder方法中返回自定義的內部類例項

MyService.java

public class MyService extends Service {

    private int mData=0;

    private MyBinder mMyBinder=new MyBinder();

    class MyBinder extends Binder{

        public void setData(int data){
            mData=data;
        }

        public int getData(){
            return mData;
        }

    }

    public MyService() {
    }

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

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopSelf();
    }
}

接下來我們在MainActivity中進行如下修改

public class MainActivity extends AppCompatActivity {
    
    private MyService.MyBinder myBinder;
    
    private ServiceConnection connection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            myBinder=(MyService.MyBinder)iBinder;
            myBinder.setData(1);
            int data=myBinder.getData();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };

    private static final String TAG = MainActivity.class.getSimpleName();

    private Button mBtn;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i(TAG, "onCreate");
        mBtn = (Button) findViewById(R.id.main_btn);
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(MainActivity.this,MyService.class);
                bindService(intent,connection,BIND_AUTO_CREATE);
            }
        });
    }
}

這樣,我們就完成了Service的繫結

我們也可以解除繫結

unbindService(connection);

今天的學習就到這裡,晚安。

相關文章