1.Service 是什么峻凫?
Service 是 Android 中實(shí)現(xiàn)程序后臺(tái)運(yùn)行的解決方案炊汹,非常適用于去執(zhí)行那些不需要和用戶交互
而且還要求長(zhǎng)期運(yùn)行的任務(wù)
篡撵。Service默認(rèn)運(yùn)行在UI主線程中褐着,所以不能做耗時(shí)操作
弓千,只能在Service中創(chuàng)建子線程來(lái)完成耗時(shí)操作。
補(bǔ)充說(shuō)明:Service有兩種啟動(dòng)方式献起,startService()
和bindService()
,它們之間的區(qū)別是:
-
startService()啟動(dòng)后無(wú)返回結(jié)果镣陕,startService()的生命周期有三個(gè)函數(shù)谴餐,分別是
onCreate()
、onStartCommand()
和onDestory()
呆抑。當(dāng)我們首次startSerivce()啟動(dòng)
一個(gè)service的時(shí)候岂嗓,會(huì)調(diào)用service的onCreate函數(shù)創(chuàng)建
該服務(wù),然后調(diào)用onStartCommand函數(shù)執(zhí)行
操作鹊碍,可以調(diào)用stopSevice/stopSelf
來(lái)結(jié)束
一個(gè)Service(多次調(diào)用都不會(huì)有異常)厌殉。(注:多次通過(guò)startService啟動(dòng)服務(wù),onCreate只執(zhí)行1次侈咕,都會(huì)調(diào)用onStartCommand公罕。)啟動(dòng)后,它就獨(dú)立于調(diào)用者而運(yùn)行
耀销,因此任務(wù)結(jié)束后楼眷,Service需要stopSevice/stopSelf函數(shù)來(lái)停止該服務(wù),避免消耗系統(tǒng)資源或電量熊尉。 -
bindService()綁定Service后可以進(jìn)行交互操作(發(fā)請(qǐng)求罐柳、獲取結(jié)果或IPC通信),bindService的生命周期有四個(gè)函數(shù)狰住,分別是
onCreate()
张吉、onBind()
、onUnBind()
和onDestory()
催植,首次啟動(dòng)會(huì)先執(zhí)行onCreate()方法創(chuàng)建服務(wù)肮蛹,onBind() 會(huì)將調(diào)用者和服務(wù)綁定在一起勺择,調(diào)用者退出時(shí)可以調(diào)用unbindService()進(jìn)行解綁操作(方法中會(huì)調(diào)用onUnBind和onDestory)。(注:多次調(diào)用bindService()方法并不會(huì)導(dǎo)致多次創(chuàng)建服務(wù)及綁定(也就是說(shuō)onCreate()和onBind()方法并不會(huì)被多次調(diào)用)蔗崎。)
2.Service 的生命周期
-
回調(diào)方法含義:
- onCreate:服務(wù)第一次被創(chuàng)建時(shí)調(diào)用酵幕;
- onStartComand:服務(wù)啟動(dòng)時(shí)調(diào)用;
- onBind:服務(wù)被綁定時(shí)調(diào)用缓苛;
- onUnBind:服務(wù)被解綁時(shí)調(diào)用芳撒;
- onDestroy:服務(wù)停止時(shí)調(diào)用;
-
生命周期:
- 只調(diào)用
startService()
啟動(dòng)服務(wù):onCreate() -> onStartCommand() -> onDestory() - 只調(diào)用
bindService()
綁定服務(wù):onCreate() -> onBind() -> onUnBind() -> onDestory() - 同時(shí)使用
startService()與bindService()
:onCreate() -> onStartCommnad() -> onBind() -> onUnBind() -> onDestory未桥。
- 只調(diào)用
-
種類:
-
startService():開(kāi)啟Service笔刹,調(diào)用者退出后Service仍然
存在
。 -
bindService():開(kāi)啟Service冬耿,調(diào)用者退出后Service也隨即
退出
舌菜。
-
startService():開(kāi)啟Service笔刹,調(diào)用者退出后Service仍然
-
啟動(dòng)方式:
-
startService():通過(guò)
startService()
方法可以啟動(dòng)一個(gè)Service,并回調(diào)服務(wù)中的onStartCommand()
亦镶。如果首次創(chuàng)建日月,那么回調(diào)的順序是onCreate()->onStartCommand()
。服務(wù)啟動(dòng)了之后會(huì)一直保持運(yùn)行狀態(tài)缤骨,直到stopService()
或stopSelf()
方法被調(diào)用爱咬,服務(wù)停止并自動(dòng)回調(diào)onDestroy()
。另外绊起,無(wú)論調(diào)用多少次startService()
方法精拟,只需調(diào)用一次stopService()
或stopSelf()
方法,服務(wù)就會(huì)停止了虱歪。onCreate()只在第一次創(chuàng)建的時(shí)候調(diào)用蜂绎,onStartCommand()每次啟動(dòng)服務(wù)都調(diào)用。 -
bindService():通過(guò)
bindService()
可以綁定一個(gè)Service笋鄙,并回調(diào)服務(wù)中的onBind()
方法师枣。類似地,如果該服務(wù)之前還沒(méi)創(chuàng)建萧落,那么回調(diào)的順序是onCreate()->onBind()
坛吁。之后,調(diào)用方可以獲取到onBind()方法里返回的IBinder對(duì)象
的實(shí)例铐尚,從而實(shí)現(xiàn)和服務(wù)進(jìn)行通信拨脉。只要調(diào)用方和服務(wù)之間的連接沒(méi)有斷開(kāi),服務(wù)就會(huì)一直保持運(yùn)行狀態(tài)宣增,直到調(diào)用了unbindService()
方法服務(wù)會(huì)停止玫膀,回調(diào)順序onUnBind()->onDestroy()
。 - 注意爹脾,這兩種啟動(dòng)方法并不沖突帖旨,當(dāng)使用startService()啟動(dòng)Service之后箕昭,還可再使用bindService()綁定,只不過(guò)需要同時(shí)調(diào)用 stopService()和 unbindService()方法才能讓服務(wù)銷毀掉解阅。
-
startService():通過(guò)
3.Service的基本用法(startService落竹、bindService和IntentService)
3.1 startService
- 第一步:新建類并繼承Service且必須重寫(xiě)onBind()方法,有選擇的重寫(xiě)onCreate()货抄、onStartCommand()及onDestroy()方法述召。
- 第二步:在配置文件AndroidManifest.xml中進(jìn)行注冊(cè),否則不能生效蟹地。
- 第三步:在 Activity 中利用 startService(Intent) 可實(shí)現(xiàn) Service 的啟動(dòng)积暖。
- 第四步:在 Activity 中 stopService(Intent) 停止服務(wù),或者在Service任意位置調(diào)用stopSelf()怪与;
public class MyService extends Service {
public MyService() {
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
//處理具體的邏輯
//必須調(diào)用stopService或者stopSelf方法才能停止
stopSelf();
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
throw new UnsupportedOperationException("Not yet implemented");
}
}
//在配置文件AndroidManifest.xml中進(jìn)行注冊(cè)
<service
android:name=".MyService"
android:enabled="true"
android:exported="true" />
//啟動(dòng)
Intent intent = new Intent(this, MyService.class);
startService(intent);
//停止
Intent intent = new Intent(this, MyService.class);
stopService(intent);
3.2 bindService
- 第一步:創(chuàng)建BindService服務(wù)端夺刑,繼承自Service,并在類中創(chuàng)建一個(gè)實(shí)例IBinder接口實(shí)現(xiàn)對(duì)象并提供公共方法給客戶端調(diào)用分别。
- 第二步:從 onBind() 回調(diào)方法返回此Binder實(shí)例遍愿;
- 第三步:在客戶端中,從onServiceConnected()回調(diào)方法接收Binder耘斩,并使用提供的方法調(diào)用綁定服務(wù)沼填。
- 綁定服務(wù)提供了客戶端和服務(wù)端接口,進(jìn)行數(shù)據(jù)的交互(發(fā)送請(qǐng)求煌往、獲取結(jié)果、進(jìn)程間通信)
public class TestService extends Service {
private Mybinder mBinder = new Mybinder();
public TestService() {
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class Mybinder extends Binder {
public void showToast() {
Toast.makeText(getApplicationContext(), "BindService", Toast.LENGTH_SHORT).show();
}
}
}
public class MainActivity extends AppCompatActivity {
private TestService.Mybinder mBinder;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//成功綁定
mBinder = (TestService.Mybinder) service;
mBinder.showToast();
}
@Override
public void onServiceDisconnected(ComponentName name) {
//斷開(kāi)連接
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//綁定服務(wù)
Intent bindIntent = new Intent(this, TestService.class);
bindService(bindIntent, mConnection, BIND_AUTO_CREATE);
//解綁服務(wù)
unbindService(mConnection);
}
}
3.3 IntentService
第一步:新建類并繼承IntentService轧邪,在這里需要提供一個(gè)無(wú)參的構(gòu)造函數(shù)且必須在其內(nèi)部調(diào)用父類的有參構(gòu)造函數(shù)刽脖,然后具體實(shí)現(xiàn)在onHandleIntent()方法,這里可以去處理一些耗時(shí)操作而不用擔(dān)心 ANR 的問(wèn)題忌愚,因?yàn)檫@個(gè)方法已經(jīng)是在子線程中運(yùn)行的了曲管。
第二步:在配置文件中進(jìn)行注冊(cè)。
第三步:在活動(dòng)中利用startService(Intent)實(shí)現(xiàn)IntentService的啟動(dòng)硕糊,和Service用的方法是完全一樣的院水。
public class MyIntentService extends IntentService {
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
//子線程 耗時(shí)操作
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
//調(diào)用方法
Intent intentService = new Intent(this, MyIntentService.class);
startService(intentService);
4.Activity如何與Service通信?
在 Activity 中可以通過(guò) startService 和 bindService 方法啟動(dòng) Service简十。一般情況下如果想獲取 Service 的服務(wù)對(duì)象那么肯定需要通過(guò)bindService()
方法檬某,比如音樂(lè)播放器,第三方支付等螟蝙。如果僅僅只是為了開(kāi)啟一個(gè)后臺(tái)任務(wù)那么可以使用 startService() 方法恢恼。
- 首先定義 MyService 來(lái)指定具體的操作。
- 先在 Activity 里實(shí)現(xiàn)一個(gè)ServiceConnection類 connection胰默,重寫(xiě) onServiceConnected 和 onServiceDisconnected 方法场斑,分別表示綁定成功與斷開(kāi)漓踢;
- 并將 connection 傳遞給 bindService() 方法去啟動(dòng) Service;
- 在ServiceConnection的onServiceConnected()方法里啟動(dòng) MyService 里的方法漏隐。
- 最后通過(guò) unbindService 來(lái)解綁服務(wù)喧半。
5.IntentService是什么?
IntentService是Service的子類青责,是一個(gè)異步的挺据、會(huì)自動(dòng)停止的服務(wù),很好解決了傳統(tǒng)的Service中處理完耗時(shí)操作忘記停止并銷毀Service的問(wèn)題爽柒。
- IntentService 是一個(gè)特殊的 Service吴菠,它繼承了 Service 并且它是一個(gè)抽象類,因此必須創(chuàng)建它的
子類
才能使用 IntentService浩村。 - 它封裝了 HandlerThread 和 Handler做葵,可用于執(zhí)行后臺(tái)
耗時(shí)的任務(wù)
,當(dāng)任務(wù)全部執(zhí)行完畢后自動(dòng)停止
心墅。 - 它的
優(yōu)先級(jí)
比普通線程要高酿矢,所以適合執(zhí)行高優(yōu)先級(jí)的后臺(tái)任務(wù)。 - (HandlerThread是繼承了Thread怎燥,他的作用是不用每次創(chuàng)建線程瘫筐,他內(nèi)部有循環(huán)機(jī)制可以重復(fù)利用,不用的時(shí)候要quit或者quitSafely铐姚。)
6.說(shuō)說(shuō) Activity策肝、Intent 和 Service 是什么關(guān)系
他們都是 Android 開(kāi)發(fā)中使用頻率最高的類。其中 Activity 和 Service 都是 Android 四大組件之一隐绵。他倆都是 Context 類的子類 ContextWrapper 的子類之众,因此他倆可以算是兄弟關(guān)系吧。不過(guò)兄弟倆各有各自的本領(lǐng)依许,Activity 負(fù)責(zé)用戶界面的顯示和交互棺禾,Service 負(fù)責(zé)后臺(tái)任務(wù)的處理。Activity 和 Service 之間可以通過(guò) Intent 傳遞數(shù)據(jù)峭跳,因此可以把 Intent 看作是通信使者膘婶。
7.如何保證Service不被殺死?(就是提高Service優(yōu)先級(jí))
- 在AndroidManifest.xml配置文件設(shè)置android:priority 屬性蛀醉,和有序廣播一樣悬襟。
- 在onStartCommand里面調(diào)用 startForeground()方法把Service提升為前臺(tái)進(jìn)程級(jí)別,然后再onDestroy里面要記得調(diào)用stopForeground()方法拯刁。
- onStartCommand方法古胆,手動(dòng)返回START_STICKY。
- 在onDestroy方法里發(fā)廣播重啟service。service +broadcast 方式逸绎,就是當(dāng)service走ondestory的時(shí)候惹恃,發(fā)送一個(gè)自定義的廣播,當(dāng)收到廣播的時(shí)候棺牧,重新啟動(dòng)service巫糙。(第三方應(yīng)用或是在setting里-應(yīng)用-強(qiáng)制停止時(shí),APP進(jìn)程就直接被干掉了颊乘,onDestroy方法都進(jìn)不來(lái)参淹,所以無(wú)法保證會(huì)執(zhí)行)
- 監(jiān)聽(tīng)系統(tǒng)廣播判斷Service狀態(tài)。通過(guò)系統(tǒng)的一些廣播乏悄,比如:手機(jī)重啟浙值、界面喚醒、應(yīng)用狀態(tài)改變等等監(jiān)聽(tīng)并捕獲到檩小,然后判斷我們的Service是否還存活开呐。
8.Service 和 BroadcastReceiver 共同點(diǎn)
- 都是運(yùn)行在主線程當(dāng)中,都不能做長(zhǎng)時(shí)間的
耗時(shí)操作
规求。
9.Service 里面可以彈吐司么
可以的筐付,Service不僅可以彈Toast還能彈出對(duì)話框,第一阻肿,Service是運(yùn)行在主線程當(dāng)中瓦戚;第二,彈吐司有個(gè)條件就是得有一個(gè) Context 上下文丛塌,而 Service 本身就是 Context 的子類较解;因此在 Service 里面彈吐司是完全可以的。
10.是否能在Service進(jìn)行耗時(shí)操作赴邻?如果非要可以怎么做印衔?
Service默認(rèn)運(yùn)行在主線程中,所以不能在Service里執(zhí)行耗時(shí)操作乍楚,除非手動(dòng)打開(kāi)一個(gè)子線程当编,否則有可能出現(xiàn)主線程被阻塞(ANR)的情況届慈。(開(kāi)啟子線程的方法有:繼承徒溪、實(shí)現(xiàn)、匿名類) 金顿,但我更建議使用IntentService來(lái)代替臊泌,因?yàn)樗且粋€(gè)異步的、會(huì)自動(dòng)停止的Service服務(wù)揍拆。
11.一個(gè)Activty先start一個(gè)Service后渠概,再bind時(shí)會(huì)回調(diào)什么方法?此時(shí)如何做才能回調(diào)Service的destory()方法?
當(dāng)對(duì)一個(gè)服務(wù)既調(diào)用 startService() 方法播揪,又調(diào)用了bindService()方法贮喧,根據(jù)Android系統(tǒng)的機(jī)制,一個(gè)服務(wù)只要被啟動(dòng)或者被綁定了之后猪狈,就會(huì)一直處于運(yùn)行狀態(tài)箱沦,必須要讓以上兩種條件同時(shí)不滿足,服務(wù)才能被銷毀雇庙。所以谓形,這種情況要同時(shí)調(diào)用是stopService()和unbindService方法,onDestroy才會(huì)執(zhí)行疆前。
12.前臺(tái)服務(wù)是什么寒跳?和普通服務(wù)的不同?如何去開(kāi)啟一個(gè)前臺(tái)服務(wù)竹椒?
前臺(tái)服務(wù)和普通服務(wù)最大的區(qū)別是:前者會(huì)一直有一個(gè)正在運(yùn)行的圖標(biāo)在系統(tǒng)的狀態(tài)欄顯示童太,下拉狀態(tài)欄后可以看到更加詳細(xì)的信息,非常類似于通知的效果碾牌。使用前臺(tái)服務(wù)或者為了防止服務(wù)被回收掉康愤,比如聽(tīng)歌,或者由于特殊的需求舶吗,比如實(shí)時(shí)天氣狀況征冷。
想要實(shí)現(xiàn)一個(gè)前臺(tái)服務(wù)非常簡(jiǎn)單,它和之前學(xué)過(guò)的發(fā)送一個(gè)通知非常類似誓琼,只不過(guò)在構(gòu)建好一個(gè)Notification之后检激,不需要NotificationManager將通知顯示出來(lái),而是調(diào)用了startForeground()方法腹侣。
//修改MyService的onCreate()方法:
public void onCreate(){
Intent intent = new Intent(this,MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("This is content title")
.setContentText("This is content text")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setContentIntent(pi)
.build();
startForeground(1,notification);
}
13.是否了解ActivityManagerService叔收,談?wù)勊l(fā)揮什么作用?
ActivityManagerService是Android中最核心的服務(wù) 傲隶, 主要負(fù)責(zé)系統(tǒng)中四大組件的啟動(dòng)饺律、切換、調(diào)度及應(yīng)用進(jìn)程的管理和調(diào)度等工作跺株,其職責(zé)與操作系統(tǒng)中的進(jìn)程管理和調(diào)度模塊類似复濒。
14.用過(guò)哪些系統(tǒng)Service?
15.AlarmManager能實(shí)現(xiàn)定時(shí)的原理乒省?
通過(guò)調(diào)用AlarmManager的 set() 方法就可以設(shè)置一個(gè)定時(shí)任務(wù)巧颈,并提供三個(gè)參數(shù)(工作類型,定時(shí)任務(wù)觸發(fā)的時(shí)間袖扛,PendingIntent對(duì)象)砸泛。其中第三個(gè)PendingIntent對(duì)象是關(guān)鍵,一般會(huì)調(diào)用它的 getBroadcast() 方法來(lái)獲取一個(gè)能夠執(zhí)行廣播的PendingIntent。這樣當(dāng)定時(shí)任務(wù)被觸發(fā)的時(shí)候唇礁,廣播接收器的onReceive()方法就可以得到執(zhí)行勾栗。即通過(guò)服務(wù)和廣播的循環(huán)觸發(fā)實(shí)現(xiàn)定時(shí)服務(wù)。
16.Service 和 Thread 的區(qū)別
-
定義:
- Thread 是程序執(zhí)行的最小單元盏筐,它是分配CPU的最小單位械姻。可以執(zhí)行異步操作机断,是相對(duì)獨(dú)立的楷拳。
- Service 是 Android 的一種特殊機(jī)制,是運(yùn)行在主線程當(dāng)中的吏奸,是依托于所在的主線程欢揖。是由系統(tǒng)進(jìn)程托管,也是一種輕量級(jí)IPC通信方式(Activity 和 Service 綁定奋蔚,然后數(shù)據(jù)通信她混,并處于不同進(jìn)程。)
關(guān)系:Service 和 Thread 之間并沒(méi)有什么關(guān)聯(lián)泊碑,Service 翻譯成中文是服務(wù)坤按,同時(shí)服務(wù)可以理解為后臺(tái)窘拯。Thread 是開(kāi)啟子線程執(zhí)行耗時(shí)操作其屏,而 Service 是在主線程中執(zhí)行,但總被認(rèn)為可以在后臺(tái)處理耗時(shí)任務(wù)吗浩,容易混淆了兩者之間的概念腹忽。
實(shí)際開(kāi)發(fā)中:在Android系統(tǒng)當(dāng)中来累,線程一般指的是工作線程,主線程主要負(fù)責(zé)UI繪制窘奏,而Service 就是運(yùn)行在主線程當(dāng)中的嘹锁。
-
應(yīng)用場(chǎng)景:
- 當(dāng)需要耗時(shí)的操作,比如網(wǎng)絡(luò)請(qǐng)求着裹,圖片加載等等都應(yīng)該使用工作線程领猾。
- 當(dāng)需要在后臺(tái)播放音樂(lè)、開(kāi)啟定位骇扇、數(shù)據(jù)統(tǒng)計(jì)等等應(yīng)該使用Service摔竿。
-
區(qū)分
- 1.不要把后臺(tái)和子線程聯(lián)系在一起;
- 2.服務(wù)和后臺(tái)是不同的概念匠题;
- 3.Android的后臺(tái)是指它的運(yùn)行不依賴與UI線程拯坟,即使程序被銷毀了但金、程序被關(guān)閉了韭山,服務(wù)進(jìn)程仍然在后臺(tái)進(jìn)行計(jì)算、統(tǒng)計(jì)等等。
- 4.如果在 Service 執(zhí)行耗時(shí)钱磅,也需要?jiǎng)?chuàng)建子線程梦裂,然后去做耗時(shí)邏輯。
- 5.Service是為了彌補(bǔ) Activity 被銷毀之后盖淡,無(wú)法獲取之前所創(chuàng)建的子線程實(shí)例年柠,并對(duì)后臺(tái)進(jìn)行控制的情況而產(chǎn)生的。
17.開(kāi)啟子線程的方法
// 1褪迟、新建類繼承自Thread冗恨,然后重寫(xiě)父類的run方法,并在里面編寫(xiě)耗時(shí)邏輯味赃。
class MyThread extends Thread{
public void run(){
}
}
new MyThread().start();
// 2掀抹、實(shí)現(xiàn)Runnable接口可以降低繼承的耦合性
class MyThread implements Runnable{
public void run(){
}
}
MyThread my = new MyThread();
new Thread(my).start();
// 3、使用匿名類的方式心俗,這種方式最常見(jiàn)
new Thread(new Runnable(){
public void run(){
}
}).start()
18.Service 的 onStartCommand 方法有幾種返回值?各代表什么意思?
有四種返回值,不同值代表的意思如下:
- START_STICKY:如果 service 進(jìn)程被 kill 掉,保留 service 的狀態(tài)為開(kāi)始狀態(tài),但不保留遞送的 intent 對(duì)象傲武。隨 后系統(tǒng)會(huì)嘗試重新創(chuàng)建 service,由于服務(wù)狀態(tài)為開(kāi)始狀態(tài),所以創(chuàng)建服務(wù)后一定會(huì)調(diào)用 onStartCommand(Intent,int,int)方法。如果在此期間沒(méi)有任何啟動(dòng)命令被傳遞到 service,那么參數(shù) Intent 將為 null城榛。
- START_NOT_STICKY:“非粘性的”揪利。使用這個(gè)返回值時(shí),如果在執(zhí)行完 onStartCommand 后,服務(wù)被異常 kill 掉,系統(tǒng)不會(huì)自動(dòng)重啟該服務(wù)。
- START_REDELIVER_INTENT:重傳 Intent狠持。使用這個(gè)返回值時(shí),如果在執(zhí)行完 onStartCommand 后,服務(wù)被異 常 kill 掉,系統(tǒng)會(huì)自動(dòng)重啟該服務(wù),并將 Intent 的值傳入疟位。
- START_STICKY_COMPATIBILITY: START_STICKY 的兼容版本,但不保證服務(wù)被 kill 后一定能重啟。
你一般在什么情況下會(huì)使用Service喘垂?
當(dāng)需要長(zhǎng)期在后臺(tái)進(jìn)行的工作我們需要將其放在Service中去做献汗,比如音樂(lè)播放、下載王污、上傳大文件罢吃、定時(shí)關(guān)閉應(yīng)用等功能。這樣做的原因是如果放在Activity當(dāng)中去執(zhí)行的話昭齐,當(dāng)Activity銷毀后尿招,那這些功能也就停止了,這顯然是不符合我們的設(shè)計(jì)要求的阱驾,所以要將他們放在Service中去執(zhí)行就谜。
了解Binder機(jī)制
http://www.reibang.com/p/da76ffa0c859
本文參考資料:
- 《Android開(kāi)發(fā)藝術(shù)探索》
- 《第一行代碼》
- http://www.reibang.com/p/718aa3c1a70b
- 重點(diǎn)掌握知識(shí)