time 
设为首页】【收藏本站
当前位置: 主页 > 电脑网络 > 操作系统 > 嵌入式 > Android > Android应用开发入门(四十七)Service组件使用注意及高级应用

Android应用开发入门(四十七)Service组件使用注意及高级应用

时间:2013-11-14 14:46 点击:1804次 字体:[ ]




前言

  上一篇讲解了一下Android下Service组件的基本使用,对Service组件还不了解的朋友可以先去看看上一篇。这篇讲解一下Service组件的一些需要注意的地方以及高级的应用,并用几个例子讲解一下本文中提到的功能,最后依然会提供示例源码下载。

  既然是深入讲解Service。

  1. IntentService的使用
  2. Service与Thread的区别
  3. Service生命周期详解
  4. 前台服务
  5. 服务资源被系统意外回收处理办法 
  6. 不被销毁的服务

IntentService

  对于Service而言,它依然是运行在主线程之上,所以一些无法在主线程上完成的功能,依然需要另外开启工作线程来完成,并且一些耗时操作,如果直接放在Service的主线程中完成的话,会影响设备的运行流畅度。对于这样的问题,有两种解决方案,一种是在Service主线程中额外开启一条工作线程,如何开启工作线程的方法在以前的博客中已经介绍过了,这里不再重复介绍;另外一个方法就是使用IntentService这个父类来实现Service业务类,这里着重讲解这个IntentService。

  IntentService是一个服务基类,直接继承于Service,在需要的时候通过异步调用的方式处理请求。要使用IntentService启动一个服务进行异步调用,需要实现它的一个抽象方法:onHandleIntent(Intent intent),在这个方法里,可以获得访问这传来的Intent对象,并在其中进行异步操作的实现。对于IntentService而言,因为其继承自Service类,所以其他的Service的声明周期方法在此类中也适用,访问者可以通过调用Context.startService(Intent intent)方法来启动这个服务。

  使用IntentService作为服务基类,在其内部其实也是重新开启了一条线程来完成操作,只是这里使用IntentService进行了封装,并且它自己管理服务的结束。使用IntentService的服务类,在执行结束后执行结束,无需人为的结束它,比较适用于一些无需管理,但是又比较耗时的操作!

 

IntentService-Demo

  下面通过一个小示例演示IntentService的操作,在这个示例中,下载一张网络上的图片,保存在设备的本地目录下。其中涉及到的本地存储和访问网络下载图片的内容,如果你不了解的朋友,可以查看另外两篇:http://www.fengfly.com/plus/view-213506-1.htmlhttp://www.fengfly.com/plus/view-213371-1.html

  IntentSer.java:

 

  1. package cn.bgxt.servicedemohigh;  
  2.  
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.net.MalformedURLException;  
  8. import java.net.URL;  
  9.  
  10. import android.app.IntentService;  
  11. import android.content.Intent;  
  12. import android.util.Log;  
  13. import android.widget.Toast;  
  14.  
  15. public class IntentSer extends IntentService {  
  16.     private final static String TAG = "main";  
  17.     private String url_path="http://ww2.sinaimg.cn/bmiddle/9dc6852bjw1e8gk397jt9j20c8085dg6.jpg";  
  18.     public IntentSer() {  
  19.         super("IntentSer");  
  20.     }  
  21.     @Override 
  22.     public void onCreate() {  
  23.         Log.i(TAG, "Service is Created");  
  24.         super.onCreate();  
  25.     }  
  26.       
  27.     @Override 
  28.     public int onStartCommand(Intent intent, int flags, int startId) {  
  29.         Log.i(TAG, "Service is started");  
  30.         return super.onStartCommand(intent, flags, startId);  
  31.     }  
  32.       
  33.     @Override 
  34.     public void onDestroy() {  
  35.         Log.i(TAG, "Service is Destroyed");  
  36.         super.onDestroy();  
  37.     }  
  38.     @Override 
  39.     protected void onHandleIntent(Intent intent) {  
  40.         Log.i(TAG, "HandleIntent is execute");  
  41.         try {  
  42.             // 在设备应用目录下创建一个文件  
  43.             File file=new File(this.getFilesDir(), "weibo.jpg");  
  44.             FileOutputStream fos=new FileOutputStream(file);          
  45.             // 获取网络图片的输入流  
  46.             InputStream inputStream = new URL(url_path).openStream();  
  47.             // 把网络图片输入流写入文件的输出流中  
  48.             byte[] date=new byte[1024];  
  49.             int len=-1;  
  50.             while((len=inputStream.read(date))!=-1){  
  51.                 fos.write(date, 0, len);  
  52.             }  
  53.               
  54.             fos.close();  
  55.             inputStream.close();      
  56.             Log.i(TAG, "The file download is complete");  
  57.         } catch (MalformedURLException e) {  
  58.             e.printStackTrace();  
  59.         } catch (IOException e) {  
  60.             e.printStackTrace();  
  61.         }  
  62.     }  

 编写好服务类,仅需要适用一个Android组件即可启动服务,这里使用一个Activity中来启动服务,下面是主要代码。

  1. btnDownload=(Button)findViewById(R.id.btnDownload);  
  2.         btnDownload.setOnClickListener(new View.OnClickListener() {  
  3.               
  4.             @Override 
  5.             public void onClick(View v) {  
  6.                 // TODO Auto-generated method stub  
  7.                 Intent service=new Intent(MainActivity.this,IntentSer.class);  
  8.                 startService(service);  
  9.             }  
  10.         }); 

 执行结果均写入日志中,可以通过LoaCat查看。

Android应用开发入门(四十七)Service组件使用注意及高级应用_www.fengfly.com 

  下载完成后,可以在应用的安装目录下/files下看到下载的weibo.jpg文件。

 Android应用开发入门(四十七)Service组件使用注意及高级应用_www.fengfly.com



本文地址 : http://www.fengfly.com/plus/view-214082-1.html
标签: Android Service 应用开发
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
验证码: