服務(wù)是andriod四大組件之一,主要作用于執(zhí)行耗時(shí)操作。與acticity一樣代表可執(zhí)行的程序。 但與acticity不同的是有用戶操作的界面,服務(wù)是不可見的。 服務(wù)分為本地服務(wù)與遠(yuǎn)程服務(wù),今天暫時(shí)講的是本地服務(wù)。
本地服務(wù)有四個(gè)生命周期: 創(chuàng)建**onCreate(), 銷毀onDestroy() , 綁定服務(wù)**onBind(只有在bindservices()才會(huì)調(diào)用此方法),onStartCommand(只有在啟動(dòng)服務(wù)的時(shí)候系統(tǒng)才會(huì)調(diào)用此方法 )。 services只能activity傳值到services里 注意在清單文件里的配置是:
<service android:name=".MyServices" android:exported="true"/>創(chuàng)建本地服務(wù)需要?jiǎng)?chuàng)建一個(gè)類繼承services類然后重寫里面的幾個(gè)生命周期的方法代碼如下:
public class MyServices extends Service { @Nullable @Override public IBinder onBind(Intent intent) { Log.i("test","onBind"); return null; } @Override public void onCreate() { super.onCreate(); Log.i("test","onCreate"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.i("test","onDestroy"); }}需要注意的是不可在主線程里面執(zhí)行耗時(shí)操作,可以使用子線程或者intentservices
intentservices是services的子類,可在主線程里面執(zhí)行耗時(shí)操作并且內(nèi)部有一個(gè)任務(wù)隊(duì)列,并且會(huì)一次從任務(wù)隊(duì)列中取出任務(wù),然后調(diào)用onHandlerIntent()這個(gè)方法執(zhí)行任務(wù)。當(dāng)任務(wù)隊(duì)列中的所有任務(wù)都完成以后才會(huì)停止服務(wù)。
如果自己手動(dòng)停止服務(wù),intent services會(huì)立即銷毀但是它的工作線程不會(huì)立即退出。而是把當(dāng)前正在執(zhí)行的任務(wù)執(zhí)行完畢才會(huì)停止服務(wù),排隊(duì)中未執(zhí)行的任務(wù)將不再執(zhí)行
intentservices還可進(jìn)行傳值到activity里,不像services只能是activity傳值到services里
創(chuàng)建intent services與前面一樣但是繼承的是intentservices類代碼如下: 但是需要注意的是必須要?jiǎng)?chuàng)建一個(gè)有參的構(gòu)造函數(shù)和無(wú)參的構(gòu)造函數(shù)
public class MyServices2 extends IntentService { public MyServices2() { super(""); } public MyServices2(String name) { super(name); } @Override PRotected void onHandleIntent(Intent intent) { for (int i = 0; i <10 ; i++) { Log.i("test","i="+i); SystemClock.sleep(2000); } }}在activity里啟動(dòng)服務(wù)需要用到的方法是startservices(),關(guān)閉則用stopservices或者stopself() 這兩者不同的是前者只能關(guān)閉手動(dòng)停止服務(wù),而后者是寫到子線程里并且能在任務(wù)完成時(shí)自動(dòng)停止服務(wù)。其中stop self有分為帶參的和不帶參的,不帶參的是當(dāng)?shù)谝粋€(gè)線程完成任務(wù)時(shí)就停止服務(wù),帶參的則會(huì)在所有線程都完成任務(wù)時(shí)才會(huì)停止服務(wù)
activity里的代碼:
public class MainActivity extends AppCompatActivity { private Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intent = new Intent(this,MyServices2.class); } public void start(View view){ intent.putExtra("data","下載的路徑"); startService(intent); } public void stop(View view){ stopService(intent); }}線程里的代碼:
@Override public int onStartCommand(Intent intent, int flags, int startId) { String data=intent.getStringExtra("data"); new MyThread(startId).start(); return super.onStartCommand(intent, flags, startId); } class MyThread extends Thread{ private int startId; public MyThread(int startId) { this.startId = startId; } @Override public void run() { super.run(); //耗時(shí)操作 for (int i = 0; i <10 ; i++) { Log.i("test","i="+i); SystemClock.sleep(1000); } //stopSelf();//當(dāng)?shù)谝粋€(gè)線程執(zhí)行完,就會(huì)停止服務(wù) //所有的線程都執(zhí)行完畢,才會(huì)停止服務(wù) stopSelf(startId); } }新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注