接著上文程式,
IBinder:在android中用于遠程操作物件的一個基本介面,可以實作進度監控,
首先,將MyService里面的IBinder回傳值改成
return new MyBinder();
對于onBind方法而言,要求回傳Binder物件,實際上,我們會自己定義一個內部類,集成Binder類,如下:
class MyBinder extends Binder {
//定義自己需要的方法(實作進度監控)
public int getProcess(){
return i;
}
}
啟動服務 :創建——啟動——摧毀,在創建里面啟一個執行緒(從1數到100,用于模擬耗時任務),程式如下:
@Override
public void onCreate() {
super.onCreate();
Log.e("TAG","服務創建了");
//開啟一個執行緒(從1數到100,用于模擬耗時任務)
new Thread(){
@Override
public void run() {
for (int i=0;i<=100;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
每次點擊創建,都會執行如下代碼:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e("TAG","服務啟動了");
return super.onStartCommand(intent, flags, startId);
}
進行實時的監控:
//當客戶端正常連接著服務器時,執行服務的系結操作會被呼叫
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.e("TAG","慕課");
MyService.MyBinder mb= (MyService.MyBinder) iBinder;
//得到進度
int step=mb.getProcess();
Log.e("TAG","當前進度時:"+step);
}
//當客戶端和服務器的連接丟失了
MainActivity完整代碼如下:
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 {
//IBinder
//Service Connection 用于系結客戶端和Service
//進度監控
private ServiceConnection conn=new ServiceConnection() {
//當客戶端正常連接著服務器時,執行服務的系結操作會被呼叫
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.e("TAG","慕課");
MyService.MyBinder mb= (MyService.MyBinder) iBinder;
//得到進度
int step=mb.getProcess();
Log.e("TAG","當前進度時:"+step);
}
//當客戶端和服務器的連接丟失了
@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:
//系結服務:最大的作用就是用來實作對Service執行的任務進行進度監控
//解綁服務
unbindService(conn);//解綁服務
break;
}
}
}
MyService完整代碼如下:
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","服務創建了");
//開啟一個執行緒(從1數到100),用于模擬耗時的任務
new Thread(){
@Override
public void run() {
super.run();
try {
for (i = 1; i <= 100; i++) {
sleep(100);
}
}catch (Exception e){
e.printStackTrace();
}
}
}.start();
}
//啟動方法
@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();
}
//系結方法
//IBinder:在android中用于遠程操作物件的一個基本介面
//對于onBind方法而言,要求回傳Binder物件
//實際上,我們會自己定義一個內部類,集成Binder類
class MyBinder extends Binder {
//定義自己需要的方法(實作進度監控)
public int getProcess(){
return i;
}
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
// throw new UnsupportedOperationException("Not yet implemented");
Log.e("TAG", "服務系結了");
//Binder
return new MyBinder();
}
}
Service基礎(啟動服務與系結服務)(一)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/398043.html
標籤:AI
