当前位置: 首页 > news >正文

承德网站建设seo网站关键词排名优化

承德网站建设,seo网站关键词排名优化,centos lnmp wordpress,沂南网站设计定义 IntentService 是 Android中的一个封装类,继承自四大组件之一的Service 功能 处理异步请求 & 实现多线程 应用场景 线程任务 需 按顺序、在后台执行 最常见的场景:离线下载不符合多个数据同时请求的场景:所有的任务都在同一个T…

定义

IntentService 是 Android中的一个封装类,继承自四大组件之一的Service

功能

处理异步请求 & 实现多线程

应用场景

线程任务 需 按顺序、在后台执行

  1. 最常见的场景:离线下载
  2. 不符合多个数据同时请求的场景:所有的任务都在同一个Thread looper里执行

使用步骤

步骤1:定义 IntentService的子类,需复写onHandleIntent()方法
步骤2:在Manifest.xml中注册服务
步骤3:在Activity中开启Service服务

步骤1:定义 IntentService的子类

传入线程名、复写onHandleIntent()方法

public class myIntentService extends IntentService {/** * 在构造函数中传入线程名字**/  public myIntentService() {// 调用父类的构造函数// 参数 = 工作线程的名字super("myIntentService");}/** * 复写onHandleIntent()方法* 根据 Intent实现 耗时任务 操作**/  @Overrideprotected void onHandleIntent(Intent intent) {// 根据 Intent的不同,进行不同的事务处理String taskName = intent.getExtras().getString("taskName");switch (taskName) {case "task1":Log.i("myIntentService", "do task1");break;case "task2":Log.i("myIntentService", "do task2");break;default:break;}}@Overridepublic void onCreate() {Log.i("myIntentService", "onCreate");super.onCreate();}/** * 复写onStartCommand()方法* 默认实现 = 将请求的Intent添加到工作队列里**/  @Overridepublic int onStartCommand(Intent intent, int flags, int startId) {Log.i("myIntentService", "onStartCommand");return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {Log.i("myIntentService", "onDestroy");super.onDestroy();}
}

步骤2:在Manifest.xml中注册服务

<service android:name=".myIntentService"><intent-filter ><action android:name="cn.scu.finch"/></intent-filter>
</service>

步骤3:在Activity中开启Service服务

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 同一服务只会开启1个工作线程// 在onHandleIntent()函数里,依次处理传入的Intent请求// 将请求通过Bundle对象传入到Intent,再传入到服务里// 请求1Intent i = new Intent("cn.scu.finch");Bundle bundle = new Bundle();bundle.putString("taskName", "task1");i.putExtras(bundle);startService(i);// 请求2Intent i2 = new Intent("cn.scu.finch");Bundle bundle2 = new Bundle();bundle2.putString("taskName", "task2");i2.putExtras(bundle2);startService(i2);startService(i);  //多次启动}}

测试结果

在这里插入图片描述

对比

与Service对比

在这里插入图片描述

与普通线程对比

在这里插入图片描述

源码分析

IntentService的源码工作流程如下:
IntentService的源码工作流程如下:
特别注意:若启动IntentService 多次,那么 每个耗时操作 则 以队列的方式 在 IntentService的 onHandleIntent回调方法中依次执行,执行完自动结束

接下来,我们将通过 源码分析 解决以下问题:

