当前位置:操作系统 > 安卓/Android >>

Android后台处理最佳实践(Best Practices for Background Jobs)

     本课将告诉你如何通过后台加载来加速应用启动和降低应用耗电。
 
后台跑服务
 
         除非你做了特殊指定,否则在应用中的大部分前台操作都是在一个特殊的UI线程里面进行的。这有可能会导致一些问题,因为长时间运行的操作会影响到你应用的响应速度。为了避免这个问题,android框架提供了一系列帮助你在后台通过线程推迟加载的功能,被使用得最多的非IntentService莫属了。
 
         本课将向你描述如何实现一个IntentService,发送请求操作并向其它组件报告结果。
 
创建一个后台服务
 
         本课将直观地告诉你如何通过后台线程执行操作,通过它来执行耗时操作从而避免你的界面无法及时响应的问题。IntentService是不会受窗口生命周期回调的影响的,所以在继续运行它之前,你需要关闭AsyncTask。
 
         每个IntentService都是有限制条件的:
 
(1)它不可以直接和应用的界面进行交互,为了将操作结果返回给界面,你需要将他们发送到窗口;
 
(2) 工作请求是按顺序进行的,当已经有一个操作在IntentService中运行时,如果这是你发送另外一个请求,需要等到第一个操作执行完毕后才会继续后面的请求;
 
(3) 在IntentService中运行的操作是不可以被中断的。
 
 
 
        然而,多数情况下一个IntentService是后台操作最简单的处理方式。
 
        本课将告诉你如何创建你自己的IntentService子类,还会向你展示如何创建一个必要的onHandleIntent()回调。最后,将告诉你如何在清单文件中定义IntentService。
 
 
 
创建一个IntentService
 
         为了在你的应用中创建一个IntentService组件,需要定义一个继承于IntentService的类并复写其onHandleIntent()方法,比如:
 
[java]  
<span style="font-size:18px">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  
        ...  
    }  
}  
</span>  
         注意,对于任何一个Service都会回调的那些方法,比如onStartCommand(),都会自动地被IntentService引用。在一个IntentService中,你应该避免复写这些回调方法。
 
 
 
在清单文件Manifest中定义IntentService
 
         IntentService同样需要在你应用的清单文件中有一个入口,通过在<application>标签下声明<service>的方式来为IntentService提供入口:
 
[java]  
<span style="font-size:18px"><application  
        android:icon="@drawable/icon"  
        android:label="@string/app_name">  
        ...  
        <!--  
            Because android:exported is set to "false",  
            the service is only available to this app.  
        -->  
        <service  
            android:name=".RSSPullService"  
            android:exported="false"/>  
        ...  
    <application/>  
</span>  
         上例中的“android:name”属性指定了IntentService的类名。
 
         注意,<service>标签没有包含IntentFilter过滤器。该窗口通过一个明确地Intent向服务发送工作请求,所以不需要任何过滤器。也就是说,只有在同一个应用内,或者是有相同ID的其它应用才可以访问这个服务。
 
         现在你有了基本的IntentService类,你可以通过Intent对象发送工作请求了。
 
向后台服务发送工作请求
 
         之前的课程向我们展示了如何创建一个IntentService类。本课将告诉你如何通过发送Intent来触发IntentService执行一个操作。这个Intent可以包含IntentService需要处理的可选数据。你可以在Activity或者Fragment的任何一个地方向IntentService传递Intent。
 
 
 
创建并发送一个工作请求给IntentService
 
         为了创建一个工作请求并将其发送到IntentService,需要创建一个明确地Intent来添加工作请求数据,然后通过调用IntentService的StartService()方法来发送它。
 
         具体请看下面实例:
 
1、为IntentService的子类RSSPullService创建一个新的、明确地Intent。
 
[java] 
<span style="font-size:18px">/* 
 * 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));  
</span>  
2、调用startService()方法
 
[java]  
<span style="font-size:18px">// Starts the IntentService  
getActivity().startService(mServiceIntent);  
</span>  
         注意,你可以在Activity或者Fragment的任何地方发送工作请求。比如,如果你需要首先获取用户输入,你可以在按钮点击或者类似于手势操作的回调中来发送请求。
 
         一旦你调用了startService()方法,IntentService会处理定义在onHandleIntent()方法中的工作,然后自己停止。
 
         下一步是向原始的Activity或者Fragment报告工作请求的结果,下一个将告诉你如何通过BroadcastReceiver来实现这个功能。
 
 
 
报告工作状态
 
         本课将告诉你如何将后台服务的请求工作状态报告给发送请求的组件。这将允许你,比如报告一个窗口对象的UI更新请求状态。一般推荐使用LocalBroadcastManager来发送和接收这些状态,但这仅限于在你自己应用的各组件中广播Intent。
 
 
 
从IntentService报告状态
 
         为了在IntentService中向其他组件发送工作请求状态,首先你需要创建一个包含状态信息数据的Intent,作为了一个选项,你可以在Intent中添加一个操作或者数据URI。
 
         下一步,通过调用LocalBroadcastManager.sendBroadcast()方法来发送Intent,在你应用中发送到其它组件的Intent是注册过的。通过LocalBroadcastManager的getInstance()方法来实例化LocalBroadcastManager。
 
比如:
 
[java]  
<span style="font-size:18px">public
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,