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
/** * @author scott * */public class MyService extends Service { private final static String TAG = "MyService"; private NotificationManager notificationMgr; private boolean canRun =true; private String retString = null; //用于和外界交互 private final IBinder binder = new MyBinder(); public class MyBinder extends Binder { MyService getService() { return MyService.this; } } @Override public void onCreate() { Thread thr = new Thread(null, new ServiceWorker(), "BackgroundSercie"); thr.start(); super.onCreate(); } @Override public IBinder onBind(Intent intent) { Log.d(TAG, String.format("on bind,intent = %s", intent.toString())); notificationMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); displayNotificationMessage("服务已启动"); return binder; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d(TAG, "start action="+intent.getAction()); notificationMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); displayNotificationMessage("服务已启动", true); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { stopForeground(true); canRun = false; super.onDestroy(); } public String getImage(String url) { return "19"; } public String getRetString() { return retString; } //loginValidate 为service提供给外部调用的函数 public boolean loginValidate(String userName, String password) throws Exception { String uriString = "http://www.renyugang.cn/blog/admin/admin_check.jsp"; boolean ret = false; Log.d("scott", "enter myservice start loginvalidate"); try { DefaultHttpClient httpClient = new DefaultHttpClient(); HttpResponse response; HttpPost httpPost = new HttpPost(uriString); List<NameValuePair> nvps = new ArrayList<NameValuePair>(); nvps.add(new BasicNameValuePair("name", userName)); nvps.add(new BasicNameValuePair("password", password)); httpPost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); retString = EntityUtils.toString(entity); retString = str_Filter(retString); if (response.getStatusLine().getStatusCode() == 200) { if(retString.equals("") == false) { if (retString.startsWith("用户名") == true) { ret = false; } else { ret = true; } Log.d("retcontent", retString); Log.d("info", userName+password); Log.d("ret", ""+ret); } } } catch (Exception e) { throw e; } return ret; } public String str_Filter(String strSource) { String strPattern = "(?i)(\r\n|\r|\n|\n\r)"; strSource.trim(); Pattern p = Pattern.compile(strPattern); Matcher m = p.matcher(strSource); if (m.find()) { strSource = strSource.replaceAll("(\r\n|\r|\n|\n\r)", ""); } return strSource; } //为服务设置图标和文字描述 private void displayNotificationMessage(String message, boolean isForeground) { Notification notification = new Notification(R.drawable.icon, message, System.currentTimeMillis()); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MyActivity.class), 0); notification.setLatestEventInfo(this, "My Service", message, contentIntent); MyService.this.startForeground(R.id.app_notification_id, notification); } private void displayNotificationMessage(String message) { Notification notification = new Notification(R.drawable.icon, message, System.currentTimeMillis()); PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, MyActivity.class), 0); notification.setLatestEventInfo(this, "我的通知", message, contentIntent); notificationMgr.notify(R.id.app_notification_id + 1, notification); } //ServiceWorker service自身的线程,用于做自己的事情,这里为了表示服务的确在运行,每2秒打印一次log信息。 class ServiceWorker implements Runnable { int counter = 0; @Override public void run() { // do background processing here..... while(canRun) { Log.d("scott", ""+counter); counter ++; try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
4.如何使用服务
private MyService mMyService;private ServiceConnection mServiceConnection = new ServiceConnection(){ @Override public void onServiceDisconnected(ComponentName name) { // TODO Auto-generated method stub } @Override public void onServiceConnected(ComponentName name, IBinder service) { // bindService成功的时候返回service的引用 MyBinder myBinder = (MyBinder)service; mMyService = myBinder.getService(); }}//启动服务Intent intentService = new Intent(MyActivity.this, MyService.class);intentService.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intentService.setAction("scott");//bindService用于和service进行交互MyActivity.this.bindService(intentService, mServiceConnection, BIND_AUTO_CREATE);//startService用于启动service但是不和其交互startService(intentService);