  1. IntentService 如何单独开启1个新的工作线程
  2. IntentService 如何通过onStartCommand() 将Intent 传递给服务 & 依次插入到工作队列中

问题1:IntentService如何单独开启1个新的工作线程

主要分析内容 = IntentService源码中的 onCreate()方法

@Override
public void onCreate() {super.onCreate();// 1. 通过实例化andlerThread新建线程 & 启动;故 使用IntentService时,不需额外新建线程// HandlerThread继承自Thread,内部封装了 LooperHandlerThread thread = new HandlerThread("IntentService[" + mName + "]");thread.start();// 2. 获得工作线程的 Looper & 维护自己的工作队列mServiceLooper = thread.getLooper();// 3. 新建mServiceHandler & 绑定上述获得Looper// 新建的Handler 属于工作线程 ->>分析1mServiceHandler = new ServiceHandler(mServiceLooper); 
}/** * 分析1:ServiceHandler源码分析**/ private final class ServiceHandler extends Handler {// 构造函数public ServiceHandler(Looper looper) {super(looper);}// IntentService的handleMessage()把接收的消息交给onHandleIntent()处理@Overridepublic void handleMessage(Message msg) {// onHandleIntent 方法在工作线程中执行// onHandleIntent() = 抽象方法,使用时需重写 ->>分析2onHandleIntent((Intent)msg.obj);// 执行完调用 stopSelf() 结束服务stopSelf(msg.arg1);}
}/** * 分析2: onHandleIntent()源码分析* onHandleIntent() = 抽象方法,使用时需重写**/ @WorkerThreadprotected abstract void onHandleIntent(Intent intent);

问题2:IntentService 如何通过onStartCommand() 将Intent 传递给服务 & 依次插入到工作队列中

/** * onStartCommand()源码分析* onHandleIntent() = 抽象方法,使用时需重写**/ public int onStartCommand(Intent intent, int flags, int startId) {// 调用onStart()->>分析1onStart(intent, startId);return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
}/** * 分析1:onStart(intent, startId)**/ public void onStart(Intent intent, int startId) {// 1. 获得ServiceHandler消息的引用Message msg = mServiceHandler.obtainMessage();msg.arg1 = startId;// 2. 把 Intent参数 包装到 message 的 obj 发送消息中,//这里的Intent  = 启动服务时startService(Intent) 里传入的 Intentmsg.obj = intent;// 3. 发送消息,即 添加到消息队列里mServiceHandler.sendMessage(msg);
}

总结
从上面源码可看出:

IntentService本质 = Handler + HandlerThread

  1. 通过HandlerThread 单独开启1个工作线程:IntentService
  2. 创建1个内部 Handler :ServiceHandler
  3. 绑定 ServiceHandler 与 IntentService
  4. 通过 onStartCommand() 传递服务intent 到ServiceHandler 、依次插入Intent到工作队列中 & 逐个发送给 onHandleIntent()
  5. 通过onHandleIntent() 依次处理所有Intent对象所对应的任务

因此我们通过复写onHandleIntent() & 在里面 根据Intent的不同进行不同线程操作 即可

http://www.yidumall.com/news/74912.html

相关文章:

  • 做外贸怎么在阿里云建网站深圳网站建设的公司
  • 淮安网站建设知名的建站公司
  • 物流网站毕业设计论文企业网站seo平台
  • 网上下载的asp网站源码 放在本地如何做测试百度推广管家
  • 做商城网站多少钱网站排名优化制作
  • 机电工程栏建设项目网站建设建立一个网站需要多少钱?
  • 大连建站免费模板域名怎么查
  • 台州网站建设外包百度搜索网页版
  • 南阳网站建设的公司怎么在百度上面打广告
  • 上海网站制作工作室最新的网络营销的案例
  • WordPress上下拖动效果酒店seo是什么意思
  • 深圳seo网站优化公司百度站长工具怎么关闭教程视频
  • 做外贸自己做网站么chatgpt入口
  • win10 做网站服务器汕头网站快速优化排名
  • 桂林网站开发建设成都seo优化公司
  • 洛阳市建设工程评标专家网站佛山网站建设
  • 找人做个网站大概多少钱小型培训机构管理系统
  • 徐州网站制作机构seo网站推广的主要目的是什么
  • 珠海网站友情链接seo优化工作怎么样
  • js网站评论框上海网站建设方案
  • 可以制作网站的软件广告接单有什么平台
  • 包包17网站一起做网店宁波谷歌seo推广公司
  • 汤臣杰逊品牌策划公司搜索引擎优化网站的网址
  • 上海做网站定制有没有专门做营销的公司
  • 金华公司建站模板百度搜索热词查询
  • 做网站php软件网站是怎么做出来的
  • 定制网站系统网站关键词优化报价
  • 公司请外包做的网站怎么维护百度指数支持数据下载吗
  • 做外贸怎么上国外网站网站如何seo推广
  • 中国建设银行官网站企业电商还有发展前景吗