Service是Android系统中提供的四大组件之一。它是运行在后台的一种服务,一般声明周期较长,不直接与用户进行交互。

  服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都可以启动Service,但是它们的使用场合有所不同。
    1. 使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。
    如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。
    如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。
    采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
    2. 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
    onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。
    采用Context.bindService()方法启动服务时只能调用onUnbind()方法解除调用者与服务解除,服务结束时会调用onDestroy()方法。
 
这里我采用了第一种方法启动 startService(new Intent(this, LocalService.class));不过首先需要在AndroidManifest.xml文件中注册声明我们新建的Service,在application标签内添加 <service android:name=".LocalService" />即可。
下面是实现的方法,开启新线程,每隔一分钟从服务器获取消息,若产生消息,则在手机状态栏通知该消息。
  1. public class LocalService extends Service {
  2. private static String info = null;
  3. private String TAG = "localservice";// 定义打印信息标识
  4. private NotificationManager mNM;// 定义状态栏通知
  5. private final IBinder mBinder = new LocalBinder();// 实例化LocalBinder
  6. // public static native void getSqlInfo();
  7. public class LocalBinder extends Binder {
  8. LocalService getService() {
  9. return LocalService.this;
  10. }
  11. }
  12. public IBinder onBind(Intent intent) {
  13. Log.i(TAG, "this is onBind");
  14. return mBinder;
  15. }
  16. // 实现创建方法
  17. public void onCreate() {
  18. Log.i(TAG, "this is onCreate");
  19. mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);// 获取通知栏管理器
  20. }
  21. // 实现开始方法
  22. public int onStartCommand(Intent intent, int flags, int startId) {
  23. Log.i(TAG, "received start id" + startId + ":" + intent);
  24. // 开启线程
  25. MessageThread messageThread = new MessageThread();
  26. messageThread.start();
  27. return START_STICKY;
  28. }
  29. // 实现销毁方法
  30. public void onDestory() {
  31. Log.i(TAG, "this is onDestory");
  32. mNM.cancel("qqq", 0);
  33. }
  34. // 实现解除bind方法
  35. public boolean onUnbind(Intent intent) {
  36. Log.i(TAG, "this is onUnbind");
  37. return super.onUnbind(intent);
  38. }
  39. private void showNotification(String serverMessage) {
  40. int icon = R.drawable.icon; // 通知图标
  41. CharSequence tickerText = "local sevice has started" + serverMessage; // 状态栏显示的通知文本提示
  42. long when = System.currentTimeMillis(); // 通知产生的时间,会在通知信息里显示
  43. // 用上面的属性初始化Nofification// 实例化状态通知
  44. Notification notification = new Notification(icon, tickerText, when);
  45. PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
  46. new Intent(this, HelloPush.class), 0);// 定义通知栏单击时间触发的intent
  47. notification.defaults |= Notification.DEFAULT_SOUND;// 添加声音
  48. // notification.defaults |= Notification.DEFAULT_VIBRATE;// 添加震动
  49. notification.defaults |= Notification.DEFAULT_LIGHTS;// 添加LED灯提醒
  50. notification.flags = Notification.FLAG_AUTO_CANCEL;// 在通知栏上点击此通知后自动清除此通知
  51. notification.setLatestEventInfo(this, "Local Service", tickerText,
  52. contentIntent);// 设置该状态栏通知消息的单击事件
  53. mNM.notify("qqq", 0, notification);// 通知栏显示该通知
  54. }
  55. /**
  56. * 从服务器端获取消息
  57. *
  58. */
  59. class MessageThread extends Thread {
  60. // 运行状态,下一步骤有大用
  61. public boolean isRunning = true;
  62. @SuppressLint("SimpleDateFormat")
  63. public void run() {
  64. System.out.println("running++++++++++++++");
  65. while (isRunning) {
  66. try {
  67. // 获取服务器消息
  68. String serverMessage = getServerMessage();
  69. SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
  70. Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
  71. String str = formatter.format(curDate);
  72. System.out.println("++++++++++++" + str);// &&str=="08:00"
  73. if (serverMessage != null && !"".equals(serverMessage)
  74. // &&"15:00".equalsIgnoreCase(str)
  75. ) {
  76. showNotification(serverMessage);
  77. }
  78. // 休息1分钟
  79. System.out.println("sleeping now+++++");
  80. Thread.sleep(60000);
  81. System.out.println("sleep ended+++++");
  82. } catch (InterruptedException e) {
  83. System.out.println("thread sleep error++++");
  84. e.printStackTrace();
  85. }
  86. }
  87. }
  88. }
  89. /**
  90. * @return 返回服务器要推送的消息,否则如果为空的话,不推送
  91. */
  92. public String getServerMessage() {
  93. System.out.println("getServerMessage++++++++");
  94. info = null;
  95. // getSqlInfo();
  96. // getSql();
  97. info = connecting();
  98. System.out.println("getServerMessage+++++++" + info);
  99. return info;
  100. }
  101. // public static int ReturnInfo(final String title) {
  102. // System.out.println("ReturnInfo+++++++++" + title);
  103. // info = title;
  104. // return 1;
  105. // }
  106. //
  107. // public void getSql() {
  108. // try {
  109. // String url = "jdbc:mysql://192.168.1.104:80/test";
  110. // String user = "root";
  111. // String pwd = "";
  112. //
  113. // // 加载驱动,这一句也可写为:Class.forName("com.mysql.jdbc.Driver");
  114. // Class.forName("com.mysql.jdbc.Driver").newInstance();
  115. // // 建立到MySQL的连接
  116. // Connection conn = DriverManager.getConnection(url, user, pwd);
  117. //
  118. // // 执行SQL语句
  119. // java.sql.Statement stmt = conn.createStatement();// 创建语句对象,用以执行sql语言
  120. // ResultSet rs = stmt.executeQuery("select * from push where id = 1");
  121. //
  122. // // 处理结果集
  123. // while (rs.next()) {
  124. // String name = rs.getString("name");
  125. // info = name;
  126. // System.out.println(name);
  127. // }
  128. // rs.close();// 关闭数据库
  129. // conn.close();
  130. // } catch (Exception ex) {
  131. // System.out.println("Error : " + ex.toString());
  132. // }
  133. // }
  134. public String connecting() {
  135. /* 存放http请求得到的结果 */
  136. String result = "";
  137. // String ss = null;
  138. String name = null;
  139. /* 将要发送的数据封包 */
  140. ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
  141. nameValuePairs.add(new BasicNameValuePair("id", "1"));
  142. InputStream is = null;
  143. // http post
  144. try {
  145. /* 创建一个HttpClient的一个对象 */
  146. HttpClient httpclient = new DefaultHttpClient();
  147. /* 创建一个HttpPost的对象 */
  148. HttpPost httppost = new HttpPost(
  149. "http://192.168.1.104:80/ying/yy.php");
  150. /* 设置请求的数据 */
  151. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
  152. /* 创建HttpResponse对象 */
  153. HttpResponse response = httpclient.execute(httppost);
  154. /* 获取这次回应的消息实体 */
  155. HttpEntity entity = response.getEntity();
  156. /* 创建一个指向对象实体的数据流 */
  157. is = entity.getContent();
  158. } catch (Exception e) {
  159. System.out.println("Connectiong Error");
  160. }
  161. // convert response to string
  162. try {
  163. BufferedReader reader = new BufferedReader(new InputStreamReader(
  164. is, "iso-8859-1"), 8);
  165. StringBuilder sb = new StringBuilder();
  166. String line = null;
  167. while ((line = reader.readLine()) != null) {
  168. sb.append(line + "/n");
  169. }
  170. is.close();
  171. result = sb.toString();
  172. System.out.println("get = " + result);
  173. } catch (Exception e) {
  174. System.out.println("Error converting to String");
  175. }
  176. // parse json data
  177. try {
  178. /* 从字符串result创建一个JSONArray对象 */
  179. JSONArray jArray = new JSONArray(result);
  180. for (int i = 0; i < jArray.length(); i++) {
  181. JSONObject json_data = jArray.getJSONObject(i);
  182. System.out.println("Success");
  183. System.out.println("result " + json_data.toString());
  184. // ct_id=json_data.getInt("id");
  185. name = json_data.getString("name");
  186. // if (i == 0) {
  187. // ss = json_data.toString();
  188. // } else {
  189. // ss += json_data.toString();
  190. // }
  191. }
  192. } catch (JSONException e) {
  193. System.out.println("Error parsing json");
  194. }
  195. return name;
  196. }
  197. }

