如何写一个简单的android服务

1.android服务简介

android服务的分类还是蛮多的,网上有现成的博客讲解的很好,我就不重复了,连接如下:

http://www.cnblogs.com/newcj/archive/2011/05/30/2061370.html

本文主要介绍一种常见的服务:通知栏有图标和文字的服务,既可以做自己的事情,也可以供其他activity调用,专业术语描述为 前台服务(可startService也可以bindService)


2.原理和流程

  • 要创建前台服务,我们只需要提供一个通知栏图标并且调用startForeground即可
  • 要让服务自己做自己的事情,很简单,在onCreate或者onStartCommand的时候起一个Thread即可
  • 想要和服务通信、调用服务提供的函数,只需要在onBind的时候返回一个IBinder对象,通过IBinder对象可以获取当前Service对象的引用,有了引用就可以调用服务提供的函数了。
  • 最后一条,服务要在xml里面配置        
    <service android:name="com.scott.sayhi.MyService" >
    </service>

3.MyService.java

[java]  view plain copy
  1. /** 
  2.  * @author scott 
  3.  * 
  4.  */  
  5. public class MyService extends Service   
  6. {  
  7.     private final static String TAG = "MyService";  
  8.     private NotificationManager notificationMgr;     
  9.     private boolean canRun =true;  
  10.     private String retString = null;  
  11.     //用于和外界交互  
  12.     private final IBinder binder = new MyBinder();  
  13.   
  14.     public class MyBinder extends Binder  
  15.     {  
  16.         MyService getService()  
  17.         {  
  18.             return MyService.this;  
  19.         }  
  20.     }  
  21.   
  22.     @Override  
  23.     public void onCreate()  
  24.     {  
  25.         Thread thr = new Thread(nullnew ServiceWorker(), "BackgroundSercie");     
  26.         thr.start();    
  27.         super.onCreate();  
  28.     }  
  29.       
  30.     @Override  
  31.     public IBinder onBind(Intent intent)  
  32.     {  
  33.         Log.d(TAG, String.format("on bind,intent = %s", intent.toString()));  
  34.         notificationMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);     
  35.         displayNotificationMessage("服务已启动");     
  36.   
  37.         return binder;  
  38.     }  
  39.       
  40.     @Override  
  41.     public int onStartCommand(Intent intent, int flags, int startId)  
  42.     {  
  43.         Log.d(TAG, "start action="+intent.getAction());  
  44.         notificationMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);     
  45.         displayNotificationMessage("服务已启动"true);     
  46.         return super.onStartCommand(intent, flags, startId);  
  47.     }  
  48.   
  49.     @Override  
  50.     public void onDestroy()  
  51.     {  
  52.         stopForeground(true);  
  53.         canRun = false;  
  54.         super.onDestroy();  
  55.     }  
  56.   
  57.     public String getImage(String url)  
  58.     {  
  59.         return "19";  
  60.     }  
  61.   
  62.     public String getRetString()  
  63.     {  
  64.         return retString;  
  65.     }  
  66.     //loginValidate 为service提供给外部调用的函数  
  67.     public boolean loginValidate(String userName, String password) throws Exception  
  68.     {  
  69.         String uriString = "http://www.renyugang.cn/blog/admin/admin_check.jsp";  
  70.         boolean ret = false;  
  71.         Log.d("scott""enter myservice start loginvalidate");  
  72.         try  
  73.         {  
  74.             DefaultHttpClient httpClient = new DefaultHttpClient();  
  75.             HttpResponse response;  
  76.             HttpPost httpPost = new HttpPost(uriString);  
  77.             List<NameValuePair> nvps = new ArrayList<NameValuePair>();  
  78.             nvps.add(new BasicNameValuePair("name", userName));  
  79.             nvps.add(new BasicNameValuePair("password", password));  
  80.   
  81.             httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));  
  82.             response = httpClient.execute(httpPost);  
  83.             HttpEntity entity = response.getEntity();  
  84.             retString = EntityUtils.toString(entity);  
  85.             retString = str_Filter(retString);  
  86.   
  87.             if (response.getStatusLine().getStatusCode() == 200)  
  88.             {  
  89.                 if(retString.equals("") == false)  
  90.                 {  
  91.                     if (retString.startsWith("用户名") == true)  
  92.                     {  
  93.                         ret = false;  
  94.                     }  
  95.                     else  
  96.                     {  
  97.                         ret = true;  
  98.                     }  
  99.                     Log.d("retcontent", retString);  
  100.                     Log.d("info", userName+password);  
  101.                     Log.d("ret"""+ret);  
  102.                 }  
  103.   
  104.             }  
  105.         }   
  106.         catch (Exception e)  
  107.         {  
  108.             throw e;  
  109.         }  
  110.         return ret;  
  111.     }  
  112.   
  113.     public String str_Filter(String strSource)  
  114.     {  
  115.         String strPattern = "(?i)(\r\n|\r|\n|\n\r)";  
  116.         strSource.trim();  
  117.         Pattern p = Pattern.compile(strPattern);  
  118.         Matcher m = p.matcher(strSource);  
  119.         if (m.find())   
  120.         {  
  121.             strSource = strSource.replaceAll("(\r\n|\r|\n|\n\r)""");  
  122.         }  
  123.         return strSource;  
  124.     }  
  125.     //为服务设置图标和文字描述  
  126.     private void displayNotificationMessage(String message, boolean isForeground)  
  127.     {     
  128.         Notification notification = new Notification(R.drawable.icon, message,     
  129.                 System.currentTimeMillis());     
  130.         PendingIntent contentIntent = PendingIntent.getActivity(this0,     
  131.                 new Intent(this, MyActivity.class), 0);     
  132.         notification.setLatestEventInfo(this"My Service", message,     
  133.                 contentIntent);     
  134.         MyService.this.startForeground(R.id.app_notification_id, notification);  
  135.     }     
  136.       
  137.     private void displayNotificationMessage(String message)  
  138.     {     
  139.         Notification notification = new Notification(R.drawable.icon, message,     
  140.                 System.currentTimeMillis());     
  141.         PendingIntent contentIntent = PendingIntent.getActivity(this0,     
  142.                 new Intent(this, MyActivity.class), 0);     
  143.         notification.setLatestEventInfo(this"我的通知", message,     
  144.                 contentIntent);     
  145.         notificationMgr.notify(R.id.app_notification_id + 1, notification);    
  146.     }     
  147.     //ServiceWorker service自身的线程,用于做自己的事情,这里为了表示服务的确在运行,每2秒打印一次log信息。  
  148.     class ServiceWorker implements Runnable  
  149.     {   
  150.         int counter = 0;  
  151.         @Override    
  152.         public void run()   
  153.         {     
  154.             // do background processing here.....     
  155.             while(canRun)  
  156.             {  
  157.                 Log.d("scott"""+counter);  
  158.                 counter ++;  
  159.                 try  
  160.                 {  
  161.                     Thread.sleep(2000);  
  162.                 }   
  163.                 catch (InterruptedException e)   
  164.                 {  
  165.                     e.printStackTrace();  
  166.                 }  
  167.             }  
  168.         }     
  169.     }     
  170.       
  171. }  

4.如何使用服务

[java]  view plain copy
  1. private MyService mMyService;  
  2. private ServiceConnection mServiceConnection = new ServiceConnection()  
  3. {  
  4.     @Override  
  5.     public void onServiceDisconnected(ComponentName name)  
  6.     {  
  7.         // TODO Auto-generated method stub  
  8.     }  
  9.   
  10.     @Override  
  11.     public void onServiceConnected(ComponentName name, IBinder service)   
  12.     {  
  13.         // bindService成功的时候返回service的引用  
  14.         MyBinder myBinder = (MyBinder)service;  
  15.         mMyService = myBinder.getService();  
  16.     }  
  17. }  
  18. //启动服务  
  19. Intent intentService = new Intent(MyActivity.this, MyService.class);  
  20. intentService.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  21. intentService.setAction("scott");  
  22. //bindService用于和service进行交互  
  23. MyActivity.this.bindService(intentService, mServiceConnection, BIND_AUTO_CREATE);  
  24. //startService用于启动service但是不和其交互  
  25. startService(intentService);  

你可能感兴趣的:(如何写一个简单的android服务)