个人登录
数狐在线-做最好的在线学习社区java c# liferay jsp
关于后台服务的生成与AsyncTask
    2017-12-17    作者:  androidFan      进入评论页

IntentService类提供了一个简单的在后台运行线程的类实现结构,允许你处理长时间运行的操作,同时不会影响到用户的界面回应和操作。当然,IntentService也不会受到大多数用户操作事件的影响,因此它可以保持在关闭了一个AsyncTask任务以后的环境下继续运行。

     一个IntentService服务会有下面的一些局限:

  • 它无法直接与你的用户界面进行交互,为了把结果展现在ui界面上,你需要发送结果信息到你的Activity.
  • 工作任务不能多任务执行,只能线性排队执行,只有前一个任务执行完成后,才会执行后一个任务。
  •   一个在IntentService上正在执行的任务无法被中断。

        然而,大多数情况下,一个IntentService主要用来执行一个简单的后台任务,所以下面会演示如何通过生成一个IntentService子类来生成这样的后台任务,并在onHandleIntent()里进行定义业务算法,最后帮助大家梳理下如何在manifest文件里如何对一个IntentService进行定义。 

生成一个IntentService


为了生成一个IntentService服务为你的应用,你需要定义一个IntentService的子类,然后在该类中覆盖onHandleIntent()方法,例如:
public class RSSPullService extends IntentService {
   
@Override
   
protected void onHandleIntent(Intent workIntent) {
       
// Gets data from the incoming Intent
       
String dataString = workIntent.getDataString();
       
...
       
// Do work here, based on the contents of dataString
       
...
   
}
}

        注意服务的其他回调,例如onStartCommand是被IntentService自动调用的,在一个IntentService里,你应该避免覆盖那些回调方法。

在manifest里定义IntentService

        一个IntentService需要在你的应用manifest里定义一个入口,这需要通过定义来实现,作为的子节点:

    
       
android:icon="@drawable/icon"
       
android:label="@string/app_name">
        ...
       

       

           
android:name=".RSSPullService"
           
android:exported="false"/>
        ...
   

 这里的属性android:name需要指定为IntentService的实现类。

       注意元素不需要包含一个intent filter过滤器,Activity可以发送工作请求到使用了Intent的服务,因此确实没有必要再使用过滤器,这也就意味着,只有同属一个应用或具备相同用户id的第三方应用,才可以访问该服务。

  

发送任务请求给后台服务

我们首先需要构建一个IntentService 需要的Intent,因为该Intent包含了所需要的数据和对象,然后你可以从任意的Activity或Fragment里发送该Intent到你的IntentService.

生成一个并发送该工作请求到一个IntentService

    步骤如下:

  1.  生成一个Intent为名字为RSSPullService的IntentService.
    /*
     * Creates a new Intent to start the RSSPullService
     * IntentService. Passes a URI in the
     * Intent's "data" field.
     */

    mServiceIntent
    = new Intent(getActivity(), RSSPullService.class);
    mServiceIntent
    .setData(Uri.parse(dataUrl));
  2. 调用startService()
    // Starts the IntentService
    getActivity
    ().startService(mServiceIntent);

注意,如果你需要首先需要获取用户输入再启动服务的时候,你需要从一个回调里发送一个请求,来对按钮单击等类似的用户操作进行回应。


上面是最简单的代码框架!


官方微信服务号
进入评论页
合作企业