下面是php代码

  1. <?php
  2. require_once("conn.php");
  3. session_start();
  4. $q=mysql_query("SELECT name FROM push WHERE id='".$_REQUEST['id']."'");
  5. while($e=mysql_fetch_assoc($q))
  6. $output[]=$e;
  7. print(json_encode($output));
  8. mysql_close();
  9. ?>

Android Service服务-(转)的更多相关文章

  1. Android Service 服务(三)—— bindService与remoteService

    (转自:http://blog.csdn.net/ithomer/article/details/7366396)   一.bindService简介 bindService是绑定Service服务, ...

  2. Android Service 服务

    一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activi ...

  3. Android Service 服务(一)—— Service .

    http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Activit ...

  4. [Android] Service服务详解以及如何使service服务不被杀死

    排版上的细节有些不好看,主要是我用的MarkDown编辑器预览和这里的不一样,在那个上面的样式很舒服.这里要改的地方太多就不想改了,将就看吧.下次写的时候注意.还有看到错误给我提啊. 本文链接:htt ...

  5. android service服务的学习

    1.Service简单概述   Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件.服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即 ...

  6. Android Service 服务(二)—— BroadcastReceiver

    (转自:http://blog.csdn.net/ithomer/article/details/7365147) 一. BroadcastReceiver简介 BroadcastReceiver,用 ...

  7. Android Service服务

    Service是Android系统中提供的四大组件之一.它是运行在后台的一种服务,一般声明周期较长,不直接与用户进行交互.    服务不能自己运行,需要通过调用Context.startService ...

  8. Android service 服务的应用之电话监听器以及短信监听器

    首先建立一个项目工程文件,如下图所示:

  9. Android Service服务的生命周期

    与activity类似,服务也存在生命周期回调方法,你可以实现这些方法来监控服务的状态变化,并在适当的时机执行一些操作. 以下代码提纲展示了服务的每个生命周期回调方法: public class Ex ...

  10. Android -- service 服务的创建与使用,生命周期,电话监控器

    1. 为什么使用service 应用程序 : 一组组件(activity  service provider receiver)的集合. 一般情况 一个应用程序 会对应一个进程. 一般情况 关闭掉应用 ...

随机推荐

  1. ndarray数组自动创建

    为了实现某些运算,需要快速构造符合要求的大数组 Numpy函数生成的数组,如不指定类类型,几乎全为浮点型(arange除外,它是整形),因为科学计算中测量值,例如温度.长度,都是浮点数 import ...

  2. k8s集群介绍

    Kubernetes集群组件 一个典型的Kubernetes集群由多个工作节点和一个集群控制节点,以及一个集群状态存储系统etcd组成.其中Master节点负责整个集群管理工作,为集群提供管理接口,并 ...

  3. Asp.Net Core 进阶(一) —— 读取appsettings.json

    我们以前在Asp.Net MVC中使用 System.Configuration.ConfigurationManager 来读取web.config文件.但是Asp.Net Core MVC已经没有 ...

  4. 解决IllegalBlockSizeException:last block incomplete in decryption异常

    解决IllegalBlockSizeException:last block incomplete in decryption异常分类: webkit android最近做个加解密的实现,虽然实现了, ...

  5. python基础面试题整理---从零开始 每天十题(02)

    书接上回,我们继续来说说python的面试题,我在各个网站搜集了一些,我给予你们一个推荐的答案,你们可以组织成自己的语言来说出来,让我们更好的做到面向工资编程 一.Q:说说你对zen of pytho ...

  6. BXS入门赛部分writeup

    pwn1  盲打(笑) 前言:没有听鱼哥的话,事先没有装好环境,于是开始没做出来,然后全程在装pwntools,经过一番努力,失败了0.0 最终在网上搜了一段python socket连接脚本,终于可 ...

  7. Lucene原理与代码分析

    http://www.cnblogs.com/forfuture1978/category/300665.html

  8. grep-sed命令用法:

    用户切换 su username:非登录式切换 su - username:登录式切换 su -l username:登录式切换 su username -c COMMAND   echo -n   ...

  9. 51nod 1135 原根 (数论)

    题目链接 建议与上一篇欧拉函数介绍结合食用. 知识点:1.阶:a和模m互质,使a^d≡1(mod m)成立的最小正整数d称为a对模m的阶(指数)   例如: 2^2≡1(mod3),2对模3的阶为2; ...

  10. UVa-1368-DNA序列

    这题的话,我们每次统计的话,是以列为外层循环,以行为内层循环,逐一按列进行比较. 统计完了之后,题目中要求说到要hamming值最小的,那我们就选用该列最多的字母就可以了,如果有数目相等的字母,那就按 ...