如何写一个android服务
2013-06-08 23:14
169 查看
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
4.如何使用服务
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);
相关文章推荐
- Android 如何检测一个服务是否还在运行?
- android—如何添加一个系统服务
- Android 如何检测一个服务是否还在运行?
- xamarin android 如何创建一个服务
- 如何写一个简单的android服务
- 如何添加一个Android服务
- android大杂烩--一个应用如何读取另一个apk中的资源
- android应用如何启动另外一个apk应用
- Android开发之如何监听让服务不被杀死(service+broadcast)
- Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸(一)
- 输出Bag中的所有记录为一个只有值的json数组---精通android、IOS App应用服务程序开发
- 如何在android 开发中创建一个新的XML文件
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
- Android如何使用XML创建一个环形渐变颜色图片
- android Bitmap如何保存成为一个bmp文件
- Android面试常见问题:如何在不发一个新版本的情况下更新App布局?
- 深入理解Android音视频同步机制(五)如何从零开始写一个音视频同步的播放器
- Android如何定制一个下拉刷新,上滑加载更多的容器
- Android 自动化测试(1)如何安装和卸载一个应用(java)
- 如何把多个Android Project打包成一个APK