public class MyService extends Service {
public static final String TAG = "MyService";
private MyBinder mBinder = new MyBinder();
public void haha() {
super.onCreate();
Log.d(TAG, "onCreate() executed");
}
@Override
public void onCreate() {
//service的普通方法
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand() executed");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() executed");
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
class MyBinder extends Binder {
public void startDownload() {
Log.d("TAG", "startDownload() executed");
// 執行具體的下載任務
}
}
}
當在Activity中獲得系結的service回傳的MyBinder 實體后,如果呼叫MyBinder 自己的public普通方法比如tartDownload(),這算是運行在服務中嗎?這和直接new 一個MyBinder實體再運行它的tartDownload()有什么區別?就因為它是通過service回傳的?
如果我通過service回傳的MyBinder進一步回傳了service的實體,呼叫service的普通方法haha(), 這算是代碼運行在service中嗎?
怎樣才算是代碼運行在service中?
uj5u.com熱心網友回復:
首先,你獲取的MyBinder和Service創建的物件不是同一個,這個你可以列印證實。第二,你獲取的MyBinder是 Service創建的物件的代理物件,你呼叫 這個MyBinder,它然后再呼叫Service的創建的物件
uj5u.com熱心網友回復:
你new一個service,他并沒有開始運行,需要bindService 或者startService 他才能運行onCreateuj5u.com熱心網友回復:
Activity因為離開前臺后容易被回收,Service在后臺生存期會長很多,所以需要長時間運行的代碼會放在service中運行, 這些代碼放在service中的哪里,才算是運行在service中呢,放在onStartCommand() 和 onBind() 這種生命周期中運行才算嗎?uj5u.com熱心網友回復:
onStartCommand() 每次bindService 或者startService 都會呼叫一次,onCreate 只是在第一次啟動的時候呼叫。看你需求放哪里。或者直接寫一個方法,在activity中獲取service實體然后呼叫。https://blog.csdn.net/qq_19431333/article/details/53784734
深入理解Service(一)——服務生命周期
uj5u.com熱心網友回復:
感覺樓主是對service不了解啊,樓上都說的很好,建議再看看service的詳解uj5u.com熱心網友回復:
說幾點我的理解:1.Service和Activity同屬于四大組件,他們都不應該由我們自己實體化,而是通過startActivity或者startService等由系統(主要是activityManagerService)進行實體化并管理。在不同情況下,會由系統進行呼叫生命周期。
2.只要service由提供啟動后,我們代碼放在他的任何一個生命周期內都算運行在service中,比如,onCreate,onbind以及onStartCommand等等。
3.如果你自己在activity中new一個service,然后呼叫他的方法,那只能算是一個activity中的普通的物件操作,失去了service的價值。
你可以類比參考更容易理解的Thead的操作。
如果你new 一個thread,直接呼叫 他的run,那這個執行緒并沒有啟動起來,只是一個普通物件方法呼叫。
而你調了start,這個執行緒會主動呼叫run,這樣執行緒才算是真正啟動了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/9243.html
標籤:Android
上一篇:Qt對多個字體庫進行裁剪
下一篇:qt關于接收json資料的問題
