日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android:IntentService的学习

發(fā)布時間:2023/11/30 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android:IntentService的学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在Android的四大組件中,Service排行老二,在Android中的主要作用是后臺服務(wù),進行與界面無關(guān)的操作。由于Service運行在主線程,所以進行異步操作需要在子線進行。為此Android為我們提供了IntentService。 IntentService是一個抽象類,繼承至Service,主要方便我們新建工作線程進行異步操作。提交任務(wù)到IntentService時,異步任務(wù)以串行方式進行處理,意味著工作線程一次只處理一個任務(wù)。而且當(dāng)所有任務(wù)都完成之后,會自動停止Service,不需要我們手動停止。

IntentService 的使用

  • 我們定義DownloadService類并繼承至IntentService。來模擬網(wǎng)絡(luò)下載的過程。
  • public class DownloadService extends IntentService {private static int count = 0;/*** 主要用于調(diào)用服務(wù)類構(gòu)造器** @param name 用于區(qū)分不同任務(wù)*/public DownloadService(String name) {super(name);}/*** AndroidManifest.xml配置清單需要配置** @param*/public DownloadService() {super("action");}/***主要重寫該方法,在該方法內(nèi)進行異步操作。**/@Overrideprotected void onHandleIntent(Intent intent) {Log.i("Download", "onHandleIntent" + count);count++;String name = intent.getStringExtra("action");if (name.equals("download")) {for (int i = 0; i < 5; i++) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();return;}Log.i("Download", "download:" + count);}}}//以下方法的重寫,僅僅為了打印日志@Overridepublic void onDestroy() {super.onDestroy();Log.i("Download", "onDestroy");}@Overridepublic void onCreate() {super.onCreate();Log.i("Download", "onCreate");}@Overridepublic void onStart(Intent intent, int startId) {super.onStart(intent, startId);Log.i("Download", "onStart");}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("Download", "onStartCommand");return super.onStartCommand(intent, flags, startId);} }復(fù)制代碼
  • 在AndroidManifest.xml配置DownloadService。
  • <service android:name=".DownloadService"/> 復(fù)制代碼
  • 在MainActivity類中循環(huán)調(diào)用Service,啟動多循環(huán)任務(wù)。
  • @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Intent intent=new Intent(this,DownloadService.class);for (int i =0;i<3;i++){intent.putExtra("action","download");intent.putExtra("count",""+i);startService(intent);}} 復(fù)制代碼
  • 運行結(jié)果
  • 分析: 從運行結(jié)果知道,IntentService在運行多個任務(wù)情況下,只調(diào)用一次onCreate,調(diào)用多次onStartCommand,跟Service的生命周期一致。但,只有在運行完download:1之后才會去運行download:2,接著是download:3。最后所有任務(wù)結(jié)束后會自動調(diào)用onDestroy,停止服務(wù)。在這里需要注意的是,和Service并不同,Service需要我們手動停止服務(wù)。對于結(jié)果的回調(diào),可以采用接口回調(diào),廣播,EventBus。

    那么,IntentService是如何在Service中實現(xiàn)異步操作和串行處理任務(wù)的呢?

    IntentService內(nèi)部實現(xiàn)

  • 查看IntentService的onCreate方法
  • @Overridepublic void onCreate() {super.onCreate();//分析一HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");thread.start();mServiceLooper = thread.getLooper();分析二mServiceHandler = new ServiceHandler(mServiceLooper);} 復(fù)制代碼

    分析一

    HandThread繼承Thread,通過start方法創(chuàng)建工作線程,內(nèi)部建立Looper來達(dá)到消息循環(huán),通過Hanlder消息機制來達(dá)到串行的效果和處理多任務(wù)。HandThread和Handler消息機制,可以另外查看文章。

    分析二

    ServiceHandler繼承Handler,與普通的Handler并沒有區(qū)別,在其內(nèi)容處理handleMessage。即調(diào)用IntentService的onHandleIntent;

    private final class ServiceHandler extends Handler {public ServiceHandler(Looper looper) {super(looper);}@Overridepublic void handleMessage(Message msg) {onHandleIntent((Intent)msg.obj);stopSelf(msg.arg1);}} 復(fù)制代碼
  • 那么,當(dāng)我們在Activity中重復(fù)調(diào)用startService方法時,只會多次調(diào)用onStartCommand方法,并不會重復(fù)調(diào)用onCreate方法。我們看看onStartComamnd方法的實現(xiàn)。
  • @Overridepublic int onStartCommand(@Nullable Intent intent, int flags, int startId) {onStart(intent, startId);return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;} 復(fù)制代碼

    可以看得出,調(diào)用了onStart方法了。而onStart方法只是將我們的Intent包裝成Message,通過Handler發(fā)送出去,并在Handler中進行處理,調(diào)用我們的onHandleIntent。進而調(diào)用我們實現(xiàn)onHandleIntent的代碼。

    @Overridepublic void onStart(@Nullable Intent intent, int startId) {Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;msg.obj = intent;mServiceHandler.sendMessage(msg);} 復(fù)制代碼

    總結(jié)

    IntentService并沒有什么的新的技術(shù)含量,在了解HandlerTread和Handler的消息機制下,對Handler+Thread+Service作一個封裝,更適合我們后臺進行異步耗時操作的場景。有效避免通過new多個Thread。

    知識點分享

    Android消息機制

    HandlerThread必知必會

    如果覺得文章有用,給文章點個贊,鐵子

    總結(jié)

    以上是生活随笔為你收集整理的Android:IntentService的学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。