201709015工作日记--IntentService使用

一、IntentService与Service的区别

Service 是 Android 四大组件之一,正常来说,我们直接使用 Service 就可以了。

但是 Service 存在几个问题:

  1. 默认不会运行在单独的进程中,而是和所在应用共用同一个进程。
  2. Service 也是在主线程中运行,所以一些耗时操作,依然需要单独开启线程去执行。

第一个问题其实并不是什么大的问题,但是正常来说,我们使用 Service 就是想在后台执行一些其他的操作,例如:下载等,而这些,又需要额外开启线程来完成任务,这样无形之中加大了我们的代码量。

而 IntentService 就是为这个而生的。

二、什么是IntentService

IntentService 是继承自 Service 的,所以它本质上还是一个 Service 。在 IntentService 内部维护了一个 WorkerThread 来专门处理耗时操作,实际上它会将所有 IntentService 的业务操作都放在 WorkerThread 中执行。

如果 start 了多次相同的 IntentService ,那么每一次 start 的任务,都会在 WorkerThread 中依次执行。而最让我们省心的是,IntentService 在执行完这些任务之后,会调用 stopSelf() 结束自己。

从官方文档可以了解到,一些 IntentService 的特点:

它会创建独立的 WorkerThread 来处理所有的 Intent 请求。

它会创建独立的 WorkerThread 来处理 onHandleIntent() 的实现代码,无需担心多线程的问题。

所有请求完成之后,IntentService 会自动停止。

它的 onBind() 默认返回 null,不要去实现它,不要用 bindService() 绑定一个 IntentService。

它的 onStartCommand() 提供了默认的实现,会将请求的 Intent 添加到队列中。

从上面的介绍可以了解到,在 IntentService 开启了一个独立的 WorkerThread 来完成具体任务的执行,而我们只需要将需要完成的业务代码,在 onHandleIntent() 中实现即可。

三、实现步骤

步骤1:定义IntentService的子类:传入线程名称、复写onHandleIntent()方法

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

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

四、具体实例(来源http://www.jianshu.com/p/8a3c44a9173a)

(1)步骤1:定义IntentService的子类:传入线程名称、复写onHandleIntent()方法

public class myIntentService extends IntentService {

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

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

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

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

public class MainActivity extends AppCompatActivity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //同一服务只会开启一个工作线程
//在onHandleIntent函数里依次处理intent请求。 Intent i = new Intent("cn.scu.finch");
Bundle bundle = new Bundle();
bundle.putString("taskName", "task1");
i.putExtras(bundle);
startService(i); Intent i2 = new Intent("cn.scu.finch");
Bundle bundle2 = new Bundle();
bundle2.putString("taskName", "task2");
i2.putExtras(bundle2);
startService(i2); startService(i); //多次启动
}
}
上一篇:使用Java 9运行应用程序,模块java.base不会“打开java.io”


下一篇:java – Wildfly 12和13复制standalone.xml文件并将其记录为无限循环